AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

加密和解密数据密钥

本主题中的示例使用 AWS KMS API 中的 EncryptDecryptReEncrypt 操作。

这些操作专用于加密和解密数据密钥。它们在加密操作中使用 AWS KMS 客户主密钥 (CMK),而且它们无法接受 4 KB(4096 字节)以上的数据。尽管您可以使用它们来加密少量数据,例如密码或 RSA 密钥,但它们不用于加密应用程序数据。

要加密应用程序数据,请使用 AWS 服务的服务器端加密功能或客户端加密库,例如 AWS 加密 SDKAmazon S3 加密客户端

加密数据密钥

Encrypt 操作专用于加密数据密钥,但并不常用。GenerateDataKeyGenerateDataKeyWithoutPlaintext 操作会返回加密的数据密钥。在将加密的数据移动到新的区域并希望在新区域中使用 CMK 加密数据密钥时,可以使用此方法。

此示例使用您在AWS KMS中创建的 创建客户端 客户端对象。

JavaC#PythonRubyPHPNode.js
Java

有关详细信息,请参阅 AWS SDK for Java API Reference 中的 encrypt 方法

// Encrypt a data key // // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN 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#

有关详细信息,请参阅 适用于 .NET 的 AWS 开发工具包 中的 Encrypt 方法

// Encrypt a data key // // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN 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

有关详细信息,请参阅 适用于 Python 的 AWS 开发工具包 (Boto3) 中的 encrypt 方法

# Encrypt a data key # 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN 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

有关详细信息,请参阅 适用于 Ruby 的 AWS 开发工具包 中的 encrypt 实例方法。

# Encrypt a data key # 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN keyId = '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: keyId, plaintext: plaintext }) ciphertext = response.ciphertext_blob
PHP

有关详细信息,请参阅 适用于 PHP 的 AWS 开发工具包 中的 Encrypt 方法

// Encrypt a data key // // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN $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

有关详细信息,请参阅 AWS SDK for JavaScript in Node.js 中的 encrypt 属性

// Encrypt a data key // // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN 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; ... } });

解密数据密钥

要解密数据密钥,请使用 Decrypt 操作。

您指定的 ciphertextBlob 必须为 GenerateDataKeyGenerateDataKeyWithoutPlaintextEncrypt 响应中 CiphertextBlob 字段的值。

此示例使用您在AWS KMS中创建的 创建客户端 客户端对象。

JavaC#PythonRubyPHPNode.js
Java

有关详细信息,请参阅 AWS SDK for Java API Reference 中的 decrypt 方法

// Decrypt a data key // ByteBuffer ciphertextBlob = Place your ciphertext here; DecryptRequest req = new DecryptRequest().withCiphertextBlob(ciphertextBlob); ByteBuffer plainText = kmsClient.decrypt(req).getPlaintext();
C#

有关详细信息,请参阅 适用于 .NET 的 AWS 开发工具包 中的 Decrypt 方法

// Decrypt a data key // MemoryStream ciphertextBlob = new MemoryStream(); // Write ciphertext to memory stream DecryptRequest decryptRequest = new DecryptRequest() { CiphertextBlob = ciphertextBlob }; MemoryStream plainText = kmsClient.Decrypt(decryptRequest).Plaintext;
Python

有关详细信息,请参阅 适用于 Python 的 AWS 开发工具包 (Boto3) 中的 decrypt 方法

# Decrypt a data key ciphertext = 'Place your ciphertext here' response = kms_client.decrypt( CiphertextBlob=ciphertext ) plaintext = response['Plaintext']
Ruby

有关详细信息,请参阅 适用于 Ruby 的 AWS 开发工具包 中的 decrypt 实例方法。

# Decrypt a data key ciphertext = 'Place your ciphertext here' ciphertext_packed = [ciphertext].pack("H*") response = kmsClient.decrypt({ ciphertext_blob: ciphertext_packed }) plaintext = response.plaintext
PHP

有关详细信息,请参阅 适用于 PHP 的 AWS 开发工具包 中的 Decrypt 方法

// Decrypt a data key // $ciphertext = 'Place your cipher text blob here'; $result = $KmsClient->decrypt([ 'CiphertextBlob' => $ciphertext ]); $plaintext = $result['Plaintext'];
Node.js

有关详细信息,请参阅 AWS SDK for JavaScript in Node.js 中的 decrypt 属性

// Decrypt a data key // const CiphertextBlob = 'Place your cipher text blob here'; kmsClient.decrypt({ CiphertextBlob }, (err, data) => { if (err) console.log(err, err.stack); // an error occurred else { const { Plaintext } = data; ... } });

在不同的客户主密钥下重新加密数据密钥

要解密已加密数据密钥,然后立即在其他客户主密钥 (CMK) 下重新加密该数据密钥,请使用 ReEncrypt 操作。这些操作全部都在 AWS KMS 内的服务器端执行,因此它们永远不会将您的明文在 AWS KMS 外公开。

您指定的 ciphertextBlob 必须为 GenerateDataKeyGenerateDataKeyWithoutPlaintextEncrypt 响应中 CiphertextBlob 字段的值。

此示例使用您在AWS KMS中创建的 创建客户端 客户端对象。

JavaC#PythonRubyPHPNode.js
Java

有关详细信息,请参阅 AWS SDK for Java API Reference 中的 reEncrypt 方法

// Re-encrypt a data key ByteBuffer sourceCiphertextBlob = Place your ciphertext here; // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN String destinationKeyId = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; ReEncryptRequest req = new ReEncryptRequest(); req.setCiphertextBlob(sourceCiphertextBlob); req.setDestinationKeyId(destinationKeyId); ByteBuffer destinationCipherTextBlob = kmsClient.reEncrypt(req).getCiphertextBlob();
C#

有关详细信息,请参阅 适用于 .NET 的 AWS 开发工具包 中的 ReEncrypt 方法

// Re-encrypt a data key MemoryStream sourceCiphertextBlob = new MemoryStream(); // Write ciphertext to memory stream // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN String destinationKeyId = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; ReEncryptRequest reEncryptRequest = new ReEncryptRequest() { CiphertextBlob = sourceCiphertextBlob, DestinationKeyId = destinationKeyId }; MemoryStream destinationCipherTextBlob = kmsClient.ReEncrypt(reEncryptRequest).CiphertextBlob;
Python

有关详细信息,请参阅 适用于 Python 的 AWS 开发工具包 (Boto3) 中的 re_encrypt 方法

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' # 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN key_id = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' response = kms_client.re_encrypt( CiphertextBlob=ciphertext, DestinationKeyId=key_id ) destination_ciphertext_blob = response['CiphertextBlob']
Ruby

有关详细信息,请参阅 适用于 Ruby 的 AWS 开发工具包 中的 re_encrypt 实例方法。

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' ciphertext_packed = [ciphertext].pack("H*") # 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN keyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' response = kmsClient.re_encrypt({ ciphertext_blob: ciphertext_packed, destination_key_id: keyId }) destination_ciphertext_blob = response.ciphertext_blob.unpack('H*')
PHP

有关详细信息,请参阅 适用于 PHP 的 AWS 开发工具包 中的 ReEncrypt 方法

// Re-encrypt a data key $ciphertextBlob = 'Place your ciphertext here'; // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN $keyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321'; $result = $KmsClient->reEncrypt([ 'CiphertextBlob' => $ciphertextBlob, 'DestinationKeyId' => $keyId, ]);
Node.js

有关详细信息,请参阅 AWS SDK for JavaScript in Node.js 中的 reEncrypt 属性

// Re-encrypt a data key const CiphertextBlob = 'Place your cipher text blob here'; // 使用有效的 CMK ID 或 ARN 替换以下虚拟 CMK ARN const DestinationKeyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321'; kmsClient.reEncrypt({ CiphertextBlob, DestinationKeyId }, (err, data) => { ... });