Criptografar e descriptografar chaves de dados - AWS Key Management Service

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á.

Criptografar e descriptografar chaves de dados

Os exemplos neste tópico usam as ReEncryptoperações Encrypt, Decrypt e na API. AWS KMS

Essas operações são projetadas para criptografar e descriptografar chaves de dados. Elas usam uma AWS KMS keys nas operações de criptografia e não podem aceitar mais de 4 KB (4.096 bytes) de dados. Embora você possa usá-las para criptografar pequenas quantidades de dados, como uma senha ou chave RSA, elas não serão projetadas para criptografar dados de aplicações.

Para criptografar dados de aplicações, use os recursos de criptografia no lado do servidor de um serviço da AWS ou uma biblioteca de criptografia de cliente, como a AWS Encryption SDK ou o Cliente de criptografia do Amazon S3.

Criptografar uma chave de dados

A operação Encrypt é projetada para criptografar chaves de dados, mas não é frequentemente usada. As GenerateDataKeyWithoutPlaintextoperações GenerateDataKeye retornam chaves de dados criptografadas. Você pode usar essa método quando está movendo dados criptografados para uma região diferente e deseja criptografar sua chave de dados com uma chave KMS na nova região.

Em linguagens que exigem um objeto cliente, esses exemplos usam o objeto cliente do AWS KMS criado em Criar um cliente.

Java

Para detalhes, consulte o Método encrypt, na Referência de APIs do AWS SDK for Java.

// Encrypt a data key // // Replace the following example key ARN with any valid key identfier String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; ByteBuffer plaintext = ByteBuffer.wrap(new byte[]{1,2,3,4,5,6,7,8,9,0}); EncryptRequest req = new EncryptRequest().withKeyId(keyId).withPlaintext(plaintext); ByteBuffer ciphertext = kmsClient.encrypt(req).getCiphertextBlob();
C#

Para obter detalhes, consulte o Método Encrypt no AWS SDK for .NET.

// Encrypt a data key // // Replace the following example key ARN with any valid key identfier String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; MemoryStream plaintext = new MemoryStream(); plaintext.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, 0, 10); EncryptRequest encryptRequest = new EncryptRequest() { KeyId = keyId, Plaintext = plaintext }; MemoryStream ciphertext = kmsClient.Encrypt(encryptRequest).CiphertextBlob;
Python

Para obter detalhes, consulte o Método encrypt no AWS SDK for Python (Boto3).

# Encrypt a data key # Replace the following example key ARN with any valid key identfier key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' plaintext = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00' response = kms_client.encrypt( KeyId=key_id, Plaintext=plaintext ) ciphertext = response['CiphertextBlob']
Ruby

Para obter detalhes, consulte o método de instância encrypt no AWS SDK for Ruby.

# Encrypt a data key # Replace the following example key ARN with any valid key identfier key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' plaintext = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00" response = kmsClient.encrypt({ key_id: key_id, plaintext: plaintext }) ciphertext = response.ciphertext_blob
PHP

Para obter detalhes, consulte o Método Encrypt no AWS SDK for PHP.

// Encrypt a data key // // Replace the following example key ARN with any valid key identfier $keyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'; $message = pack('c*',1,2,3,4,5,6,7,8,9,0); $result = $KmsClient->encrypt([ 'KeyId' => $keyId, 'Plaintext' => $message, ]); $ciphertext = $result['CiphertextBlob'];
Node.js

Para obter detalhes, consulte a propriedade encrypt no AWS SDK JavaScript em Node.js.

// Encrypt a data key // // Replace the following example key ARN with any valid key identfier const KeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'; const Plaintext = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]); kmsClient.encrypt({ KeyId, Plaintext }, (err, data) => { if (err) console.log(err, err.stack); // an error occurred else { const { CiphertextBlob } = data; ... } });
PowerShell

Para criptografar uma chave de dados em uma chave do KMS, use o cmdlet Invoke-KMSEncrypt. Ele retorna o texto cifrado como um MemoryStream (System.io). MemoryStream) objeto. É possível usar o objeto MemoryStream como entrada para o cmdlet Invoke-KMSDecrypt.

O AWS KMS também retorna chaves de dados como objetos MemoryStream. Neste exemplo, para simular uma chave de dados de texto simples, criamos uma matriz de bytes e a gravamos em um objeto MemoryStream.

Observe que o parâmetro Plaintext de Invoke-KMSEncrypt utiliza uma matriz de bytes (byte[]). Ele não requer um objeto MemoryStream. A partir da AWSPowerShell versão 4.0, os parâmetros em todos os AWSPowerShell módulos que usam matrizes de bytes e MemoryStream objetos aceitam matrizes de bytes, objetos, strings, MemoryStream matrizes de strings e (System.io). FileInfo FileInfo) objetos. É possível passar qualquer um desses tipos para Invoke-KMSEncrypt.

# Encrypt a data key # Replace the following example key ARN with any valid key identfier $keyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' # Simulate a data key # Create a byte array [byte[]] $bytes = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 # Create a MemoryStream $plaintext = [System.IO.MemoryStream]::new() # Add the byte array to the MemoryStream $plaintext.Write($bytes, 0, $bytes.length) # Encrypt the simulated data key $response = Invoke-KMSEncrypt -KeyId $keyId -Plaintext $plaintext # Get the ciphertext from the response $ciphertext = $response.CiphertextBlob

Para usar os AWS KMS PowerShell cmdlets, instale o AWS.Tools. KeyManagementServicemódulo. Para obter mais informações, consulte o Manual do usuário do AWS Tools for Windows PowerShell.

Descriptografia de uma chave de dados

Para descriptografar uma chave de dados, use a operação Decrypt.

O ciphertextBlob que você especificar deve ser o valor do CiphertextBlob campo de uma resposta GenerateDataKey, GenerateDataKeyWithoutPlaintext, ou Criptografar, ou o PrivateKeyCiphertextBlob campo de uma GenerateDataKeyPairWithoutPlaintextresposta GenerateDataKeyPairou. Também é possível usar a operação Decrypt para descriptografar dados criptografados fora do AWS KMS pela chave pública em uma chave do KMS assimétrica.

O parâmetro KeyId não é necessário ao descriptografar com chaves do KMS de criptografia simétrica. O AWS KMS pode obter a chave do KMS que foi usada para criptografar os dados diretamente dos metadados no blob de texto cifrado. Porém, sempre é uma prática recomendada especificar a chave do KMS que você está usando. Essa prática garante que você use a chave do KMS desejada e impede que você descriptografe um texto cifrado acidentalmente usando uma chave do KMS em que você não confia.

Em linguagens que exigem um objeto cliente, esses exemplos usam o objeto cliente do AWS KMS criado em Criar um cliente.

Java

Para obter detalhes, consulte o Método decrypt, na Referência de APIs do AWS SDK for Java.

// Decrypt a data key // // Replace the following example key ARN with any valid key identfier String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; ByteBuffer ciphertextBlob = Place your ciphertext here; DecryptRequest req = new DecryptRequest().withCiphertextBlob(ciphertextBlob).withKeyId(keyId); ByteBuffer plainText = kmsClient.decrypt(req).getPlaintext();
C#

Para obter detalhes, consulte o Método Decrypt no AWS SDK for .NET.

// Decrypt a data key // // Replace the following example key ARN with any valid key identfier String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; MemoryStream ciphertextBlob = new MemoryStream(); // Write ciphertext to memory stream DecryptRequest decryptRequest = new DecryptRequest() { CiphertextBlob = ciphertextBlob, KeyId = keyId }; MemoryStream plainText = kmsClient.Decrypt(decryptRequest).Plaintext;
Python

Para obter detalhes, consulte o Método decrypt no AWS SDK for Python (Boto3).

# Decrypt a data key # Replace the following example key ARN with any valid key identfier key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' ciphertext = 'Place your ciphertext here' response = kms_client.decrypt( CiphertextBlob=ciphertext, KeyId=key_id ) plaintext = response['Plaintext']
Ruby

Para obter detalhes, consulte o método de instância decrypt no AWS SDK for Ruby.

# Decrypt a data key # Replace the following example key ARN with any valid key identfier key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' ciphertext = 'Place your ciphertext here' ciphertext_packed = [ciphertext].pack("H*") response = kmsClient.decrypt({ ciphertext_blob: ciphertext_packed, key_id: key_id }) plaintext = response.plaintext
PHP

Para obter detalhes, consulte o Método Decrypt no AWS SDK for PHP.

// Decrypt a data key // // Replace the following example key ARN with any valid key identfier $keyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'; $ciphertext = 'Place your cipher text blob here'; $result = $KmsClient->decrypt([ 'CiphertextBlob' => $ciphertext, 'KeyId' => $keyId, ]); $plaintext = $result['Plaintext'];
Node.js

Para obter detalhes, consulte a propriedade decrypt no AWSSDK em Node.js. JavaScript

// Decrypt a data key // // Replace the following example key ARN with any valid key identfier const KeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'; const CiphertextBlob = 'Place your cipher text blob here'; kmsClient.decrypt({ CiphertextBlob, KeyId }, (err, data) => { if (err) console.log(err, err.stack); // an error occurred else { const { Plaintext } = data; ... } });
PowerShell

Para descriptografar uma chave de dados, use o cmdlet Invoke-KMSEncrypt.

Esse cmdlet retorna o texto simples como um (System.IO). MemoryStream MemoryStream) objeto. Para convertê-lo em uma matriz de bytes, use cmdlets ou funções que convertem objetos MemoryStream em matrizes de bytes, como as funções no módulo Converter.

Como esse exemplo usa o texto cifrado por um cmdlet de criptografia do AWS KMS retornado, ele usa um objeto MemoryStream para o valor do parâmetro CiphertextBlob. No entanto, o parâmetro CiphertextBlob de Invoke-KMSDecrypt utiliza uma matriz de bytes (byte[]). Ele não requer um objeto MemoryStream. A partir da AWSPowerShell versão 4.0, os parâmetros em todos os AWSPowerShell módulos que usam matrizes de bytes e MemoryStream objetos aceitam matrizes de bytes, objetos, strings, MemoryStream matrizes de strings e (System.io). FileInfo FileInfo) objetos. É possível passar qualquer um desses tipos para Invoke-KMSDecrypt.

# Decrypt a data key # Replace the following example key ARN with any valid key identfier $keyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' [System.IO.MemoryStream]$ciphertext = Read-Host 'Place your cipher text blob here' $response = Invoke-KMSDecrypt -CiphertextBlob $ciphertext -KeyId $keyId $plaintext = $response.Plaintext

Para usar os AWS KMS PowerShell cmdlets, instale o AWS.Tools. KeyManagementServicemódulo. Para obter mais informações, consulte o AWS Tools for Windows PowerShellGuia do Usuário.

Criptografar novamente uma chave de dados em uma AWS KMS key

Para descriptografar uma chave de dados criptografada e, em seguida, recriptografar imediatamente a chave de dados em outraAWS KMS key, use a operação. ReEncrypt As operações são realizadas inteiramente no lado servidor dentro do AWS KMS, para nunca exporem o texto não criptografado fora do AWS KMS.

O ciphertextBlob que você especificar deve ser o valor do CiphertextBlob campo de uma resposta GenerateDataKey, GenerateDataKeyWithoutPlaintext, ou Criptografar, ou o PrivateKeyCiphertextBlob campo de uma GenerateDataKeyPairWithoutPlaintextresposta GenerateDataKeyPairou. Também é possível usar a operação ReEncrypt para recriptografar dados criptografados fora do AWS KMS pela chave pública em uma chave do KMS assimétrica.

O parâmetro SourceKeyId não é necessário ao recriptografar com chaves do KMS de criptografia simétrica. O AWS KMS pode obter a chave do KMS que foi usada para criptografar os dados diretamente dos metadados no blob de texto cifrado. Porém, sempre é uma prática recomendada especificar a chave do KMS que você está usando. Essa prática garante que você use a chave do KMS desejada e impede que você descriptografe um texto cifrado acidentalmente usando uma chave do KMS em que você não confia.

Em linguagens que exigem um objeto cliente, esses exemplos usam o objeto cliente do AWS KMS criado em Criar um cliente.

Java

Para detalhes, consulte o Método reEncrypt, na Referência de APIs do AWS SDK for Java.

// Re-encrypt a data key ByteBuffer sourceCiphertextBlob = Place your ciphertext here; // Replace the following example key ARNs with valid key identfiers String sourceKeyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; String destinationKeyId = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; ReEncryptRequest req = new ReEncryptRequest(); req.setCiphertextBlob(sourceCiphertextBlob); req.setSourceKeyId(sourceKeyId); req.setDestinationKeyId(destinationKeyId); ByteBuffer destinationCipherTextBlob = kmsClient.reEncrypt(req).getCiphertextBlob();
C#

Para obter detalhes, consulte o Método ReEncrypt no AWS SDK for .NET.

// Re-encrypt a data key MemoryStream sourceCiphertextBlob = new MemoryStream(); // Write ciphertext to memory stream // Replace the following example key ARNs with valid key identfiers String sourceKeyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; String destinationKeyId = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; ReEncryptRequest reEncryptRequest = new ReEncryptRequest() { CiphertextBlob = sourceCiphertextBlob, SourceKeyId = sourceKeyId, DestinationKeyId = destinationKeyId }; MemoryStream destinationCipherTextBlob = kmsClient.ReEncrypt(reEncryptRequest).CiphertextBlob;
Python

Para obter detalhes, consulte o Método re_encrypt no AWS SDK for Python (Boto3).

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' # Replace the following example key ARNs with valid key identfiers source_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' destination_key_id = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' response = kms_client.re_encrypt( CiphertextBlob=ciphertext, SourceKeyId=source_key_id, DestinationKeyId=destination_key_id ) destination_ciphertext_blob = response['CiphertextBlob']
Ruby

Para obter detalhes, consulte o método de instância re_encrypt no AWS SDK for Ruby.

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' ciphertext_packed = [ciphertext].pack("H*") # Replace the following example key ARNs with valid key identfiers source_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' destination_key_id = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' response = kmsClient.re_encrypt({ ciphertext_blob: ciphertext_packed, source_key_id: source_key_id, destination_key_id: destination_key_id }) destination_ciphertext_blob = response.ciphertext_blob.unpack('H*')
PHP

Para obter detalhes, consulte o Método ReEncrypt no AWS SDK for PHP.

// Re-encrypt a data key $ciphertextBlob = 'Place your ciphertext here'; // Replace the following example key ARNs with valid key identfiers $sourceKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'; $destinationKeyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321'; $result = $KmsClient->reEncrypt([ 'CiphertextBlob' => $ciphertextBlob, 'SourceKeyId' => $sourceKeyId, 'DestinationKeyId' => $destinationKeyId, ]);
Node.js

Para obter detalhes, consulte a propriedade reEncrypt no SDK JavaScript em AWS Node.js.

// Re-encrypt a data key const CiphertextBlob = 'Place your cipher text blob here'; // Replace the following example key ARNs with valid key identfiers const SourceKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'; const DestinationKeyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321'; kmsClient.reEncrypt({ CiphertextBlob, SourceKeyId, DestinationKeyId }, (err, data) => { ... });
PowerShell

Para recriptografar um texto cifrado com a mesma chave KMS ou com uma chave KMS diferente, use o cmdlet Invoke-KMS. ReEncrypt

Como esse exemplo usa o texto cifrado por um cmdlet de criptografia do AWS KMS retornado, ele usa um objeto MemoryStream para o valor do parâmetro CiphertextBlob. No entanto, o parâmetro CiphertextBlob de Invoke-KMSReEncrypt utiliza uma matriz de bytes (byte[]). Ele não requer um objeto MemoryStream. A partir da AWSPowerShell versão 4.0, os parâmetros em todos os AWSPowerShell módulos que usam matrizes de bytes e MemoryStream objetos aceitam matrizes de bytes, objetos, strings, MemoryStream matrizes de strings e (System.io). FileInfo FileInfo) objetos. É possível passar qualquer um desses tipos para Invoke-KMSReEncrypt.

# Re-encrypt a data key [System.IO.MemoryStream]$ciphertextBlob = Read-Host 'Place your cipher text blob here' # Replace the following example key ARNs with valid key identfiers $sourceKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' $destinationKeyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' $response = Invoke-KMSReEncrypt -Ciphertext $ciphertextBlob -SourceKeyId $sourceKeyId -DestinationKeyId $destinationKeyId $reEncryptedCiphertext = $response.CiphertextBlob

Para usar os AWS KMS PowerShell cmdlets, instale o AWS.Tools. KeyManagementServicemódulo. Para obter mais informações, consulte o Guia do usuário da AWS Tools for Windows PowerShell.