Chiffrement et déchiffrement des clés de données - AWS Key Management Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Chiffrement et déchiffrement des clés de données

Les exemples présentés dans cette rubrique utilisent le chiffrement, le déchiffrement et les ReEncryptopérations de l'AWS KMSAPI.

Ces opérations sont conçues pour chiffrer et déchiffrer des clés de données. Elles utilisent une AWS KMS keys dans les opérations de chiffrement et ne peuvent pas accepter plus de 4 Ko (4 096 octets) de données. Même si vous pouvez les utiliser pour chiffrer des petits volumes de données, comme un mot de passe ou une clé RSA, ces opérations ne sont pas conçues pour chiffrer des données d'application.

Pour chiffrer des données d'application, utilisez les fonctions de chiffrement côté serveur d'un service AWS, une bibliothèque de chiffrement côté client comme AWS Encryption SDK ou le client de chiffrement Amazon S3.

Chiffrement d'une clé de données

L'opération Encrypt est conçue pour chiffrer des clés de données, mais elle n'est pas fréquemment utilisée. Les GenerateDataKeyWithoutPlaintextopérations GenerateDataKeyet renvoient des clés de données chiffrées. Vous pouvez utiliser cette méthode lorsque vous déplacez des données chiffrées vers une région différente et que vous souhaitez chiffrer leur clé de données à l'aide d'une clé KMS dans la nouvelle région.

Dans les langues qui nécessitent un objet client, ces exemples utilisent l'objet client AWS KMS que vous avez créé dans Création d'un client.

Java

Pour obtenir des détails, veuillez consulter la méthode encrypt dans la Référence d'API 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#

Pour obtenir des détails, consultez la méthode Encrypt dans le kit 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

Pour obtenir des détails, consultez la méthode encrypt dans la 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

Pour obtenir des détails, consultez la méthode d'instance encrypt dans le kit 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

Pour obtenir des détails, consultez la méthode Encrypt dans le kit 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

Pour plus de détails, consultez la propriété encrypt dans le AWS SDK pour Node.js JavaScript .

// 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

Pour chiffrer une clé de données sous une clé KMS, utilisez l'applet de commande Invoke-KMSEncrypt. Il renvoie le texte chiffré sous la forme d'un MemoryStream (System.IO). MemoryStream) objet. Vous pouvez utiliser l'objet MemoryStream comme entrée de l'applet de commande Invoke-KMSDecrypt.

AWS KMS renvoie également des clés de données en tant qu'objets MemoryStream. Dans cet exemple, pour simuler une clé de données en texte brut, nous créons un tableau d'octets et l'écrivons dans un objet MemoryStream.

Notez que le paramètre Plaintext de Invoke-KMSEncrypt prend un tableau d'octets (byte[]) ; il ne nécessite pas d'objet MemoryStream. À partir de AWSPowerShell la version 4.0, les paramètres de tous les AWSPowerShell modules qui acceptent des tableaux d'octets et MemoryStream des objets acceptent les tableaux d'octets, les MemoryStream objets, les chaînes, les tableaux de chaînes et FileInfo (System.IO). FileInfo) objets. Vous pouvez passer n'importe lequel de ces types à 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

Pour utiliser les AWS KMS PowerShell applets de commande, installez le fichier AWS.tools. KeyManagementServicemodule. Pour plus d’informations, consultez le Guide de l’utilisateur AWS Tools for Windows PowerShell.

Déchiffrement d'une clé de données

Pour déchiffrer une clé de données, utilisez l'opération Decrypt.

La valeur ciphertextBlob que vous spécifiez doit être la valeur du CiphertextBlob champ provenant d'une réponse GenerateDataKeyGenerateDataKeyWithoutPlaintext, ou Chiffrer, ou le PrivateKeyCiphertextBlob champ d'une GenerateDataKeyPairWithoutPlaintextréponse GenerateDataKeyPairou. Vous pouvez également utiliser l'opération Decrypt pour déchiffrer des données chiffrées en dehors de AWS KMS par la clé publique dans une clé KMS asymétrique.

Le paramètre KeyId n'est pas requis lors du déchiffrement avec des clés KMS de chiffrement symétriques. AWS KMS peut obtenir la clé KMS utilisée pour chiffrer les données à partir des métadonnées dans le blob de texte chiffré. Toutefois, la spécification de la clé KMS que vous utilisez est une bonne pratique. Cette pratique garantit que vous utilisez la clé KMS prévue et vous empêche de déchiffrer par inadvertance un texte chiffré à l'aide d'une clé KMS non fiable.

Dans les langues qui nécessitent un objet client, ces exemples utilisent l'objet client AWS KMS que vous avez créé dans Création d'un client.

Java

Pour obtenir des détails, veuillez consulter la méthode decrypt dans la Référence d'API 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#

Pour obtenir des détails, consultez la méthode Decrypt dans le kit 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

Pour obtenir des détails, consultez la méthode decrypt dans la 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

Pour obtenir des détails, consultez la méthode d'instance decrypt dans le kit 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

Pour obtenir des détails, consultez la méthode Decrypt dans le kit 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

Pour plus de détails, consultez la propriété de déchiffrement dans le AWSSDK pour JavaScript dans Node.js.

// 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

Pour déchiffrer une clé de données, utilisez l'applet de commande Invoke-KMSEncrypt.

Cette applet de commande renvoie le texte en clair sous la forme d'un MemoryStream fichier (System.IO). MemoryStream) objet. Pour le convertir en tableau d'octets, utilisez des applets de commande ou des fonctions qui convertissent des objets MemoryStream en tableaux d'octets, telles que les fonctions du module Convert.

Étant donné que cet exemple utilise le texte chiffré renvoyé par une applet de commande de chiffrement AWS KMS, il utilise un objet MemoryStream pour la valeur du paramètre CiphertextBlob. Cependant, le paramètre CiphertextBlob de Invoke-KMSDecrypt prend un tableau d'octets (byte[]) ; il ne nécessite pas d'objet MemoryStream. À partir de AWSPowerShell la version 4.0, les paramètres de tous les AWSPowerShell modules qui acceptent des tableaux d'octets et MemoryStream des objets acceptent les tableaux d'octets, les MemoryStream objets, les chaînes, les tableaux de chaînes et FileInfo (System.IO). FileInfo) objets. Vous pouvez passer n'importe lequel de ces types à 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

Pour utiliser les AWS KMS PowerShell applets de commande, installez le fichier AWS.tools. KeyManagementServicemodule. Pour plus d’informations, consultez le Guide de l’utilisateur AWS Tools for Windows PowerShell.

Rechiffrement d'une clé de données sous une autre AWS KMS key

Pour déchiffrer une clé de données chiffrée, puis la rechiffrer immédiatement sous une autre cléAWS KMS key, utilisez l'opération. ReEncrypt Les opérations sont effectuées entièrement côté serveur dans AWS KMS, pour que votre texte brut ne soit jamais exposé en dehors d'AWS KMS.

La valeur ciphertextBlob que vous spécifiez doit être la valeur du CiphertextBlob champ provenant d'une réponse GenerateDataKeyGenerateDataKeyWithoutPlaintext, ou Chiffrer, ou le PrivateKeyCiphertextBlob champ d'une GenerateDataKeyPairWithoutPlaintextréponse GenerateDataKeyPairou. Vous pouvez également utiliser l'opération ReEncrypt pour rechiffrer les données chiffrées en dehors de AWS KMS par la clé publique dans une clé KMS asymétrique.

Le paramètre SourceKeyId n'est pas requis lors du rechiffrement avec des clés KMS de chiffrement symétriques. AWS KMS peut obtenir la clé KMS utilisée pour chiffrer les données à partir des métadonnées dans le blob de texte chiffré. Toutefois, la spécification de la clé KMS que vous utilisez est une bonne pratique. Cette pratique garantit que vous utilisez la clé KMS prévue et vous empêche de déchiffrer par inadvertance un texte chiffré à l'aide d'une clé KMS non fiable.

Dans les langues qui nécessitent un objet client, ces exemples utilisent l'objet client AWS KMS que vous avez créé dans Création d'un client.

Java

Pour obtenir des détails, veuillez consulter la méthode reEncrypt dans la Référence d'API 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#

Pour obtenir des détails, consultez la méthode ReEncrypt dans 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

Pour obtenir des détails, consultez la méthode re_encrypt dans 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

Pour obtenir des détails, consultez la méthode d'instance re_encrypt dans le kit 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

Pour obtenir des détails, consultez la méthode ReEncrypt dans 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

Pour plus de détails, consultez la propriété ReEncrypt dans AWSle SDK JavaScript pour 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

Pour rechiffrer un texte chiffré sous la même clé KMS ou une clé différente, utilisez l'applet de commande Invoke-KMS. ReEncrypt

Étant donné que cet exemple utilise le texte chiffré renvoyé par une applet de commande de chiffrement AWS KMS, il utilise un objet MemoryStream pour la valeur du paramètre CiphertextBlob. Cependant, le paramètre CiphertextBlob de Invoke-KMSReEncrypt prend un tableau d'octets (byte[]) ; il ne nécessite pas d'objet MemoryStream. À partir de AWSPowerShell la version 4.0, les paramètres de tous les AWSPowerShell modules qui acceptent des tableaux d'octets et MemoryStream des objets acceptent les tableaux d'octets, les MemoryStream objets, les chaînes, les tableaux de chaînes et FileInfo (System.IO). FileInfo) objets. Vous pouvez passer n'importe lequel de ces types à 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

Pour utiliser les AWS KMS PowerShell applets de commande, installez le fichier AWS.tools. KeyManagementServicemodule. Pour de plus amples informations, veuillez consulter le Guide de l'utilisateur AWS Tools for Windows PowerShell.