AWS Key Management Service
開発者ガイド

データキーの暗号化と復号化

このトピックの例では、AWS KMS API で EncryptDecryptReEncrypt オペレーションを使用します。

これらのオペレーションは、データキーを暗号化および復号化するように設計されています。ここでは、暗号化オペレーションに AWS KMS カスタマーマスターキー (CMK) を使用しますが、4 KB (4096 bytes) 以上のデータを受け付けません。パスワードや RSA キーなどの少量データを暗号化するためにこれを使用できますが、アプリケーションデータを暗号化するために設計されていません。

アプリケーションデータを暗号化するには、AWS サービスのサーバー側の暗号化機能、あるいはクライアント側の暗号化ライブラリを使用します (AWS 暗号化 SDKAmazon S3 encryption client など)。

データキーの暗号化

暗号化 オペレーションは、データキーを暗号化するように設計されていますが、頻繁には使用されていません。GenerateDataKey および GenerateDataKeyWithoutPlaintext オペレーションは、暗号化されたデータキーを返します。暗号化されたデータを新しいリージョンに移動し、この新しいリージョンで CMK でデータキーを暗号化するときにこのメソッドを使用できます。

次の例では、「クライアントの作成」で作成した KMS クライアントオブジェクトを使用します。

JavaC#PythonRubyPHPNode.js
Java

詳細については、AWS SDK for Java API Referenceencrypt メソッドを参照してください。

// Encrypt a data key // // 以下の架空の CMK ARN を有効な CMK ID または 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#

詳細については、AWS SDK for .NETEncrypt メソッドを参照してください。

// Encrypt a data key // // 以下の架空の CMK ARN を有効な CMK ID または 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

詳細については、AWS SDK for Python (Boto3) の encrypt メソッドを参照してください。

# Encrypt a data key # 以下の架空の CMK ARN を有効な CMK ID または 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

詳細については、AWS SDK for Rubyencrypt インスタンスメソッドを参照してください。

# Encrypt a data key # 以下の架空の CMK ARN を有効な CMK ID または 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

詳細については、AWS SDK for PHPEncrypt メソッドを参照してください。

// Encrypt a data key // // 以下の架空の CMK ARN を有効な CMK ID または 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 ARN を有効な CMK ID または 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; ... } });

データキーの復号化

データキーを復号するには、復号 オペレーションを使用します。

指定する ciphertextBlob は、GenerateDataKeyGenerateDataKeyWithoutPlaintext あるいは暗号化レスポンスからの CiphertextBlob フィールド値である必要があります。

次の例では、「クライアントの作成」で作成した KMS クライアントオブジェクトを使用します。

JavaC#PythonRubyPHPNode.js
Java

詳細については、AWS SDK for Java API Referencedecrypt メソッドを参照してください。

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

詳細については、AWS SDK for .NETDecrypt メソッドを参照してください。

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

詳細については、AWS SDK for Python (Boto3) の decrypt メソッドを参照してください。

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

詳細については、AWS SDK for Rubydecrypt インスタンスメソッドを参照してください。

# 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

詳細については、AWS SDK for PHPDecrypt メソッドを参照してください。

// 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.jsdecrypt プロパティを参照してください。

// 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) でデータキーを再暗号化するには、再暗号化オペレーションを使用します。このオペレーションは AWS KMS 内のサーバー側で完全に実行されるため、プレーンテキストが AWS KMS の外部に公開されることはありません。

指定する ciphertextBlob は、GenerateDataKeyGenerateDataKeyWithoutPlaintext あるいは暗号化レスポンスからの CiphertextBlob フィールド値である必要があります。

次の例では、「クライアントの作成」で作成した KMS クライアントオブジェクトを使用します。

JavaC#PythonRubyPHPNode.js
Java

詳細については、AWS SDK for Java API ReferencereEncrypt メソッドを参照してください。

// Re-encrypt a data key ByteBuffer sourceCiphertextBlob = Place your ciphertext here; // 以下の架空の CMK ARN を有効な CMK ID または 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#

詳細については、AWS SDK for .NETReEncrypt メソッドを参照してください。

// Re-encrypt a data key MemoryStream sourceCiphertextBlob = new MemoryStream(); // Write ciphertext to memory stream // 以下の架空の CMK ARN を有効な CMK ID または 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

詳細については、AWS SDK for Python (Boto3) の re_encrypt メソッドを参照してください。

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' # 以下の架空の CMK ARN を有効な CMK ID または 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

詳細については、AWS SDK for Rubyre_encrypt インスタンスメソッドを参照してください。

# Re-encrypt a data key ciphertext = 'Place your ciphertext here' ciphertext_packed = [ciphertext].pack("H*") # 以下の架空の CMK ARN を有効な CMK ID または 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

詳細については、AWS SDK for PHPReEncrypt メソッドを参照してください。

// Re-encrypt a data key $ciphertextBlob = 'Place your ciphertext here'; // 以下の架空の CMK ARN を有効な CMK ID または 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.jsreEncrypt プロパティを参照してください。

// Re-encrypt a data key const CiphertextBlob = 'Place your cipher text blob here'; // 以下の架空の CMK ARN を有効な CMK ID または ARN に置き換えます。 const DestinationKeyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321'; kmsClient.reEncrypt({ CiphertextBlob, DestinationKeyId }, (err, data) => { ... });