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
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.1S3EncryptionClientV2
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.