キーリングの使用 - AWS Encryption SDK

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

キーリングの使用

AWS Encryption SDK for C と AWS Encryption SDK for JavaScript では、キーリングを使用してエンベロープの暗号化を行います。データキーの生成、暗号化、復号は、キーリングによって行われます。使用するキーリングによって、それぞれのメッセージを保護する一意のデータキーのソースと、そのデータキーを暗号化するラッピングキーが決まります。キーリングは暗号化時に指定し、復号時には同じキーリングか別のキーリングを指定します。SDK で提供されるキーリングを使用するか、互換性のある独自のカスタムキーリングを作成できます。

各キーリングを個別に使用するか、キーリングを組み合わせてマルチキーリングにすることができます。ほとんどのキーリングではデータキーを生成、暗号化、および復号することができますが、特定のオペレーションを 1 つのみ実行するキーリング (例: データキーのみを生成するキーリング) を作成し、他のキーリングと組み合わせて使用することができます。

ラッピングキーを保護し、安全な境界内で暗号化オペレーションを実行するキーリング (例:AWS KMSキーリング、AWS Key Management Service(AWS KMS)カスタマーマスターキー(CMK)は、決して離れることはありませんAWS KMS暗号化されていません。ハードウェアセキュリティモジュール (HSM) に保存されている、または他のマスターキーサービスによって保護されているラッピングキーを使用するキーリングを作成することもできます。詳細については、「」を参照してください。キーリングのインターフェイストピックのAWS Encryption SDK仕様

このトピックでは、AWS Encryption SDK のキーリング機能を使用する方法とキーリングを選択する方法について説明します。キーリングの作成と使用の例については、C および JavaScript のトピックを参照してください。

キーリングのしくみ

使用するときに行う最も重要なタスクの 1 つに、 AWS Encryption SDK for C または JavaScript がキーリングを選択および構成しています。キーリングは、データキーの生成、暗号化、復号を行います。それぞれのキーリングは、通常、ラッピングキーまたはラッピングキーを提供および保護するサービスに関連付けられます。AWS Encryption SDK で提供されるキーリングを使用するか、互換性のある独自のカスタムキーリングを作成できます。キーリングの選択については、各キーリングについて説明する以下のセクションを参照してください。

キーリングを使用すると、データの暗号化と復号に使用するラッピングキーを決定しやすくなります。キーリングは、AWS Encryption SDK の Java および Python の実装において、マスターキープロバイダーの代わりに使用することができます。このアーキテクチャの違いと言語による制約にかかわらず、すべての言語の実装は完全に相互運用できます。ただし、同じまたは対応するラッピングキーを使用して、キーリングとマスターキープロバイダーを設定する必要があります。詳細については、「キーリングの互換性」を参照してください。

キーリングをインスタンス化して設定しますが、直接操作することはありません。-暗号化マテリアルマネージャー(CMM) は、キーリングとやり取りします。

データを暗号化する場合、CMM によって暗号化マテリアルのキーリングを求められます。キーリングは、プレーンテキストのキーと、キーリングの各ラッピングキーによって暗号化されたキーのコピーを返します。AWS Encryption SDK は、プレーンテキストのキーを使用してデータを暗号化し、そのデータと暗号化されたデータキーをそれから返す暗号化されたメッセージに格納します。


                CMM およびキーリングを使用した暗号化

データを復号化すると、CMM は暗号化されたメッセージから暗号化キーを渡し、それらのいずれかを復号するようにキーリングに要求します。キーリングは、ラッピングキーを使用して暗号化されたデータキーのいずれかを復号し、プレーンテキストのデータキーを返します。AWS Encryption SDK は、プレーンテキストのデータキーを使用してデータを復号します。キーリングのラッピングキーのいずれも暗号化されたデータキーを復号できない場合は、復号は失敗します。


                CMM およびキーリングを使用した復号

単一のキーリングを使用するか、同じタイプまたは異なるタイプのキーリングを組み合わせてマルチキーリングにすることもできます。データを暗号化すると、マルチキーリングは、マルチキーリングを構成するすべてのキーリングのすべてのラッピングキーで暗号化されたデータキーのコピーを返します。データは、マルチキーリングのラッピングキーのいずれかで設定されたキーリングを使用して復号できます。

キーリングの互換性

Java、Python、C、およびJavaScriptの実装はAWS Encryption SDKにはいくつかのアーキテクチャの違いと言語による制約はありますが、完全に互換性があるように設計されています。あるプログラミング言語の実装によってデータを暗号化し、それを他の言語の実装で復号することができます。ただし、データキーの暗号化と復号には、同じマスターキーまたは対応するマスターキーを使用する必要があります。言語による制約については、各言語の実装についてのトピック ( AWS Encryption SDK for JavaScript の「 AWS Encryption SDK for JavaScript の互換性」のトピックなど) を参照してください。

次の表は、で提供されているキーリングと互換性があるマスターキーおよびマスターキープロバイダーを示しています。 AWS Encryption SDK for C と AWS Encryption SDK for JavaScript 。言語の制約によるマイナーな非互換性については、言語実装に関するトピックで説明されています。

互換性のあるキーリングおよびマスターキープロバイダー
キーリング: C および JavaScript マスターキープロバイダー: Java および Python
AWS KMS キーリング

KmsMasterKey (Java)

KmsMasterKeyProvider (Java)

KmsMasterKey (Python)

KmsMasterKeyProvider (Python)

Raw AES キーリング

対称暗号化キーと一緒に使用する場合:

JceMasterKey (Java)

RawMasterKey (Python)

Raw RSA キーリング

非対称暗号化キーと一緒に使用する場合:

JceMasterKey (Java)

RawMasterKey (Python)

復号化するとき、Java および Python の実装はAWS KMS検出キーリングつまり、暗号化されたデータキーの復号に使用可能な CMK は制限されません。また、Java および Python の SDK では AWS KMS リージョン検出キーリングと同等の機能は提供されていませんが、カスタムのキーリングを作成することができます。

AWS KMS キーリング

アンAWS KMSキーリングの使用AWS Key Management Service(AWS KMS) 対称カスタマーマスターキー(CMK) を使用して、データキーを生成、暗号化、復号できます。AWS KMSは、マスターキーを保護し、FIPS 境界内で暗号化操作を実行します。を使用することをお勧めします。AWS KMS可能な限り、キーリング、または同様のセキュリティ特性を持つキーリングです。

次を使用できます。AWS KMSマルチリージョンキーAWS KMSキーリングまたはマスターキープロバイダーバージョン 2.3。xのAWS Encryption SDKおよびバージョン 3.0。xのAWS暗号化 CLI。新しいマルチリージョン対応シンボルの使用方法と使用例については、マルチリージョン KMS キーの使用。マルチリージョンキーの詳細については、「」を参照してください。マルチリージョンキーを使用する()AWS Key Management Service開発者ガイド

注記

のすべてのメンションKMS キーリング()AWS Encryption SDKを参照してください。AWS KMSキーリング

アンAWS KMSキーリングには、ジェネレータキーは、データを保護して暗号化するプレーンテキストのデータキーを生成する CMK です。また、同じプレーンテキストのデータキーを暗号化する追加の CMK を持つこともできます。暗号化すると、AWS KMS使用するキーリングには、ジェネレーターキーが必要です。復号時には、ジェネレーターキーは必要ありません。復号化時に、AWS KMSキーリングを使用して、暗号化されたデータキーを復号することができます。

すべてのキーリングと同様に、AWS KMSキーリングは独立して使用することも、マルチキーリング同じまたは別のタイプの他のキーリングと一緒に。

に必要なアクセス許可AWS KMSキーリング

AWS Encryption SDK は、AWS アカウントを必須としておらず、どの AWS のサービスにも依存していません。ただし、AWS Key Management Service(AWS KMS)カスタマーマスターキー(CMK)AWS KMSキーリングを使用するには、AWSアカウントと、キーリング内の CMK に対する以下の最低限のアクセス許可が必要です。

  • を使用して暗号化するにはAWS KMSキーリング、必要なものkms:GenerateDataKey権限をジェネレータキーに割り当てます。あなたが必要ですkms:Encryptの追加のすべてのキーに対するAWS KMSキーリング

  • を使用した復号AWS KMSキーリング、必要なものkms:Decryptの少なくとも 1 つのキーに対してAWS KMSキーリング

  • マルチキーリングで暗号化するにはAWS KMSキーリング、必要なものkms:GenerateDataKeyパーミッションをジェネレータキーリングでジェネレータキーに割り当てます。あなたが必要ですkms:Encrypt他のすべてのキーに対する権限AWS KMSキーリング

のアクセス許可の詳細については、「」を参照してください。AWS KMSカスタマーマスターキーは、「」を参照してください。に対する認証とアクセスコントロールAWS KMS()AWS Key Management Service開発者ガイド

での CMK の識別AWS KMSキーリング

アンAWS KMSキーリングには、の 1 つ以上のAWS KMSカスタマーマスターキー (CMK) CMK をAWS KMSキーリングを使用するには、サポートされているAWS KMSキー識別子。キーリングの CMK を識別するために使用できるキー識別子は、オペレーションと言語の実装によって異なります。のキー識別子の詳細については、「」を参照してください。AWS KMSCMK の詳細については、を参照してください。キー識別子()AWS Key Management Service開発者ガイド

  • 暗号化キーリングでは、キー ARNまたはエイリアス ARNCMK を識別します。一部の言語の実装では、他の形式も使用できます。

  • 復号キーリングでは、キー ARN を使用して CMK を指定する必要があります。この要件は、AWS Encryption SDK のすべての言語の実装に適用されます。詳細については、「ラッピングキーの指定」を参照してください。

  • 暗号化および復号に使用するキーリングでは、キー ARN を使用して CMK を指定する必要があります。この要件は、AWS Encryption SDK のすべての言語の実装に適用されます。

を使用した暗号化AWS KMSキーリング

それぞれのAWS KMS単一の CMK または複数の CMK を使用したキーリングAWSアカウントとAWSリージョン また、を設定することもできますAWS KMS検出キーリングで CMK はありません。すべてのキーリングと同様に、1 つ以上のAWS KMSキーリングの作成マルチキーリング

を作成するときAWS KMSキーリングを使用してデータを暗号化するには、ジェネレータキーは、プレーンテキストのデータキーを生成してそれを暗号化する CMK です。その後、選択した場合は、同一のプレーンテキストのデータキーを暗号化する追加の CMK を指定することができます。-暗号化されたメッセージということは、AWS Encryption SDK戻りには、暗号文と暗号化されたすべてのデータキーが含まれます。呼び出し元は、kms:GenerateDataKey権限、およびジェネレータ CMKkms:Encryptすべての追加の CMK に対する権限を付与します。

たとえば、次のAWS KMSキーリングでは、ジェネレーターキーと 1 つの追加のキーを指定します。このキーリングを使用してデータを暗号化すると、ジェネレーターキーによって生成された 1 つのプレーンテキストのデータキーと、ジェネレーターキーと追加のキーによってそれぞれ暗号化された 2 つの暗号化されたデータキーが返されます。このキーリングで保護されているデータを復号するには、使用するキーリングにデータキーを暗号化した CMK のいずれかが含まれているか、CMK が含まれていない必要があります。(AnAWS KMSCMK のないキーリングはAWS KMS検出キーリング。)

注記

データの暗号化と復号に同じキーリングを使用する場合は、キー ARN を使用して各 CMK を指定します。復号には、キー ARN が必要です。

C

暗号化キーリングで AWS KMS CMK を識別するには、キー ARN またはエイリアス ARN を指定します。復号キーリングでは、キー ARN を使用する必要があります。詳細については、「での CMK の識別AWS KMSキーリング」を参照してください。

詳しい例については、string.cpp を参照してください。

const char * generator_key = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_encrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key,{additional_key});
JavaScript Browser

指定すると、AWS KMSの暗号化キーリング用の CMK をAWS Encryption SDKJavaScript の場合は、有効な CMK 識別子を使用できます。つまり、キー ID,キー ARN,エイリアス名, またはエイリアス ARN。での CMK の識別方法については、「」を参照してください。AWS KMSキーリングの詳細については、を参照してください。での CMK の識別AWS KMSキーリング

詳しい例については、kms_simple.ts を参照してください。

const clientProvider = getClient(KMS, { credentials }) const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey] })
JavaScript Node.js

指定すると、AWS KMSの暗号化キーリング用の CMK をAWS Encryption SDKJavaScript の場合は、有効な CMK 識別子を使用できます。つまり、キー ID,キー ARN,エイリアス名, またはエイリアス ARN。での CMK の識別方法については、「」を参照してください。AWS KMSキーリングの詳細については、を参照してください。での CMK の識別AWS KMSキーリング

詳しい例については、kms_simple.ts を参照してください。

const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey] })

を使用した復号AWS KMSキーリング

また、AWS KMSキーリングを暗号化されたメッセージということは、AWS Encryption SDKはを返します。復号キーリングを使用して、復号できる暗号化されたデータキーを指定できます。復号化キーリングに CMK が含まれている場合、AWS Encryption SDKは、キーリングの CMK で暗号化されたデータキーのみを復号します。(また、を使用することもできますAWS KMS検出キーリングであり、CMKを指定しません)。

復号化すると、AWS Encryption SDKが検索します。AWS KMS暗号化されたデータキーのいずれかを復号できる CMK のキーリング。具体的には、AWS Encryption SDK は暗号化されたメッセージの暗号化されたデータキーごとに以下のパターンに従います。

  • AWS Encryption SDK は、暗号化されたデータキーのメタデータを解析します。データキーを暗号化した CMK のキー ARN が取得されます。

  • -AWS Encryption SDKは、一致するキー ARN を持つ CMK を復号キーリングから探します。

  • キーリングから一致するキー ARN を持つ CMK が見つかった場合、AWS Encryption SDKASKAWS KMSを使用して、暗号化されたデータキーを復号します。

  • それ以外の場合は、暗号化された次のデータキーに進みます (ある場合)。

-AWS Encryption SDKは、データキーを暗号化した CMK のキー ARN が復号キーリングに含まれている場合を除き、暗号化されたデータキーを復号しません。データキーを暗号化した CMK の ARN が復号キーリングに含まれていない場合、AWS Encryption SDKを呼び出すことなく、復号化呼び出しが失敗するAWS KMS。

から始まるバージョン 1.7。xの場合、暗号化されたデータキーを復号化するとき、AWS Encryption SDK常に、CMK ラッピングキーのキー ARN をKeyIdのパラメータAWS KMS Decryptオペレーション. 復号化時の CMK の識別はAWS KMSベストプラクティスです。このベストプラクティスは、使用するラッピングキーを使用して暗号化されたデータキーを復号化することを保証します。

復号化コールは、AWS KMS復号キーリングの少なくとも 1 つの CMK が暗号化されたメッセージ内の暗号化されたデータキーのいずれかを復号できる場合、キーリングは成功します。また、呼び出し元はkms:Decrypt権限を付与します。この場合、AWS リージョンやアカウントが異なる複数の CMK を使用してデータを暗号化できますが、特定のアカウントやリージョン、ユーザー、グループ、ロールに合わせて、復号キーリングを制限することができます。

復号キーリングで CMK を指定する場合は、そのキー ARN を使用する必要があります。使用しない場合、CMK は認識されません。キー ARN を見つける方法については、「」を参照してください。キー ID と ARN を検索する()AWS Key Management Service開発者ガイド

注記

復号に暗号化キーリングを再利用する場合は、キーリングの CMK をキー ARN で指定するようにしてください。

たとえば、次のAWS KMSキーリングには、暗号化キーリングに使用した追加のキーのみが含まれます。このキーリングを使用して、ジェネレーターキーと追加のキーの両方で暗号化されたメッセージを復号することができます。ただし、追加のキーを使用してデータを復号するアクセス許可があることが必要です。

C
const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(additional_key);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringBrowser({ clientProvider, keyIds: [additionalKey] })
JavaScript Node.js
const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringNode({ keyIds: [additionalKey] })

また、を使用することもできますAWS KMS復号用のジェネレーターキーを指定するキーリング。以下に例を示します。復号する場合、AWS Encryption SDK ではジェネレーターキーと追加キーは区別されません。指定された任意の CMK を使用して、暗号化されたデータキーを復号することができます。AWS KMS への呼び出しは、その CMK を使用してデータを復号するアクセス許可が発信者にある場合にのみ行うことができます。

C
struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key, {additional_key, other_cmk});
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey, otherCmk] })
JavaScript Node.js
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey, otherCmk] })

指定したすべての CMK を使用する暗号化キーリングとは異なり、暗号化されたメッセージとは無関係の CMK と、発信者にアクセス許可がない CMK を含む復号キーリングを使用して、暗号化されたメッセージを復号することができます。必要なアクセス許可が呼び出し元にない場合など、AWS KMS に対する復号の呼び出しに失敗した場合は、AWS Encryption SDK は次の暗号化されたデータキーにスキップします。

AWS KMS 検出キーリングの使用

通常、復号化するときは、AWS KMSの CMK を制限するキーリングAWS Encryption SDKは、指定したものに使用できます。ただし、を作成することもできますAWS KMS検出キーリングである。つまり、AWS KMSCMK を指定しないキーリングです。これにより、AWS Encryption SDKASKAWS KMSは、CMK を使用して暗号化されたメッセージ内の暗号化されたデータキーを復号します。CMK の所有者やアクセス許可は関係ありません。呼び出しは、呼び出し元にそのkms:DecryptCMK のアクセス権限。

以下のコードは、AWS KMS 検出キーリングをインスタンス化します。

C

詳しい例については、kms_discovery.cpp を参照してください。

struct kms_discovery_keyring = Aws::Cryptosdk::KmsKeyring::Builder().BuildDiscovery();
JavaScript Browser

JavaScript では、discovery プロパティを明示的に指定する必要があります。

const clientProvider = getClient(KMS, { credentials }) const keyring = new KmsKeyringBrowser({discovery: true})
JavaScript Node.js

JavaScript では、discovery プロパティを明示的に指定する必要があります。

const keyring = new KmsKeyringNode({discovery: true})

暗号化では、AWS KMS 検出キーリングによる影響はありません。暗号化されたデータキーは返りません。ただし、暗号化および復号に使用するマルチキーリングに AWS KMS 検出キーリングを含めることができます。

復号では、AWS KMS 検出キーリングを使用すると、AWS Encryption SDK は AWS KMS を呼び出して、暗号化されたメッセージの暗号化された各データキーを成功するまで順番に復号します。成功させるには、暗号化されたデータキーのいずれかを暗号化した 1 つ以上の CMK の kms:Decrypt アクセス許可が発信者に必要です。

AWS Encryption SDK では、AWS KMS 検出キーリングを利便性のために提供しています。ただし、次の理由から、可能な限り制限されたキーリングを使用することをお勧めします。

  • 真正— AnAWS KMS検出キーリングでは、暗号化されたメッセージのデータキーを暗号化するために使用された任意の CMK を使用できます。そのため、発信者には、その CMK を使用して復号するアクセス許可が付与されています。発信者が使用する CMK ではない可能性があります。たとえば、暗号化されたデータキーの 1 つが、誰でも使用できる安全性の低い CMK で暗号化されている可能性があります。

  • レイテンシーリーとパフォーマンス— AnAWS KMS検出キーリングは、他のキーリングよりも知覚的に遅くなる可能性があります。AWS Encryption SDKは、CMK によって暗号化されたデータキーを含む、暗号化されたデータキーのすべてを解読しようとします。AWSアカウントとリージョン、および呼び出し元が復号化に使用するアクセス許可を持たない CMK です。

マルチキーリングで AWS KMS 検出キーリングを使用しても、暗号化には影響しません。復号化時に、任意の CMK の使用を許可することによって、AWS KMS検出キーリングは、他の CMK 制限を上書きします。AWS KMSマルチキーリング内のキーリングが課す可能性があります。たとえば、AWS KMSで特定の CMK を使用するキーリングAWS KMS検出キーリングでは、結果として得られるマルチキーリングは KMS 検出キーリングと同じように動作します。そのため、AWS Encryption SDK では、別の CMK で暗号化されていても、暗号化された任意のデータキーを復号するよう AWS KMS に指示することができます。

AWS KMS リージョン検出キーリングの使用

代わりに、AWS KMSキーリング、または特定の CMK を指定するキーリングAWS KMSディスカバリキーリングを使用して任意の CMK を使用できる場合は、AWS KMSを含むまたは除外する地域探索キーリングAWS Encryption SDK特定のCMKにAWSリージョン。

たとえば、次のコードは、AWS KMS米国西部 (オレゴン) リージョン (us-west-2) の CMK のみを使用するリージョン検出キーリング。

C

実例でこのキーリングや create_kms_client メソッドを表示する方法については、「kms_discovery.cpp」を参照してください。

struct aws_cryptosdk_keyring *kms_regional_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .WithKmsClient(create_kms_client(Aws::Region::US_WEST_2)).BuildDiscovery());
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringBrowser({ clientProvider, discovery })
JavaScript Node.js

このキーリングや limitRegions 関数の実際の例については、kms_regional_discovery.ts を参照してください。

const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery })

AWS Encryption SDK for JavaScript は、Node.js とブラウザ用の excludeRegions 関数もエクスポートします。この関数は、AWS KMS特定のリージョンの CMK を省略するリージョン検出キーリング。次の例ではを作成しますAWS KMSすべての CMK を使用できる、地域検出キーリングAWS米国東部 (バージニア北部) (us-east-1) を除くリージョン。

AWS Encryption SDK for C には同様のメソッドはありませんが、カスタムの ClientSupplier を作成することで実装できます。

この例は、Node.js 用のコードを示しています。

const discovery = true const clientProvider = excludeRegions(['us-east-1'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery })

暗号化では、AWS KMS リージョン検出キーリングによる影響はありません。CMK を指定していないため、データキーを生成または暗号化することはできません。ただし、暗号化および復号に使用するマルチキーリングに AWS KMS リージョン検出キーリングを含めることができます。

を使用した復号AWS KMSリージョン検出キーリングでは、AWS Encryption SDKASKAWS KMSCMK で暗号化された任意のデータキーを復号するには、指定されたAWSリージョン。成功させるには、暗号化されたメッセージのデータキーのいずれかを暗号化した、指定された AWS リージョンの 1 つ以上の CMK の kms:Decrypt アクセス許可が発信者に必要です。

マルチキーリングでは、すべての CMK をAWSリージョンAWS KMS地域検出キーリングは、他の CMK 制限を上書きできます。AWS KMSマルチキーリング内のキーリングが課す可能性があります。たとえば、AWS KMSヨーロッパ (ロンドン) リージョンの特定の CMK を使用できるキーリングと、ヨーロッパ (ロンドン) リージョンの KMS リージョン検出キーリングを使用すると、結果として得られるマルチキーリングはAWS KMSリージョン検出キーリング単独です。これにより、AWS Encryption SDKASKAWS KMSは、ヨーロッパ (ロンドン) リージョンの CMK で暗号化された任意のデータキーを復号します。

Raw AES キーリング

Raw AES キーリングは、AES-GCM アルゴリズムとバイト配列として指定したラッピングキーを使用してデータキーを暗号化します。各 Raw AES キーリングに指定できるラッピングキーは 1 つのみですが、マルチキーリングには、複数の Raw AES キーリングを含めることができます。

Raw AES キーリングは、JceMasterKey() AWS Encryption SDK for Java とRawMasterKey() AWS Encryption SDK for Python 対称暗号化キーと一緒に使用する場合。ある実装でデータを暗号化し、それを他の実装で、同じラッピングキーを使用して復号することができます。

Raw AES キーリングは、ラッピングキーを指定してデータキーをローカルで暗号化する必要がある場合や AWS Encryption SDK for Java または AWS Encryption SDK for Python と互換性のあるアプリケーションを作成する必要がある場合に使用します。可能であれば、ラッピングキーを公開せず、安全な境界内でデータキーを暗号化するハードウェアセキュリティモジュール (HSM) や AWS KMS などのサービスを使用することをお勧めします。

ラッピングキーを識別するために、Raw AES キーリングでは、ユーザーが指定した名前空間と名前を使用します。これらは、 AWS Encryption SDK for Java と AWS Encryption SDK for Python の Provider ID フィールドと Key ID フィールドに相当します。これらの値はシークレットではありません。彼らは、ヘッダに平文で表示されます暗号化されたメッセージということは、AWS Encryption SDKはを返します。ただし、これらの値は重要です。復号キーリングのキーには、暗号化キーリングのキーに使用したのと同じ名前空間と名前を使用する必要があります。大文字と小文字を区別して名前空間と名前が完全一致しない場合、AWS Encryption SDK ではバイトが同一であってもラッピングキーが同じであると認識されないため、暗号化されたデータキーを復号することはできません。

Raw AES キーリングを使用する方法の例については、以下を参照してください。

Raw RSA キーリング

Raw RSA キーリングは、指定したパブリックキーとプライベートキーを使用して、ローカルメモリでデータキーの非対称の暗号化と復号を行います。暗号化関数を使用して、RSA パブリックキーのデータキーを暗号化します。復号関数でプライベートキーを使用して、データキーを復号します。複数の RSA パディングモードから選択できます。

暗号化と復号を行う Raw RSA キーリングには、非対称のパブリックキーとプライベートキーのペアを含める必要があります。ただし、データの暗号化は、パブリックキーのみを持つ Raw RSA キーリングを使用して行うことができます。また、データの復号は、プライベートキーのみを持つ Raw RSA キーリングを使用して行うことができます。また、Raw RSA キーリングは、マルチキーリングに含めることができます。Raw RSA キーリングは、JceMasterKey() AWS Encryption SDK for Java とRawMasterKey() AWS Encryption SDK for Python 非対称暗号化キーと一緒に使用する場合。ある実装でデータを暗号化し、それを他の実装で、同じラッピングキーを使用して復号することができます。

Raw RSA キーリングは、非対称のキーペアを使用してラッピングキーとラッピング解除キーを指定する場合や AWS Encryption SDK で他のプログラミング言語との互換性を保つ必要がある場合に使用します。

キーペアを識別するために、Raw RSA キーリングでは、ユーザーが指定した名前空間と名前を使用します。これらの値はシークレットではありません。彼らは、ヘッダに平文で表示されます暗号化されたメッセージということは、AWS Encryption SDKはを返します。ただし、これらの値は重要です。暗号化キーリングと復号キーリングで同じキーペアを使用する場合は、両方のキーリングのキーペアに同じ名前空間と名前を使用してください。大文字と小文字を区別して名前空間と名前が完全一致しない場合、AWS Encryption SDK では、対称キーがペアであると認識されないため、暗号化されたデータキーを復号することはできません。

AWS Encryption SDK for C で Raw RSA キーリングを作成する場合は、各キーを含む PEM ファイルの内容は、パスやファイル名ではなく、null で終わる C の文字列を指定するようにしてください。JavaScriptでRaw RSA キーリングを作成する場合は、互換性のない可能性を他の言語実装に置き換えます。

Raw RSA キーリングを使用する方法の例については、以下を参照してください。

マルチキーリング

キーリングは組み合わせてマルチキーリングにすることができます。マルチキーリングは、種類に関係なく、1 つ以上の個別のキーリングで構成されるキーリングです。一連のキーリングを複数使用した場合のように動作します。マルチキーリングを使用してデータを暗号化する場合は、そのキーリングに含まれる任意のラッピングキーを使用してそのデータを復号できます。

マルチキーリングを作成してデータを暗号化する場合は、いずれかのキーリングをジェネレーターキーリングに指定します。他のすべてのキーリングは、子キーリングと呼ばれます。ジェネレーターキーリングは、プレーンテキストのデータキーを生成して暗号化します。その後、すべての子キーリングのすべてのラッピングキーによって、そのプレーンテキストデータキーが暗号化されます。マルチキーリングは、プレーンテキストのキーと、マルチキーリングのラッピングキーごとに 1 つの暗号化されたデータキーを返します。ジェネレーターキーリングを使用せずにマルチキーリングを作成する場合は、データを復号できますが暗号化することはできません。ジェネレータのキーリングがKMS キーリングのジェネレータキー、AWS KMSキーリングは、プレーンテキストキーを生成して暗号化します。次に、すべての追加の CMK をAWS KMSキーリングと、マルチキーリングのすべての子キーリングのすべてのラッピングキーによって、同じプレーンテキストキーが暗号化されます。

復号する際、AWS Encryption SDK では、キーリングを使用して暗号化されたデータキーのいずれかの復号を試みます。キーリングは、マルチキーリングで指定された順番で呼び出されます。暗号化されたデータキーがキーリングの任意のキーによって復号されると、処理は停止されます。

から始まるバージョン 1.7。xで暗号化されている場合、暗号化されたデータキーがAWS Key Management Service(AWS KMS) キーリング (またはマスターキープロバイダー)、AWS Encryption SDK常に、CMK ラッピングキーのキー ARN をKeyIdのパラメータAWS KMS Decryptオペレーション. これはAWS KMSベストプラクティスです。このベストプラクティスは、使用するラッピングキーを使用して暗号化されたデータキーを復号化することを保証します。

マルチキーリングの実際の例については、以下を参照してください。

マルチキーリングを作成するにはまず、子キーリングをインスタンス化します。この例では、を使用しますAWS KMSキーリングと Raw AES キーリングを使用していますが、サポートされている任意のキーリングをマルチキーリングに組み合わせることができます。

C
// Define an AWS KMS keyring. For details, see string.cpp. struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(example_CMK); // Define a Raw AES keyring. For details, see raw_aes_keyring.c. struct aws_cryptosdk_keyring *aes_keyring = aws_cryptosdk_raw_aes_keyring_new( alloc, wrapping_key_namespace, wrapping_key_name, wrapping_key, AWS_CRYPTOSDK_AES256);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) // Define an AWS KMS keyring. For details, see kms_simple.ts. const kmsKeyring = new KmsKeyringBrowser({ generatorKeyId: exampleCmk }) // Define a Raw AES keyring. For details, see aes_simple.ts. const aesKeyring = new RawAesKeyringWebCrypto({ keyName, keyNamespace, wrappingSuite, masterKey })
JavaScript Node.js
// Define an AWS KMS keyring. For details, see kms_simple.ts. const kmsKeyring = new KmsKeyringNode({ generatorKeyId: exampleCmk }) // Define a Raw AES keyring. For details, see raw_aes_keyring_node.ts. const aesKeyring = new RawAesKeyringNode({ keyName, keyNamespace, wrappingSuite, unencryptedMasterKey })

次に、マルチキーリングを作成し、ジェネレーターキーリングがある場合はそれを指定します。この例では、マルチキーリングを作成します。このマルチキーリングでは、AWS KMSキーリングはジェネレーターキーリングで AES キーリングは子キーリングです。

C

C のマルチキーリングのコンストラクタでは、ジェネレーターキーリングのみを指定します。

struct aws_cryptosdk_keyring *multi_keyring = aws_cryptosdk_multi_keyring_new(alloc, kms_keyring);

マルチキーリングに子キーリングを追加するには、aws_cryptosdk_multi_keyring_add_child メソッドを使用します。このメソッドは、追加する子キーリングごとに呼び出す必要があります。

// Add the Raw AES keyring (C only) aws_cryptosdk_multi_keyring_add_child(multi_keyring, aes_keyring);
JavaScript Browser

JavaScript のマルチキーリングはイミュータブルです。JavaScript のマルチキーリングのコンストラクタでは、ジェネレーターキーリングと複数の子キーリングを指定できます。

const clientProvider = getClient(KMS, { credentials }) const multiKeyring = new MultiKeyringWebCrypto(generator: kmsKeyring, children: [aesKeyring]);
JavaScript Node.js

JavaScript のマルチキーリングはイミュータブルです。JavaScript のマルチキーリングのコンストラクタでは、ジェネレーターキーリングと複数の子キーリングを指定できます。

const multiKeyring = new MultiKeyringNode(generator: kmsKeyring, children: [aesKeyring]);

これで、データの暗号化と復号にマルチキーリングを使用できます。

C でマルチキーリングを作成して使用する方法の詳しい例については、multi_keyring.cpp を参照してください。