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 avec la AWS SDK for PHP version 3
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 S3EncryptionClientV2
et de remplacer S3EncryptionMultipartUploaderV2
le obsolète S3EncryptionClient
et. S3EncryptionMultipartUploader
Il est recommandé que les anciennes implémentations utilisant toujours les versions obsolètes tentent de migrer. S3EncryptionClientV2
maintient le support pour le déchiffrement des données chiffrées à l'aide de l'ancienne version. S3EncryptionClient
Le kit AWS SDK for PHP implémente le chiffrement d’enveloppe et utilise OpenSSL
Guide de migration
Installation
Pour démarrer avec le chiffrement côté client, vous avez besoin des éléments suivants :
Avant d'exécuter un exemple de code, configurez vos AWS informations d'identification. Voir Informations d'identification pour la AWS SDK for PHP version 3.
Chiffrement
Le chargement d'un objet chiffré S3EncryptionClientV2
nécessite trois 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.
use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV2; // Let's construct our S3EncryptionClient using an S3Client $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( 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, '@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
Le téléchargement et le déchiffrement d'un objet comportent quatre 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 « V2 », seuls les objets chiffrés en version compatible avec la version v2 -
le format peut être déchiffré. La définition de ce paramètre sur « V2_AND_LEGACY » 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 V2_AND_LEGACY ». Utilisez « V2 » 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, y compris lesquelles -
chiffrement à utiliser et taille de clé.
-
$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@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
-
'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.1S3EncryptionClientV2
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+. 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 et 128 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 les AWS SDK et, par conséquent, les autres SDK peuvent ne pas être en mesure de déchiffrer les fichiers chiffrés à l'aide de ce paramètre.
Stratégies de métadonnées
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, '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V2', '@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, '@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é.
Téléchargements en plusieurs parties
Il est également possible d'exécuter un chargement partitionné avec un chiffrement côté client. Aws\S3\Crypto\S3EncryptionMultipartUploaderV2
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\S3EncryptionClientV2
. S3EncryptionMultipartUploaderV2
peut traiter la même option '@MetadataStrategy'
que S3EncryptionClientV2
, ainsi que toutes les configurations '@CipherOptions'
disponibles.
$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( 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 S3EncryptionMultipartUploaderV2( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '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é.