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 deste tópico usam as operações Encrypt, Decrypt e ReEncrypt na API do AWS KMS.

Essas operações são projetadas para criptografar e descriptografar chaves de dados. Usam um AWS KMS Chave mestra do cliente (CMK) nas operações de encriptação e não podem aceitar mais de 4 KB (4096 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 aplicativos.

Para criptografar dados de aplicativos, use os recursos de criptografia no lado do servidor de um serviço da AWS ou uma biblioteca de criptografia de cliente, como a SDK de criptografia da AWS 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 operações GenerateDataKey e GenerateDataKeyWithoutPlaintext retornam chaves de dados criptografados. Pode utilizar este método quando estiver a mover dados encriptados para uma Região diferente e pretende encriptar a respectiva chave de dados com um CMK 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 obter detalhes, consulte o Método encrypt no AWS SDK for Java API Reference.

// Encrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para .NET.

// Encrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para Python (Boto3).

# Encrypt a data key # Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para Ruby.

# Encrypt a data key # Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para PHP.

// Encrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido $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 for JavaScript in Node.js.

// Encrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 encriptar uma chave de dados sob um AWS KMS CMK, utilize o Invoke-kmsencrypt sem. Ele retorna o texto cifrado como um objeto MemoryStream (System.IO.MemoryStream). É 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 versão 4.0 do AWSPowerShell, parâmetros em todos os módulos do AWSPowerShell que utilizam matrizes de bytes e objetos MemoryStream aceitam matrizes de bytes, objetos MemoryStream, strings, matrizes de strings e objetos FileInfo (System.IO.FileInfo). É possível passar qualquer um desses tipos para Invoke-KMSEncrypt.

# Encrypt a data key # Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido $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 cmdlets do AWS KMS PowerShell, instale o módulo AWS.Tools.KeyManagementService. Para obter mais informações, consulte o Guia do usuário do AWS Tools para Windows PowerShell.

Descriptografia de uma chave de dados

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

O ciphertextBlob especificado deve ser o valor do campo CiphertextBlob de uma resposta GenerateDataKey, GenerateDataKeyWithoutPlaintext ou Encrypt ou do campo PrivateKeyCiphertextBlob de uma resposta GenerateDataKeyPair ou GenerateDataKeyPairWithoutPlaintext. Também pode utilizar o Decrypt operação para desencriptar dados encriptados fora de AWS KMS pela chave pública numa CMK.

O KeyId parâmetro não é necessário quando descodificação com simétrica CMKs. AWS KMS pode obter CMK que foi utilizado para encriptar os dados dos metadados no blob de texto. Mas é sempre uma boa prática especificar o CMK está a utilizar. Esta prática assegura que utiliza o CMK que pretende e impede que descriuem inadvertidamente uma despedida utilizando um CMK que 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 no AWS SDK for Java API Reference.

// Decrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para .NET.

// Decrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para Python (Boto3).

# Decrypt a data key # Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para Ruby.

# Decrypt a data key # Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 para PHP.

// Decrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido $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 de descriptografia no AWS SDK for JavaScript in Node.js.

// Decrypt a data key // // Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido 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 objeto MemoryStream (System.IO.MemoryStream). 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 versão 4.0 do AWSPowerShell, parâmetros em todos os módulos do AWSPowerShell que utilizam matrizes de bytes e objetos MemoryStream aceitam matrizes de bytes, objetos MemoryStream, strings, matrizes de strings e objetos FileInfo (System.IO.FileInfo). É possível passar qualquer um desses tipos para Invoke-KMSDecrypt.

# Decrypt a data key # Substitua o ARN de chave de exemplo a seguir por qualquer identificador de chave válido $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 cmdlets do AWS KMS PowerShell, instale o módulo AWS.Tools.KeyManagementService. Para obter mais informações, consulte o Guia do usuário do AWS Tools para Windows PowerShell.

Voltar a codificar uma chave de dados por baixo de um Chave mestra do cliente

Para desencriptar uma chave de dados encriptada e, em seguida, reencriptar imediatamente a tecla de dados com um Chave mestra do cliente (CMK), utilize o recodificar operação. 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 especificado deve ser o valor do campo CiphertextBlob de uma resposta GenerateDataKey, GenerateDataKeyWithoutPlaintext ou Encrypt ou do campo PrivateKeyCiphertextBlob de uma resposta GenerateDataKeyPair ou GenerateDataKeyPairWithoutPlaintext. Também pode utilizar o ReEncrypt operação para re-encriptar dados encriptados fora de AWS KMS pela chave pública numa CMK.

O SourceKeyId parâmetro não é necessário ao voltar a codificar com simétrica CMKs. AWS KMS pode obter CMK que foi utilizado para encriptar os dados dos metadados no blob de texto. Mas é sempre uma boa prática especificar o CMK está a utilizar. Esta prática assegura que utiliza o CMK que pretende e impede que descriuem inadvertidamente uma despedida utilizando um CMK que 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 reEncrypt no AWS SDK for Java API Reference.

// Re-encrypt a data key ByteBuffer sourceCiphertextBlob = Place your ciphertext here; // Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos 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 para .NET.

// Re-encrypt a data key MemoryStream sourceCiphertextBlob = new MemoryStream(); // Write ciphertext to memory stream // Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos 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 para Python (Boto3).

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' # Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos 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 para Ruby.

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' ciphertext_packed = [ciphertext].pack("H*") # Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos 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 para PHP.

// Re-encrypt a data key $ciphertextBlob = 'Place your ciphertext here'; // Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos $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 AWS SDK for JavaScript in Node.js.

// Re-encrypt a data key const CiphertextBlob = 'Place your cipher text blob here'; // Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos 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 voltar a encriptar um texto de opt-up no mesmo ou diferente CMK, utilize o A invocar-kmsreencriptar sem.

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 versão 4.0 do AWSPowerShell, parâmetros em todos os módulos do AWSPowerShell que utilizam matrizes de bytes e objetos MemoryStream aceitam matrizes de bytes, objetos MemoryStream, strings, matrizes de strings e objetos FileInfo (System.IO.FileInfo). É 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' # Substitua os ARNs de chave de exemplo a seguir por identificadores de chave válidos $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 cmdlets do AWS KMS PowerShell, instale o módulo AWS.Tools.KeyManagementService. Para obter mais informações, consulte o Guia do usuário do AWS Tools para Windows PowerShell.