Cifrado del lado del cliente de Amazon S3 con elAWS SDK for PHPversión 3 - AWS SDK for PHP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Cifrado del lado del cliente de Amazon S3 con elAWS SDK for PHPversión 3

Con el cifrado en el lado del cliente, los datos se cifran y se descifran directamente en su entorno. Esto significa que estos datos se cifran antes de que se transfieran a Amazon S3 y, por lo tanto, no tendrá que confiar en un servicio externo que gestione el cifrado. Para las nuevas implementaciones, sugerimos el uso deS3EncryptionClientV2yS3EncryptionMultipartUploaderV2sobre el obsoletoS3EncryptionClientyS3EncryptionMultipartUploader. Se recomienda que las implementaciones anteriores que siguen utilizando las versiones obsoletas intentan migrar.S3EncryptionClientV2mantiene el soporte para descifrar datos cifrados mediante el legadoS3EncryptionClient.

AWS SDK for PHP implementa el cifrado de sobres y utiliza OpenSSL para cifrar y descifrar. La implementación puede interoperar con otros SDK que coinciden con el soporte de sus características. También es compatible con el flujo de trabajo asíncrono basado en promesas del SDK.

Migration Guide

Para aquellos que intentan migrar a los clientes obsoletos a los nuevos clientes, hay una guía de migración que se puede encontraraquí.

Configuración

Para comenzar a utilizar el cifrado del lado del cliente, necesita lo siguiente:

Antes de ejecutar cualquier código de ejemplo, configure elAWSCredenciales de . ConsulteCredenciales para elAWS SDK for PHPversión 3.

Cifrado

Carga de un objeto cifrado enS3EncryptionClientV2toma tres parámetros adicionales por encima de la normaPutObjectparámetros:

  • '@KmsEncryptionContext'es un par clave-valor que se puede utilizar para añadir una capa adicional de seguridad al objeto cifrado. El cliente de cifrado debe pasar la misma clave, lo que hará automáticamente en una llamada get. Si no se desea ningún contexto adicional, pase una matriz vacía.

  • @CipherOptionsson configuraciones adicionales para el cifrado, incluido el cifrado que se va a utilizar y el tamaño de clave.

  • @MaterialsProvideres un proveedor que se encarga de generar una clave de cifrado y un vector de inicialización, así como de cifrar la clave de cifrado.

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'), ]);
nota

Además del Amazon S3 yAWS KMSerrores de servicio basados, es posible que se produzcanInvalidArgumentExceptionobjetos si'@CipherOptions'no están configurados correctamente.

Descifrado

Descargar y descifrar un objeto tiene cuatro parámetros adicionales, dos de los cuales son necesarios, además del estándarGetObjectparámetros. El cliente detectará las opciones de cifrado básicas por usted.

  • '@SecurityProfile': Si se establece en 'V2', solo los objetos cifrados en compatible con V2

    el formato se puede descifrar. Si se establece este parámetro en 'V2_AND_LEGACY', también se pueden descifrar los objetos cifrados en formato compatible con V1. Para admitir la migración, establezca @SecurityProfile en «V2_AND_LEGACY». Utilice «V2» solo para el desarrollo de nuevas aplicaciones.

  • '@MaterialsProvider'es un proveedor que se encarga de generar una clave de cifrado y un vector de inicialización, como

    así como cifrar la clave de cifrado.

  • '@KmsAllowDecryptWithAnyCmk': (opcional) Establecer este parámetro en true permite el descifrado

    sin proporcionar un identificador de clave KMS al constructor de MaterialsProvider. El valor predeterminado es false.

  • '@CipherOptions'(opcional) son configuraciones adicionales para el cifrado, incluidas las cuales

    cifrado para usar y tamaño de clave.

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

Además del Amazon S3 yAWS KMSerrores de servicio basados, es posible que se produzcanInvalidArgumentExceptionobjetos si'@CipherOptions'no están configurados correctamente.

Configuración de Cipher

'Cipher' (cadena)

Es el método Cipher que utiliza el cliente para cifrar. Solo se admite «gcm» en este momento.

importante

PHP se ha actualizado a la versión 7.1 para incluir los parámetros adicionales necesarios para cifrar y descifrar mediante el cifrado OpenSSL para GCM. Para las versiones 7.0 de PHP y anteriores, los clientes de cifrado proporcionan y utilizan un polyfill para compatibilidad con GCMS3EncryptionClientV2yS3EncryptionMultipartUploaderV2. Sin embargo, el rendimiento de entradas grandes será mucho más lento utilizando el polyfill que con la implementación nativa para PHP 7.1+, por lo que puede ser necesario actualizar entornos de versiones anteriores de PHP para utilizarlos de manera efectiva.

'KeySize' (int)

Es la longitud de la clave de cifrado del contenido que se genera para el cifrado. La opción por defecto son 256 bits. Las opciones de configuración válidas son de 256 y 128 bits.

'Aad' (cadena)

Son datos de autenticación adicionales que se incluyen en la carga cifrada. Esta información se valida en el descifrado. Aad solo está disponible cuando se utiliza el cifrado “gcm”.

importante

Los datos de autenticación adicionales no son compatibles con todosAWSEs posible que los SDK y, como tales, otros SDK no puedan descifrar archivos cifrados con este parámetro.

Estrategias de metadatos

También tiene la opción de proporcionar una instancia de una clase que implementa Aws\Crypto\MetadataStrategyInterface. Esta interfaz sencilla gestiona la grabación y la carga de Aws\Crypto\MetadataEnvelope que contiene sus materiales de cifrado de sobres. El SDK proporciona dos clases que implementan lo siguiente: Aws\S3\Crypto\HeadersMetadataStrategy y Aws\S3\Crypto\InstructionFileMetadataStrategy. HeadersMetadataStrategy se utiliza de forma predeterminada.

$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, ]);

Las constantes del nombre de la clase de HeadersMetadataStrategy y InstructionFileMetadataStrategy también se pueden suministrar invocando ::class.

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

Si se produce un error después cargar un archivo de instrucciones, no se eliminará automáticamente.

Cargas multiparte

También se puede realizar una carga multiparte con el cifrado del lado del cliente. LaAws\S3\Crypto\S3EncryptionMultipartUploaderV2prepara el flujo de origen para el cifrado antes de cargarlo. Su creación es similar al uso de Aws\S3\MultipartUploader y Aws\S3\Crypto\S3EncryptionClientV2. S3EncryptionMultipartUploaderV2 puede gestionar la misma opción '@MetadataStrategy' que S3EncryptionClientV2, así como todas las configuraciones '@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();
nota

Además del Amazon S3 yAWS KMSerrores de servicio basados, es posible que se produzcanInvalidArgumentExceptionobjetos si'@CipherOptions'no están configurados correctamente.