

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

# AWS KMS ECDH キーリング
<a name="use-kms-ecdh-keyring"></a>


****  

|  | 
| --- |
| クライアント側の暗号化ライブラリの名前が AWS Database Encryption SDK に変更されました。このデベロッパーガイドでは、引き続き [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md) に関する情報を提供します。 | 

**重要**  
 AWS KMS ECDH キーリングは、 マテリアルプロバイダーライブラリのバージョン 1.5.0 以降でのみ使用できます。

 AWS KMS ECDH キーリングは、非対称キーアグリーメント[AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html)を使用して、2 つの当事者間で共有対称ラッピングキーを取得します。まず、キーリングは楕円曲線 Diffie-Hellman (ECDH) キーアグリーメントアルゴリズムを使用して、送信者の KMS キーペアと受信者のパブリックキーのプライベートキーから共有シークレットを取得します。次に、キーリングは共有シークレットを使用して、データ暗号化キーを保護する共有ラッピングキーを取得します。 AWS Database Encryption SDK が (`KDF_CTR_HMAC_SHA384`) を使用して共有ラッピングキーを取得するキー取得関数は、[キー取得に関する NIST レコメンデーション](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-108r1-upd1.pdf)に準拠しています。

キー取得関数は、64 バイトのキーマテリアルを返します。両当事者が正しいキーマテリアルを使用していることを確認するために、 AWS Database Encryption SDK は最初の 32 バイトをコミットメントキーとして使用し、最後の 32 バイトを共有ラッピングキーとして使用します。復号時に、キーリングが暗号化されたレコードのマテリアル説明フィールドに保存されているのと同じコミットメントキーと共有ラッピングキーを再現できない場合、オペレーションは失敗します。たとえば、**Alice の**プライベートキーと **Bob の**パブリックキーで設定されたキーリングを使用してレコードを暗号化する場合、**Bob の**プライベートキーと **Alice の**パブリックキーで設定されたキーリングは、同じコミットメントキーと共有ラッピングキーを再現し、レコードを復号化できます。Bob のパブリックキーが KMS キーペアからでない場合、Bob は [Raw ECDH キーリング](use-raw-ecdh-keyring.md)を作成してレコードを復号できます。

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

**Topics**
+ [AWS KMS ECDH キーリングに必要なアクセス許可](#kms-ecdh-permissions)
+ [AWS KMS ECDH キーリングの作成](#kms-ecdh-create)
+ [AWS KMS ECDH 検出キーリングの作成](#kms-ecdh-discovery)

## AWS KMS ECDH キーリングに必要なアクセス許可
<a name="kms-ecdh-permissions"></a>

 AWS Database Encryption SDK は AWS アカウントを必要とせず、どの AWS サービスにも依存しません。ただし、 AWS KMS ECDH キーリングを使用するには、 AWS アカウントと、キーリング AWS KMS keys の に対する以下の最小限のアクセス許可が必要です。アクセス許可は、使用するキーアグリーメントスキーマによって異なります。
+ `KmsPrivateKeyToStaticPublicKey` キーアグリーメントスキーマを使用してレコードを暗号化および復号するには、*送信者の*非対称 KMS [キーペアに kms:GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) と [kms:DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) が必要です。キーリングをインスタンス化するときに送信者の DER エンコードされたパブリックキーを直接指定する場合、送信者の非対称 KMS キーペアに対する [kms:DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) アクセス許可のみが必要です。
+ `KmsPublicKeyDiscovery` キーアグリーメントスキーマを使用してレコードを復号するには、指定された非対称 [KMS キーペアに対する kms:DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) および [kms:GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) アクセス許可が必要です。

## AWS KMS ECDH キーリングの作成
<a name="kms-ecdh-create"></a>

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

  `KeyUsage` 値が の非対称 NIST 推奨楕円曲線 (ECC)KMS キーペアを識別する必要があります`KEY_AGREEMENT`。送信者のプライベートキーは、共有シークレットを取得するために使用されます。
+ **(オプション) 送信者のパブリックキー**

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

   AWS KMS [GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) オペレーションは、非対称 KMS キーペアのパブリックキーを必要な DER エンコード形式で返します。

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

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

   AWS KMS [GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) オペレーションは、非対称 KMS キーペアのパブリックキーを必要な DER エンコード形式で返します。
+ **曲線仕様**

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

  有効な値: `ECC_NIST_P256`、`ECC_NIS_P384`、`ECC_NIST_P512`
+ **(オプション) 許可トークンのリスト**

   AWS KMS ECDH キーリングの KMS キーへのアクセスを[グラン](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)トで制御する場合は、キーリングを初期化するときに必要なすべてのグラントトークンを指定する必要があります。

------
#### [ C\$1 / .NET ]

次の例では、送信者の KMS キー、送信者のパブリックキー、受信者のパブリックキーを使用して、 を使用して AWS KMS ECDH キーリングを作成します。この例では、オプションの `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 ]

次の例では、送信者の KMS キー、送信者のパブリックキー、受信者のパブリックキーを使用して、 を使用して AWS KMS ECDH キーリングを作成します。この例では、オプションの `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();
```

------
#### [ Rust ]

次の例では、送信者の KMS キー、送信者のパブリックキー、受信者のパブリックキーを使用して、 を使用して AWS KMS ECDH キーリングを作成します。この例では、オプションの `sender_public_key`パラメータを使用して、送信者のパブリックキーを指定します。送信者のパブリックキーを指定しない場合、キーリングは AWS KMS を呼び出して送信者のパブリックキーを取得します。

```
// Retrieve public keys
// Must be DER-encoded X.509 keys
let public_key_file_content_sender = std::fs::read_to_string(Path::new(EXAMPLE_KMS_ECC_PUBLIC_KEY_FILENAME_SENDER))?;
let parsed_public_key_file_content_sender = parse(public_key_file_content_sender)?;
let public_key_sender_utf8_bytes = parsed_public_key_file_content_sender.contents();

let public_key_file_content_recipient = std::fs::read_to_string(Path::new(EXAMPLE_KMS_ECC_PUBLIC_KEY_FILENAME_RECIPIENT))?;
let parsed_public_key_file_content_recipient = parse(public_key_file_content_recipient)?;
let public_key_recipient_utf8_bytes = parsed_public_key_file_content_recipient.contents();

// Create KmsPrivateKeyToStaticPublicKeyInput
let kms_ecdh_static_configuration_input =
    KmsPrivateKeyToStaticPublicKeyInput::builder()
        .sender_kms_identifier(arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab)
        // Must be a UTF8 DER-encoded X.509 public key
        .sender_public_key(public_key_sender_utf8_bytes)
        // Must be a UTF8 DER-encoded X.509 public key
        .recipient_public_key(public_key_recipient_utf8_bytes)
        .build()?;

let kms_ecdh_static_configuration = KmsEcdhStaticConfigurations::KmsPrivateKeyToStaticPublicKey(kms_ecdh_static_configuration_input);

// Instantiate the material providers library
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;

// Create AWS KMS ECDH keyring
let kms_ecdh_keyring = mpl
    .create_aws_kms_ecdh_keyring()
    .kms_client(kms_client)
    .curve_spec(ecdh_curve_spec)
    .key_agreement_scheme(kms_ecdh_static_configuration)
    .send()
    .await?;
```

------

## AWS KMS ECDH 検出キーリングの作成
<a name="kms-ecdh-discovery"></a>

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

**重要**  
`KmsPublicKeyDiscovery` キーアグリーメントスキーマを使用してレコードを復号する場合、所有者に関係なく、すべてのパブリックキーを受け入れます。

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

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

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

  有効な値: `ECC_NIST_P256`、`ECC_NIS_P384`、`ECC_NIST_P512`
+ **(オプション) 許可トークンのリスト**

   AWS KMS ECDH キーリングの KMS キーへのアクセスを[グラン](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)トで制御する場合は、キーリングを初期化するときに必要なすべてのグラントトークンを指定する必要があります。

------
#### [ C\$1 / .NET ]

次の例では、`ECC_NIST_P256`曲線に KMS キーペアを持つ AWS KMS ECDH 検出キーリングを作成します。指定された [KMS キーペアに対する kms:GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) および [kms:DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) アクセス許可が必要です。このキーリングは、指定された 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 ]

次の例では、`ECC_NIST_P256`曲線に KMS キーペアを持つ AWS KMS ECDH 検出キーリングを作成します。指定された [KMS キーペアに対する kms:GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) および [kms:DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) アクセス許可が必要です。このキーリングは、指定された 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();
```

------
#### [ Rust ]

```
// Create KmsPublicKeyDiscoveryInput
let kms_ecdh_discovery_static_configuration_input =
    KmsPublicKeyDiscoveryInput::builder()
        .recipient_kms_identifier(ecc_recipient_key_arn)
        .build()?;

let kms_ecdh_discovery_static_configuration = KmsEcdhStaticConfigurations::KmsPublicKeyDiscovery(kms_ecdh_discovery_static_configuration_input);

// Instantiate the material providers library
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;

// Create AWS KMS ECDH discovery keyring
let kms_ecdh_discovery_keyring = mpl
    .create_aws_kms_ecdh_keyring()
    .kms_client(kms_client.clone())
    .curve_spec(ecdh_curve_spec)
    .key_agreement_scheme(kms_ecdh_discovery_static_configuration)
    .send()
    .await?;
```

------