

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Chiffrement côté client Amazon S3 dans la AWS SDK pour PHP version 3
<a name="s3-encryption-client"></a>

Avec le chiffrement côté client, les données sont chiffrées et déchiffrées directement dans votre environnement. Cela signifie que ces données sont chiffrées avant d'être transférées vers Amazon S3 et que vous ne comptez pas sur un service externe pour gérer le chiffrement à votre place. Pour les nouvelles implémentations, nous suggérons d'utiliser `S3EncryptionClientV3` et de `S3EncryptionMultipartUploaderV3` remplacer le `S3EncryptionClientV2` `S3EncryptionMultipartUploaderV2` et le obsolète `S3EncryptionClient` et. `S3EncryptionMultipartUploader` Il est recommandé que les anciennes implémentations utilisant toujours les versions obsolètes tentent de migrer. `S3EncryptionClientV3`maintient le support pour le déchiffrement des données chiffrées à l'aide de l'ancienne version. `S3EncryptionClient`

 AWS SDK pour PHP implémente le [chiffrement des enveloppes](https://docs.aws.amazon.com/kms/latest/developerguide/workflow.html) et utilise [OpenSSL](https://www.openssl.org/) pour le chiffrement et le déchiffrement. L'implémentation est interopérable avec [d'autres SDKs qui correspondent à ses fonctionnalités prises en charge](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html). Elle est également compatible avec [le kit SDK du flux de travail asynchrone basé sur les promesses](guide_promises.md).

## Guide de migration
<a name="migration-guide"></a>

[Pour ceux qui essaient de migrer des clients obsolètes vers les nouveaux clients, il existe un guide de migration pour migrer de la v1 vers la v2 [ici](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v1-v2-section.html) et un guide de migration pour passer de la v2 à la v3 ici.](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v2-v3-section.html)

## Configuration
<a name="setup"></a>

Pour démarrer avec le chiffrement côté client, vous avez besoin des éléments suivants :
+ Une [cléAWS KMS de chiffrement](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ [Compartiment S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) 

Avant d'exécuter un exemple de code, configurez vos AWS informations d'identification. Voir [Informations d'identification pour la AWS SDK pour PHP version 3](guide_credentials.md).

## Chiffrement
<a name="encryption"></a>

Le chargement d'un objet chiffré `S3EncryptionClientV3` nécessite quatre paramètres supplémentaires en plus des `PutObject` paramètres standard :
+  `'@KmsEncryptionContext'`est une paire clé-valeur qui peut être utilisée pour ajouter une couche de sécurité supplémentaire à votre objet chiffré. Le client de chiffrement doit transmettre la même clé, ce qu'il fera automatiquement lors d'un appel get. Si aucun contexte supplémentaire n'est souhaité, transmettez un tableau vide.
+  `@CipherOptions`sont des configurations supplémentaires pour le chiffrement, notamment le chiffrement à utiliser et la taille de la clé.
+  `@MaterialsProvider`est un fournisseur qui gère la génération d'une clé de chiffrement et d'un vecteur d'initialisation, ainsi que le chiffrement de votre clé de chiffrement.
+  `@CommitmentPolicy`est une option politique qui dicte la manière dont un objet est lu, soit avec un engagement clé, soit sans engagement clé, et comment un objet est écrit avec un engagement clé ou sans engagement clé.

```
use Aws\S3\S3Client;
use Aws\S3\Crypto\S3EncryptionClientV3;
use Aws\Kms\KmsClient;
use Aws\Crypto\KmsMaterialsProviderV3;

 // Let's construct our S3EncryptionClient using an S3Client
 $encryptionClient = new S3EncryptionClientV3(
     new S3Client([
         'profile' => 'default',
         'region' => 'us-east-1',
         'version' => 'latest',
     ])
 );

 $kmsKeyId = 'kms-key-id';
 $materialsProvider = new KmsMaterialsProviderV3(
     new KmsClient([
         'profile' => 'default',
         'region' => 'us-east-1',
         'version' => 'latest',
     ]),
     $kmsKeyId
 );

 $bucket = 'the-bucket-name';
 $key = 'the-file-name';
 $cipherOptions = [
     'Cipher' => 'gcm',
     'KeySize' => 256,
     // Additional configuration options
 ];

 $result = $encryptionClient->putObject([
     '@MaterialsProvider' => $materialsProvider,
     '@CipherOptions' => $cipherOptions,
     '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
     '@KmsEncryptionContext' => ['context-key' => 'context-value'],
     'Bucket' => $bucket,
     'Key' => $key,
     'Body' => fopen('file-to-encrypt.txt', 'r'),
 ]);
```

**Note**  
Outre Amazon S3 et les erreurs de service AWS KMS basées sur Amazon, vous pouvez recevoir des `InvalidArgumentException` objets renvoyés si vous n'`'@CipherOptions'`êtes pas correctement configuré.

## Déchiffrement
<a name="decryption"></a>

Le téléchargement et le déchiffrement d'un objet comportent cinq paramètres supplémentaires, dont deux sont obligatoires, en plus des paramètres standard. `GetObject` Le client détectera les options de chiffrement de base pour vous.
+   
** `'@SecurityProfile'`: si le paramètre est défini sur « V3 », seuls les objets chiffrés sont compatibles avec la version V3**  
le format peut être déchiffré. La définition de ce paramètre sur « V3\$1AND\$1LEGACY » permet également de déchiffrer les objets chiffrés dans un format compatible avec la version 1. Pour prendre en charge la migration, définissez @ sur « SecurityProfile V3\$1AND\$1LEGACY ». Utilisez « V3 » uniquement pour le développement de nouvelles applications.
+   
** `'@MaterialsProvider'`est un fournisseur qui gère la génération d'une clé de chiffrement et d'un vecteur d'initialisation, comme**  
ainsi que le chiffrement de votre clé de chiffrement.
+   
** `'@KmsAllowDecryptWithAnyCmk'`: (facultatif) La définition de ce paramètre sur true active le déchiffrement**  
sans fournir d'identifiant de clé KMS au constructeur du MaterialsProvider. La valeur par défaut est false.
+   
** `'@CipherOptions'`(facultatif) sont des configurations supplémentaires pour le chiffrement, notamment lesquelles**  
chiffrement à utiliser et taille de clé.
+   
** `@CommitmentPolicy`option de politique qui dicte la façon dont un objet est lu soit avec **  
engagement clé ou sans engagement clé et comment un objet est écrit avec ou sans engagement clé.

```
$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => true,
    '@SecurityProfile' => 'V2_AND_LEGACY',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT',
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

**Note**  
Outre Amazon S3 et les erreurs de service AWS KMS basées sur Amazon, vous pouvez recevoir des `InvalidArgumentException` objets renvoyés si vous n'`'@CipherOptions'`êtes pas correctement configuré.

## Configuration du chiffrement
<a name="cipher-configuration"></a>

** `'Cipher'` (chaîne)**  
Méthode de chiffrement que le client de chiffrement utilise lors du chiffrement. Seul « gcm » est pris en charge pour le moment.

**Important**  
PHP est [mis à jour dans la version 7.1](http://php.net/manual/en/migration71.new-features.php) pour inclure les paramètres supplémentaires nécessaires pour [chiffrer](http://php.net/manual/en/function.openssl-encrypt.php) et [déchiffrer ](http://php.net/manual/en/function.openssl-decrypt.php) à l’aide d’OpenSSL pour le chiffrement GCM. Pour les versions 7.0 et antérieures de PHP, un polyfill pour le support GCM est fourni et utilisé par les clients `S3EncryptionClientV2` de chiffrement et. `S3EncryptionMultipartUploaderV2` Cependant, les performances pour les entrées volumineuses seront beaucoup plus lentes en utilisant le polyfill qu'en utilisant l'implémentation native de PHP 7.1\$1. Il peut donc être nécessaire de mettre à niveau les environnements des anciennes versions de PHP pour les utiliser efficacement.

** `'KeySize'` (int)**  
Longueur de la clé de chiffrement de contenu à générer pour le chiffrement. Valeur par défaut : 256 bits. Les options de configuration valides sont 256 bits.

** `'Aad'` (chaîne)**  
« Données d'authentification supplémentaires » facultatives à inclure à votre charge utile chiffrée. Ces informations sont validées sur déchiffrement. `Aad` est disponible uniquement lorsque vous utilisez le chiffrement « gcm ».

**Important**  
Les données d'authentification supplémentaires ne sont pas prises en charge par tous AWS SDKs et il est donc possible que d'autres ne SDKs soient pas en mesure de déchiffrer les fichiers chiffrés à l'aide de ce paramètre.

## Stratégies de métadonnées
<a name="metadata-strategies"></a>

Vous avez également la possibilité de fournir une instance d'une classe qui implémente `Aws\Crypto\MetadataStrategyInterface`. Cette interface simple gère l'enregistrement et le chargement de `Aws\Crypto\MetadataEnvelope` qui contient vos supports de chiffrement d'enveloppe. Le kit SDK fournit deux classes qui implémentent ceci : `Aws\S3\Crypto\HeadersMetadataStrategy` et `Aws\S3\Crypto\InstructionFileMetadataStrategy`. `HeadersMetadataStrategy` est utilisé par défaut.

```
$strategy = new InstructionFileMetadataStrategy(
    $s3Client
);

$encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@MetadataStrategy' => $strategy,
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@KmsEncryptionContext' => [],
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);

$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => false,
    '@MaterialsProvider' => $materialsProvider,
    '@SecurityProfile' => 'V3',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@MetadataStrategy' => $strategy,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

Les constantes de nom de classe `HeadersMetadataStrategy` et `InstructionFileMetadataStrategy` peuvent également être fournies en appelant *::class*.

```
$result = $encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@MetadataStrategy' => HeadersMetadataStrategy::class,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);
```

**Note**  
En cas d'échec après chargement d'un fichier d'instructions, il ne sera pas automatiquement supprimé.

## Chargements partitionnés
<a name="multipart-uploads"></a>

Il est également possible d'exécuter un chargement partitionné avec un chiffrement côté client. `Aws\S3\Crypto\S3EncryptionMultipartUploaderV3`prépare le flux source pour le chiffrement avant le téléchargement. Sa création s'appuie sur une expérience similaire à l'utilisation de `Aws\S3\MultipartUploader` et de `Aws\S3\Crypto\S3EncryptionClientV3`. `S3EncryptionMultipartUploaderV3` peut traiter la même option `'@MetadataStrategy'` que `S3EncryptionClientV3`, ainsi que toutes les configurations `'@CipherOptions'` disponibles.

```
$kmsKeyId = 'kms-key-id';
$materialsProvider = new KmsMaterialsProviderV3(
    new KmsClient([
        'region' => 'us-east-1',
        'version' => 'latest',
        'profile' => 'default',
    ]),
    $kmsKeyId
);

$bucket = 'the-bucket-name';
$key = 'the-upload-key';
$cipherOptions = [
    'Cipher' => 'gcm'
    'KeySize' => 256,
    // Additional configuration options
];

$multipartUploader = new S3EncryptionMultipartUploaderV3(
    new S3Client([
        'region' => 'us-east-1',
        'version' => 'latest',
        'profile' => 'default',
    ]),
    fopen('large-file-to-encrypt.txt', 'r'),
    [
        '@MaterialsProvider' => $materialsProvider,
        '@CipherOptions' => $cipherOptions,
        '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
        'bucket' => $bucket,
        'key' => $key,
    ]
);
$multipartUploader->upload();
```

**Note**  
Outre Amazon S3 et les erreurs de service AWS KMS basées sur Amazon, vous pouvez recevoir des `InvalidArgumentException` objets renvoyés si vous n'`'@CipherOptions'`êtes pas correctement configuré.