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 deS3EncryptionClientV2
yS3EncryptionMultipartUploaderV2
sobre el obsoletoS3EncryptionClient
yS3EncryptionMultipartUploader
. Se recomienda que las implementaciones anteriores que siguen utilizando las versiones obsoletas intentan migrar.S3EncryptionClientV2
mantiene el soporte para descifrar datos cifrados mediante el legadoS3EncryptionClient
.
AWS SDK for PHP implementa el cifrado de sobres y utiliza OpenSSL
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 enS3EncryptionClientV2
toma tres parámetros adicionales por encima de la normaPutObject
pará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. -
@CipherOptions
son configuraciones adicionales para el cifrado, incluido el cifrado que se va a utilizar y el tamaño de clave. -
@MaterialsProvider
es 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'), ]);
Además del Amazon S3 yAWS KMSerrores de servicio basados, es posible que se produzcanInvalidArgumentException
objetos 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ándarGetObject
pará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, ]);
Además del Amazon S3 yAWS KMSerrores de servicio basados, es posible que se produzcanInvalidArgumentException
objetos 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.
PHP se ha actualizado a la versión 7.1S3EncryptionClientV2
yS3EncryptionMultipartUploaderV2
. 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”.
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'), ]);
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\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();
Además del Amazon S3 yAWS KMSerrores de servicio basados, es posible que se produzcanInvalidArgumentException
objetos si'@CipherOptions'
no están configurados correctamente.