Cifrado del lado del cliente de Amazon S3 con la versión 3 de AWS SDK for PHP - 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 la versión 3 de AWS SDK for PHP

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 transferirse a Amazon S3 y, por lo tanto, no tendrá que confiar en un servicio externo que gestione el cifrado. Para nuevas implementaciones, sugerimos el uso de S3EncryptionClientV2 y S3EncryptionMultipartUploaderV2 en lugar de los obsoletos S3EncryptionClient y S3EncryptionMultipartUploader. It is recommendSe recomienda que las implementaciones más antiguas que aún utilicen las versiones obsoletas intenten migrar. S3EncryptionClientV2 mantiene la compatibilidad con el descifrado de datos cifrados mediante S3EncryptionClient.

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.

Guía de migración

Para aquellos que están tratando de migrar de los clientes obsoletos a los nuevos clientes, hay una guía de migración que se puede encontrar aquí.

Configuración

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

Before rAntes de ejecutar cualquier código de ejemplo, configure las credenciales de AWS. Consulte Credenciales para la versión 3 de AWS SDK for PHP.

Encryption (Cifrado)

Para cargar un objeto cifrado en S3EncryptionClientV2 se necesitan tres parámetros adicionales además de los parámetros PutObject estándar:

  • '@KmsEncryptionContext' es un par clave-valor que puede utilizarse para añadir una capa adicional de seguridad a su objeto encriptado. El cliente de cifrado tiene que introducir la misma clave, lo que hará automáticamente al recibir una llamada. Si no se necesita ningún contexto adicional, introduzca una matriz vacía.

  • @CipherOptions son configuraciones adicionales para el cifrado, incluyendo qué cifrado usar y el tamaño de la clave.

  • @MaterialsProvider es un proveedor que se encarga de generar una clave de cifrado y un vector de inicialización, así como de cifrar su 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 de los errores de servicio basados en Amazon S3 y AWS KMS, puede recibir objetos de tipo InvalidArgumentException si sus '@CipherOptions' no están configuradas correctamente.

Descifrado

La descarga y descifrado de un objeto tiene cuatro parámetros adicionales, dos de los cuales son obligatorios, además de los parámetros estándar de GetObject. El cliente detectará las opciones de cifrado básicas por usted.

  • '@SecurityProfile': SSi se establece en "V2", solo se pueden descifrar los objetos cifrados en formato compatible con V2.

    el formato se puede descifrar. Si se establece este parámetro a 'V2_AND_LEGACY' también permite descifrar objetos cifrados en formato compatible con V1. Para facilitar la migración, establezca @SecurityProfile en “V2_AND_LEGACY”. Use "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 de cifrar su clave de cifrado.

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

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

  • '@CipherOptions' (opcional) son configuraciones adicionales para la encriptación incluyendo que

    el cifrado que se va a utilizar y el tamaño de la clave.

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

Además de los errores de servicio basados en Amazon S3 y AWS KMS, puede recibir objetos de tipo InvalidArgumentException si sus '@CipherOptions' no están configuradas correctamente.

Configuración de Cipher

'Cipher' (cadena)

Es el método Cipher que utiliza el cliente para cifrar. Por el momento, solo se admite “gcm".

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. En las versiones 7.0 y anteriores de PHP, los clientes de cifrado S3EncryptionClientV2 y S3EncryptionMultipartUploaderV2 las utilizan un polyfill para soportar GCM. Sin embargo, el rendimiento con entradas de gran tamaño será mucho más lento si se utiliza el polyfill que si se utiliza la implementación nativa de PHP 7.1 o versiones posteriores, por lo que puede ser necesario actualizar los entornos de la versión de PHP anteriores para que funcionen correctamente.

'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 las 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

No todos los SDK de AWS admiten datos de autenticación adicionales y, por lo tanto, es posible que otros SDK no puedan descifrar los 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. El Aws\S3\Crypto\S3EncryptionMultipartUploaderV2 prepara 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 de los errores de servicio basados en Amazon S3 y AWS KMS, puede recibir objetos de tipo InvalidArgumentException si sus '@CipherOptions' no están configuradas correctamente.