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

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

AWS KMS ECDH キーリング

重要

キーリングは、 AWS KMS ECDH AWS Encryption SDK 用の のバージョン 4.x および NETのバージョン 3.x でのみ使用できます AWS Encryption SDK for Java。 AWS KMS ECDH キーリングは、マテリアルプロバイダーライブラリのバージョン 1.5.0 で導入されました。

AWS KMS ECDH キーリングは、非対称キーアグリーメントAWS KMS keysを使用して、2 者間で共有対称ラッピングキーを取得します。まず、キーリングは楕円曲線 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キーリング には、単独で、または他のキーリングと共に複数のキーリングを含めることができます。

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

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

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

  • 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。送信者のプライベートキーは、共有シークレットを取得するために使用されます。

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

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

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

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

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

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

    オペレーションは 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();

検出キーリングの作成 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();