As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Criptografia do lado do cliente do Amazon S3 com o AWS SDK for PHP versão 3
Com a criptografia do lado do cliente, os dados são criptografados e descriptografados diretamente em seu ambiente. Isso significa que esses dados são criptografados antes de serem transferidos para o Amazon S3, e você não depende de um serviço externo para tratar da criptografia para você. Para novas implementações, sugerimos o uso de S3EncryptionClientV2
e S3EncryptionMultipartUploaderV2
sobre o S3EncryptionClient
e S3EncryptionMultipartUploader
obsoletos. É recomendável que implementações mais antigas que ainda usam as versões obsoletas tentem migrar. O S3EncryptionClientV2
mantém o suporte para descriptografar dados que foram criptografados usando o S3EncryptionClient
legado.
O AWS SDK for PHP implementa a criptografia envelope e usa o OpenSSL
Guia de migração
Para aqueles que estão tentando migrar dos clientes obsoletos para os novos clientes, há um guia de migração que pode ser encontrado aqui.
Configuração
Para começar a usar a criptografia do lado do cliente, você precisa do seguinte:
Antes de executar qualquer código de exemplo, configure suas credenciais da AWS. Consulte as Credenciais do AWS SDK for PHP versão 3.
Criptografia
O upload de um objeto criptografado S3EncryptionClientV2
usa três parâmetros adicionais além dos parâmetros PutObject
padrão:
-
'@KmsEncryptionContext'
é um par de valores-chave que pode ser usado para adicionar uma camada extra de segurança ao seu objeto criptografado. O cliente de criptografia deve passar a mesma chave, o que será feito automaticamente em uma chamada get. Se nenhum contexto adicional for desejado, passe uma matriz vazia. -
@CipherOptions
são configurações adicionais para a criptografia, incluindo qual cifra usar e tamanho da chave. -
@MaterialsProvider
é um provedor que gerencia a geração de uma chave cifrada e um vetor de inicialização, além de criptografar sua chave cifrada.
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
Além dos erros de serviço com base no Amazon S3 e no InvalidArgumentException
, você pode receber objetos AWS KMS se suas '@CipherOptions'
não estiverem configuradas corretamente.
Descriptografia
Baixar e descriptografar um objeto tem quatro parâmetros adicionais, dois dos quais são obrigatórios, além dos parâmetros GetObject
padrão. O cliente detectará as opções básicas de criptografia para você.
-
-
'@SecurityProfile'
: se definido como 'V2', somente objetos criptografados em formato de compatibilidade com V2 -
podem ser descriptografados. Definir esse parâmetro como 'V2_AND_LEGACY' também permite que objetos criptografados em formato compatível com V1 sejam descriptografados. Para oferecer suporte à migração, defina @SecurityProfile como 'V2_AND_LEGACY'. Use 'V2' somente para o desenvolvimento de novos aplicativos.
-
-
-
'@MaterialsProvider'
é um provedor que gerencia a geração de uma chave cifrada e um vetor de inicialização, bem -
como criptografar sua chave cifrada.
-
-
-
'@KmsAllowDecryptWithAnyCmk'
: (opcional) Definir esse parâmetro como verdadeiro permite a descriptografia -
sem fornecer um ID de chave do KMS para o construtor do MaterialsProvider. O valor padrão é falso.
-
-
-
'@CipherOptions'
(opcional) são configurações adicionais para a criptografia, incluindo qual -
cifra a ser usada e o tamanho da chave.
-
$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
nota
Além dos erros de serviço com base no Amazon S3 e no InvalidArgumentException
, você pode receber objetos AWS KMS se suas '@CipherOptions'
não estiverem configuradas corretamente.
Configuração da criptografia
-
'Cipher'
(string) -
O método de codificação que o cliente de criptografia usa ao criptografar. Somente 'gcm' é suportado, no momento.
Importante
O PHP foi atualizado na versão 7.1S3EncryptionClientV2
e S3EncryptionMultipartUploaderV2
. No entanto, o desempenho de entradas grandes será muito mais lento usando o polyfill do que usando a implementação nativa do PHP 7.1+, portanto, pode ser necessário atualizar ambientes de versões mais antigas do PHP para usá-los de forma eficaz.
-
'KeySize'
(int) -
O comprimento da chave de criptografia do conteúdo a ser gerada para a criptografia. O padrão é 256 bits. As opções de configuração válidas são 256 e 128.
-
'Aad'
(string) -
'Additional authentication data - Dados de autenticação adicionais' opcionais a serem incluídos com seu conteúdo criptografado. Essas informações são validadas na descriptografia. O
Aad
está disponível somente ao usar o código "gcm".
Importante
Dados de autenticação adicionais não são compatíveis com todos os AWS SDKs e, como tal, outros SDKs podem não conseguir descriptografar arquivos criptografados usando esse parâmetro.
Estratégias de metadados
Você também tem a opção de fornecer uma instância de uma classe que implementa a Aws\Crypto\MetadataStrategyInterface
. Essa interface simples lida com o salvamento e o carregamento do Aws\Crypto\MetadataEnvelope
que contém o material da criptografia de envelope. O SDK fornece duas classes que implementam isso: Aws\S3\Crypto\HeadersMetadataStrategy
e Aws\S3\Crypto\InstructionFileMetadataStrategy
. A HeadersMetadataStrategy
é usada por padrão.
$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, ]);
Constantes de nomes de classe para HeadersMetadataStrategy
e InstructionFileMetadataStrategy
podem ser fornecidas chamando ::class.
$result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => HeadersMetadataStrategy::class, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
nota
Se houver uma falha depois que um arquivo de instrução for carregado, ele não será excluído automaticamente.
Carregamentos fracionados
A execução de um multipart upload com a criptografia do lado do cliente também é possível. O Aws\S3\Crypto\S3EncryptionMultipartUploaderV2
prepara o fluxo de origem da criptografia antes do upload. A criação de um enfrenta uma experiência semelhante a usar o Aws\S3\MultipartUploader
e o Aws\S3\Crypto\S3EncryptionClientV2
. O S3EncryptionMultipartUploaderV2
pode lidar com a mesma opção '@MetadataStrategy'
que o S3EncryptionClientV2
, bem como com todas as configurações disponíveis de '@CipherOptions'
.
$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
Além dos erros de serviço com base no Amazon S3 e no InvalidArgumentException
, você pode receber objetos AWS KMS se suas '@CipherOptions'
não estiverem configuradas corretamente.