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

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

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

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

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

データキーの暗号化

Encrypt 操作は、データキーを暗号化するように設計されていますが、頻繁に使用されていません。 データ作成 および テキスト作成の生成 操作は、暗号化されたデータキーを返します。暗号化データを別のリージョンに移動し、新しいリージョンで KMS キーを使用してデータキーを暗号化するときに、このメソッドを使用できます。

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

Java

詳細については、AWS SDK for Java API リファレンス暗号化メソッドを参照してください。

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

詳細については、https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/KeyManagementService/MKeyManagementServiceEncryptEncryptRequest.html の AWS SDK for .NETEncrypt メソッドを参照してください。

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

詳細については、encryptAWS 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

詳細については、https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/KMS/Client.html#encrypt-instance_method の AWS SDK for Rubyencrypt インスタンスメソッドを参照してください。

# 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

詳細については、https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-kms-2014-11-01.html#encrypt の AWS SDK for PHPEncrypt メソッドを参照してください。

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

詳細については、AWS SDK for JavaScript in Node.js の暗号化プロパティを参照してください。

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

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

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

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

AWS KMS PowerShell コマンドレットを使用するには、AWS.Tools.KeyManagementService モジュールをインストールします。詳細については、AWS Tools for Windows PowerShell ユーザーガイドを参照してください。

データキーの復号化

データキーを復号化するには、 復号化 操作を使用します。

指定する ciphertextBlob は、以下の値である必要があります。: GenerateDataKeyGenerateDataKeyWithoutPlaintextEncrypt レスポンスからの CiphertextBlob フィールド、GenerateDataKeyPair からの PrivateKeyCiphertextBlob フィールド、GenerateDataKeyPairWithoutPlaintext レスポンス。また、Decrypt オペレーションを使用して、非対称 KMS キーの公開キーによって AWS KMS 外部で暗号化されたデータを復号することもできます。

対称 KMS キーで復号する場合、KeyId パラメータは不要です。AWS KMS は、暗号化テキストの blob でメタデータからデータを暗号化するために使用された KMS キーを取得できます。ただし、ベストプラクティスは常に、使用している KMS キーを指定することです。この方法により、意図した KMS キーを使用することができ、信頼できない KMS キーを使用して暗号化テキストが誤って復号されるのを防ぐことができます。

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

Java

詳細については、AWS SDK for Java API リファレンス復号メソッドを参照してください。

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

詳細については、https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/KeyManagementService/MKeyManagementServiceDecryptDecryptRequest.html の AWS SDK for .NETDecrypt メソッドを参照してください。

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

詳細については、decrypt メソッド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

詳細については、https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/KMS/Client.html#decrypt-instance_method の AWS SDK for Rubydecrypt インスタンスメソッドを参照してください。

# 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

詳細については、https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-kms-2014-11-01.html#decrypt の AWS SDK for PHPDecrypt メソッドを参照してください。

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

詳細については、AWS SDK for JavaScript in 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

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

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

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

AWS KMS PowerShell コマンドレットを使用するには、AWS.Tools.KeyManagementService モジュールをインストールします。詳細については、AWS Tools for Windows PowerShell ユーザーガイドを参照してください。

異なる AWS KMS key によるデータキーの再暗号化

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

指定する ciphertextBlob は、以下の値である必要があります。: GenerateDataKeyGenerateDataKeyWithoutPlaintextEncrypt レスポンスからの CiphertextBlob フィールド、GenerateDataKeyPair からの PrivateKeyCiphertextBlob フィールド、GenerateDataKeyPairWithoutPlaintext レスポンス。また、ReEncrypt オペレーションを使用し、非対称 KMS キーの公開キーによって、AWS KMS 外部で暗号化されたデータを再暗号化することもできます。

対称 KMS キーで再暗号化する場合、SourceKeyId パラメータは不要です。AWS KMS は、暗号化テキストの blob でメタデータからデータを暗号化するために使用された KMS キーを取得できます。ただし、ベストプラクティスは常に、使用している KMS キーを指定することです。この方法により、意図した KMS キーを使用することができ、信頼できない KMS キーを使用して暗号化テキストが誤って復号されるのを防ぐことができます。

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

Java

詳細については、AWS SDK for Java API リファレンス再暗号化メソッドを参照してください。

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

詳細については、https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/KeyManagementService/MKeyManagementServiceReEncryptReEncryptRequest.html の AWS SDK for .NETReEncrypt メソッドを参照してください。

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

詳細については、re_encrypt メソッド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

詳細については、https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/KMS/Client.html#re_encrypt-instance_method の AWS SDK for Rubyre_encrypt インスタンスメソッドを参照してください。

# 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

詳細については、https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-kms-2014-11-01.html#reencrypt の AWS SDK for PHPReEncrypt メソッドを参照してください。

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

詳細については、AWS SDK for JavaScript in 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

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

この例では、AWS KMS 暗号化コマンドレットが返す暗号テキストを使用するため、 MemoryStream パラメータの値には CiphertextBlob オブジェクトを使用します。ただし、CiphertextBlobInvoke-KMSReEncrypt パラメータはバイト配列 (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' # 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

AWS KMS PowerShell コマンドレットを使用するには、AWS.Tools.KeyManagementService モジュールをインストールします。詳細については、AWS Tools for Windows PowerShell ユーザーガイドをご参照ください。