データキーの暗号化と復号 - AWS Key Management Service

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

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

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

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

データキーの暗号化

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

クライアントオブジェクトを必要とする言語では、これらの例では「クライアントの作成」で作成した AWS KMS クライアントオブジェクトを使用します。

Java

詳細については、『AWS SDK for Java API Reference』の「暗号化メソッド」を参照してください。

// 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 .NET』の「暗号化メソッド」を参照してください。

// 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 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 Ruby』の「encrypt」インスタンスメソッドを参照してください。

# 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 PHP』の「暗号化メソッド」を参照してください。

// 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 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; ... } });
PowerShell

AWS KMS CMK でデータキーを暗号化するには、Invoke-KMSEncrypt コマンドレットを使用します。これは、MemoryStream (System.IO.MemoryStream) オブジェクトとして暗号文を返します。この MemoryStream オブジェクトは Invoke-KMSDecrypt コマンドレットへの入力として使用できます。

AWS KMS もまた、データキーを MemoryStream オブジェクトとして返します。この例では、プレーンテキストのデータキーをシミュレートするために、バイト配列を作成して MemoryStream オブジェクトに書き込みます。

Invoke-KMSEncryptPlaintext パラメータは、バイト配列 (byte[]) を受けとります。MemoryStream オブジェクトは必要ありません。AWSPowerShell バージョン 4.0 以降、バイト配列と MemoryStream オブジェクトを受け取るすべての AWSPowerShell モジュールのパラメータは、バイト配列、MemoryStream オブジェクト、文字列、文字列配列FileInfo (System.IO.FileInfo) オブジェクトを受け入れます。これらのタイプのいずれも Invoke-KMSEncrypt に渡すことができます。

# Encrypt a data key # 以下の架空の CMK ARN を有効な CMK ID または ARN に置き換えます。 $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

データキーの復号化

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

指定する ciphertextBlob は、GenerateDataKeyGenerateDataKeyWithoutPlaintext、または Encrypt 応答からの CiphertextBlob フィールドの値、または GenerateDataKeyPair または GenerateDataKeyPairWithoutPlaintext からの PrivateKeyCiphertextBlob フィールドの値である必要があります。また、Decrypt オペレーションを使用して、非対称 CMK のパブリックキーによって AWS KMS 外部で暗号化されたデータを復号することもできます。

クライアントオブジェクトを必要とする言語では、これらの例では「クライアントの作成」で作成した AWS KMS クライアントオブジェクトを使用します。

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#

詳細については、『AWS SDK for .NET』の「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

詳細については、『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 Ruby』の「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

詳細については、『AWS SDK for PHP』の「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; ... } });
PowerShell

データキーを復号化するには、Invoke-KMSEncrypt コマンドレットを使用します。

このコマンドレットは、プレーンテキストを MemoryStream (System.IO.MemoryStream) オブジェクトとして返します。これをバイト配列に変換するには、「変換」モジュールの関数など、MemoryStream オブジェクトをバイト配列に変換するコマンドレットまたは関数を使用します。

この例では、AWS KMS 暗号化コマンドレットが返す暗号テキストを使用するため、 CiphertextBlob パラメータの値には MemoryStream オブジェクトを使用します。ただし、Invoke-KMSDecryptCiphertextBlob パラメータはバイト配列 (byte[]) を受けとります。MemoryStream オブジェクトは必要ありません。AWSPowerShell バージョン 4.0 以降、バイト配列と MemoryStream オブジェクトを受け取るすべての AWSPowerShell モジュールのパラメータは、バイト配列、MemoryStream オブジェクト、文字列、文字列配列FileInfo (System.IO.FileInfo) オブジェクトを受け入れます。これらのタイプのいずれも Invoke-KMSDecrypt に渡すことができます。

# Decrypt a data key [System.IO.MemoryStream]$ciphertext = Read-Host 'Place your cipher text blob here' $response = Invoke-KMSDecrypt -CiphertextBlob $ciphertext $plaintext = $response.Plaintext

異なるカスタマーマスターキーによるデータキーの再暗号化

暗号化されたデータキーを復号し、続いてすぐに異なるカスタマーマスターキー (CMK) でデータキーを再暗号化するには、再暗号化オペレーションを使用します。このオペレーションは AWS KMS 内のサーバー側で完全に実行されるため、プレーンテキストが AWS KMS の外部に公開されることはありません。

指定する ciphertextBlob は、GenerateDataKeyGenerateDataKeyWithoutPlaintext、または Encrypt 応答からの CiphertextBlob フィールドの値、または GenerateDataKeyPair または GenerateDataKeyPairWithoutPlaintext からの PrivateKeyCiphertextBlob フィールドの値である必要があります。また、ReEncrypt オペレーションを使用して、非対称 CMK のパブリックキーによって AWS KMS 外部で暗号化されたデータを暗号化することもできます。

クライアントオブジェクトを必要とする言語では、これらの例では「クライアントの作成」で作成した AWS KMS クライアントオブジェクトを使用します。

Java

詳細については、『AWS SDK for Java API Reference』の「reEncrypt メソッド」を参照してください。

// 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 .NET』の「ReEncrypt メソッド」を参照してください。

// 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 Ruby』の「re_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 PHP』の「ReEncrypt メソッド」を参照してください。

// 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.js』の「reEncrypt プロパティ」を参照してください。

// 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) => { ... });
PowerShell

同じ CMK または異なる CMK で暗号テキストを再暗号化するには、 Invoke-KMSReEncrypt コマンドレットを使用します。

この例では、AWS KMS 暗号化コマンドレットが返す暗号テキストを使用するため、 CiphertextBlob パラメータの値には MemoryStream オブジェクトを使用します。ただし、Invoke-KMSReEncryptCiphertextBlob パラメータはバイト配列 (byte[]) を受けとります。MemoryStream オブジェクトは必要ありません。AWSPowerShell バージョン 4.0 以降、バイト配列と MemoryStream オブジェクトを受け取るすべての AWSPowerShell モジュールのパラメータは、バイト配列、MemoryStream オブジェクト、文字列、文字列配列FileInfo (System.IO.FileInfo) オブジェクトを受け入れます。これらのタイプのいずれも Invoke-KMSReEncrypt に渡すことができます。

# Re-encrypt a data key [System.IO.MemoryStream]$ciphertextBlob = Read-Host 'Place your cipher text blob here' # 以下の架空の CMK ARN を有効な CMK ID または ARN に置き換えます。 $destinationKeyId = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' $response = Invoke-KMSReEncrypt -Ciphertext $ciphertextBlob -DestinationKeyId $destinationKeyId $reEncryptedCiphertext = $response.CiphertextBlob