AWS KMS ECDH キーリング - AWS Encryption SDK

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

AWS KMS ECDH キーリング

AWS KMS ECDH キーリングは、非対称キーアグリーメントAWS KMS keysを使用して、2 つの当事者間で共有対称ラッピングキーを取得します。まず、キーリングは Elliptic Curve Diffie-Hellman (ECDH) キー契約アルゴリズムを使用して、送信者のキーKMSペアのプライベートキーと受信者のパブリックキーから共有シークレットを取得します。次に、キーリングは共有シークレットを使用して、データ暗号化キーを保護する共有ラッピングキーを取得します。が (KDF_CTR_HMAC_SHA384) AWS Encryption SDK を使用して共有ラッピングキーを導出するキー導出関数は、NISTキー導出の推奨事項 に準拠しています。

キー派生関数は、64 バイトのキーマテリアルを返します。両当事者が正しいキーイングマテリアルを使用するようにするために、 AWS Encryption SDK は最初の 32 バイトをコミットメントキーとして使用し、最後の 32 バイトを共有ラッピングキーとして使用します。復号時に、キーリングがメッセージヘッダー暗号文に保存されているのと同じコミットメントキーと共有ラッピングキーを再現できない場合、オペレーションは失敗します。例えば、Alice のプライベートキーと Bob のパブリックキーで設定されたキーリングでデータを暗号化した場合、Bob のプライベートキーと Alice のパブリックキーで設定されたキーリングは、同じコミットメントキーと共有ラッピングキーを再現し、データを復号化できます。Bob のパブリックキーがKMSキーペアからでない場合、Bob は Raw ECDHキーリングを作成してデータを復号できます。

AWS KMS ECDH キーリングは、AES- を使用して対称キーでデータを暗号化しますGCM。次に、データキーはAES、- を使用して派生した共有ラッピングキーでエンベロープ暗号化されますGCM。各 AWS KMS ECDHキーリングには共有ラッピングキーを 1 つだけ持つことができますが、複数の AWS KMS ECDHキーリングを単独で、または他のキーリングと共にマルチキーリング に含めることができます。

プログラミング言語の互換性

キーリングは Cryptographic Material Providers Library (MPL) のバージョン AWS KMS ECDH1.5.0 で導入され、以下のプログラミング言語とバージョンでサポートされています。

  • のバージョン 3.x AWS Encryption SDK for Java

  • AWS Encryption SDK 用 のバージョン 4.x。NET

  • バージョン 4.x AWS Encryption SDK for Python、オプションのMPL依存関係で使用する場合。

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

AWS Encryption SDK には AWS アカウントは不要で、どの AWS サービスにも依存しません。ただし、キーリングを使用するには AWS KMS ECDH、 AWS アカウントと、キーリング AWS KMS keys の に対する以下の最小アクセス許可が必要です。アクセス許可は、使用するキーアグリーメントスキーマによって異なります。

  • KmsPrivateKeyToStaticPublicKey キー契約スキーマを使用してデータを暗号化および復号するには、送信者の非対称KMSキーペアに kms: GetPublicKeyおよび kms:DeriveSharedSecret が必要です。キーリングをインスタンス化するときに送信者のDERエンコードされたパブリックキーを直接指定する場合、必要なのは kms:DeriveSharedSecret 送信者の非対称KMSキーペアに対するアクセス許可のみです。

  • KmsPublicKeyDiscovery キーアグリーメントスキーマを使用してデータを復号するには、指定された非対称KMSキーペアに対する kms:DeriveSharedSecret および kms:GetPublicKey アクセス許可が必要です。

AWS KMS ECDH キーリングの作成

データを暗号化および復号化するキーリングを作成するには AWS KMS ECDH、KmsPrivateKeyToStaticPublicKeyキーアグリーメントスキーマを使用する必要があります。キーアグリーメントスキーマを使用してKmsPrivateKeyToStaticPublicKeyキーリングを初期化 AWS KMS ECDHするには、次の値を指定します。

  • 送信者 AWS KMS key ID

    KeyUsage 値が の非対称 NIST- 推奨楕円曲線 (ECC) KMSキーペアを識別する必要がありますKEY_AGREEMENT。送信者のプライベートキーは、共有シークレットを導き出すために使用されます。

  • (オプション) 送信者のパブリックキー

    RFC 5280 で定義されているように、DERエンコードされた X.509 パブリックキー、または SubjectPublicKeyInfo (SPKI) である必要があります。

    オペレーションは AWS KMS GetPublicKey、非対称キーペアのパブリックKMSキーを必要なDERエンコード形式で返します。

    キーリングが行う AWS KMS 呼び出しの数を減らすには、送信者のパブリックキーを直接指定できます。送信者のパブリックキーに値が指定されていない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。

  • 受信者のパブリックキー

    RFC 5280 で定義されているように、受信者のDERエンコードされた X.509 パブリックキー、または SubjectPublicKeyInfo (SPKI) を指定する必要があります。

    オペレーションは AWS KMS GetPublicKey、非対称キーペアのパブリックKMSキーを必要なDERエンコード形式で返します。

  • 曲線仕様

    指定されたキーペアの楕円曲線仕様を識別します。送信者と受信者の両方のキーペアは、同じ曲線仕様である必要があります。

    有効な値: ECC_NIST_P256ECC_NIS_P384ECC_NIST_P512

  • (オプション) 許可トークンのリスト

    許可 を使用してキーリング内のKMS AWS KMS ECDHキーへのアクセスを制御する場合は、キーリングを初期化するときに必要なすべての許可トークンを指定する必要があります。

C# / .NET

次の例では、 AWS KMS ECDH送信者のキー、送信者のパブリックKMSキー、受信者のパブリックキーを使用して を使用してキーリングを作成します。この例では、オプションの SenderPublicKeyパラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。送信者と受信者の両方のキーペアがECC_NIST_P256曲線上にあります。

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Must be DER-encoded X.509 public keys var BobPublicKey = new MemoryStream(new byte[] { }); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the AWS KMS ECDH static keyring var staticConfiguration = new KmsEcdhStaticConfigurations { KmsPrivateKeyToStaticPublicKey = new KmsPrivateKeyToStaticPublicKeyInput { SenderKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", SenderPublicKey = BobPublicKey, RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = staticConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

次の例では、 AWS KMS ECDH送信者のキー、送信者のパブリックKMSキー、受信者のパブリックキーを使用して を使用してキーリングを作成します。この例では、オプションの senderPublicKeyパラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。送信者と受信者の両方のキーペアがECC_NIST_P256曲線上にあります。

// Retrieve public keys // Must be DER-encoded X.509 public keys ByteBuffer BobPublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"); ByteBuffer AlicePublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"); // Create the AWS KMS ECDH static keyring final CreateAwsKmsEcdhKeyringInput senderKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPrivateKeyToStaticPublicKey( KmsPrivateKeyToStaticPublicKeyInput.builder() .senderKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab") .senderPublicKey(BobPublicKey) .recipientPublicKey(AlicePublicKey) .build()).build()).build();
Python

次の例では、 AWS KMS ECDH送信者のキー、送信者のパブリックKMSキー、受信者のパブリックキーを使用して キーリングを作成します。この例では、オプションの senderPublicKeyパラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは呼び出し AWS KMS て送信者のパブリックキーを取得します。送信者と受信者の両方のキーペアがECC_NIST_P256曲線上にあります。

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateAwsKmsEcdhKeyringInput, KmsEcdhStaticConfigurationsKmsPrivateKeyToStaticPublicKey, KmsPrivateKeyToStaticPublicKeyInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Retrieve public keys # Must be DER-encoded X.509 public keys bob_public_key = get_public_key_bytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab") alice_public_key = get_public_key_bytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321") # Create the AWS KMS ECDH static keyring sender_keyring_input = CreateAwsKmsEcdhKeyringInput( kms_client = boto3.client('kms', region_name="us-west-2"), curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = KmsEcdhStaticConfigurationsKmsPrivateKeyToStaticPublicKey( KmsPrivateKeyToStaticPublicKeyInput( sender_kms_identifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", sender_public_key = bob_public_key, recipient_public_key = alice_public_key, ) ) ) keyring = mat_prov.create_aws_kms_ecdh_keyring(sender_keyring_input)

検出キーリングの作成 AWS KMS ECDH

復号する場合、 AWS Encryption SDK で使用できるキーを指定するのがベストプラクティスです。このベストプラクティスに従うには、キーアグリーメントスキーマでKmsPrivateKeyToStaticPublicKeyキーリングを使用します AWS KMS ECDH。ただし、検出キーリング、 AWS KMS ECDHつまり、 AWS KMS ECDH指定されたキーペアのパブリックキーがメッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できるKMSキーリングを作成することもできます。

重要

KmsPublicKeyDiscovery キーアグリーメントスキーマを使用してメッセージを復号する場合、誰が所有しているかに関係なく、すべてのパブリックキーを受け入れます。

キーアグリーメントスキーマを使用してKmsPublicKeyDiscoveryキーリングを初期化 AWS KMS ECDHするには、次の値を指定します。

  • 受信者の AWS KMS key ID

    KeyUsage 値が の非対称のNIST推奨楕円曲線 (ECC) KMSキーペアを識別する必要がありますKEY_AGREEMENT

  • 曲線仕様

    受信者のKMSキーペアの楕円曲線仕様を識別します。

    有効な値: ECC_NIST_P256ECC_NIS_P384ECC_NIST_P512

  • (オプション) 許可トークンのリスト

    許可 を使用してキーリング内のKMS AWS KMS ECDHキーへのアクセスを制御する場合は、キーリングを初期化するときに必要なすべての許可トークンを提供する必要があります。

C# / .NET

次の例では、 AWS KMS ECDHECC_NIST_P256曲線にキーペアを持つ検出KMSキーリングを作成します。指定されたKMSキーペアには kms:GetPublicKey および kms:DeriveSharedSecret アクセス許可が必要です。このキーリングは、指定されたキーKMSペアのパブリックキーが、メッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できます。

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Create the AWS KMS ECDH discovery keyring var discoveryConfiguration = new KmsEcdhStaticConfigurations { KmsPublicKeyDiscovery = new KmsPublicKeyDiscoveryInput { RecipientKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = discoveryConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

次の例では、 AWS KMS ECDHECC_NIST_P256曲線にキーペアを持つ検出KMSキーリングを作成します。指定されたKMSキーペアには kms:GetPublicKey および kms:DeriveSharedSecret アクセス許可が必要です。このキーリングは、指定されたキーKMSペアのパブリックキーが、メッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できます。

// Create the AWS KMS ECDH discovery keyring final CreateAwsKmsEcdhKeyringInput recipientKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPublicKeyDiscovery( KmsPublicKeyDiscoveryInput.builder() .recipientKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321").build() ).build()) .build();
Python

次の例では、 AWS KMS ECDHECC_NIST_P256曲線にキーペアを持つ検出KMSキーリングを作成します。指定されたKMSキーペアには kms:GetPublicKey および kms:DeriveSharedSecret アクセス許可が必要です。このキーリングは、指定されたキーKMSペアのパブリックキーが、メッセージ暗号文に保存されている受信者のパブリックキーと一致するメッセージを復号できます。

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateAwsKmsEcdhKeyringInput, KmsEcdhStaticConfigurationsKmsPublicKeyDiscovery, KmsPublicKeyDiscoveryInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS ECDH discovery keyring create_keyring_input = CreateAwsKmsEcdhKeyringInput( kms_client = boto3.client('kms', region_name="us-west-2"), curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = KmsEcdhStaticConfigurationsKmsPublicKeyDiscovery( KmsPublicKeyDiscoveryInput( recipient_kms_identifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", ) ) ) keyring = mat_prov.create_aws_kms_ecdh_keyring(create_keyring_input)