

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# AWS KMS Gantungan kunci ECDH
<a name="use-kms-ecdh-keyring"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

**penting**  
Gantungan kunci AWS KMS ECDH hanya tersedia dengan versi 1.5.0 atau yang lebih baru dari Perpustakaan Penyedia Material.

Gantungan kunci AWS KMS ECDH menggunakan kesepakatan kunci asimetris [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html)untuk mendapatkan kunci pembungkus simetris bersama antara dua pihak. Pertama, keyring menggunakan algoritma perjanjian kunci Elliptic Curve Diffie-Hellman (ECDH) untuk mendapatkan rahasia bersama dari kunci pribadi di KMS key pair pengirim dan kunci publik penerima. Kemudian, keyring menggunakan rahasia bersama untuk mendapatkan kunci pembungkus bersama yang melindungi kunci enkripsi data Anda. Fungsi derivasi kunci yang digunakan SDK Enkripsi AWS Database (`KDF_CTR_HMAC_SHA384`) untuk mendapatkan kunci pembungkus bersama sesuai dengan rekomendasi [NIST](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-108r1-upd1.pdf) untuk derivasi kunci.

Fungsi derivasi kunci mengembalikan 64 byte bahan kunci. Untuk memastikan bahwa kedua belah pihak menggunakan materi kunci yang benar, SDK Enkripsi AWS Database menggunakan 32 byte pertama sebagai kunci komitmen dan 32 byte terakhir sebagai kunci pembungkus bersama. Saat mendekripsi, jika keyring tidak dapat mereproduksi kunci komitmen yang sama dan kunci pembungkus bersama yang disimpan di bidang deskripsi material dari catatan terenkripsi, operasi gagal. Misalnya, jika Anda mengenkripsi rekaman dengan keyring yang dikonfigurasi dengan kunci pribadi **Alice** dan kunci publik **Bob**, keyring yang dikonfigurasi dengan kunci pribadi **Bob** dan kunci publik **Alice** akan mereproduksi kunci komitmen yang sama dan kunci pembungkus bersama dan dapat mendekripsi catatan. Jika kunci publik Bob bukan dari key pair KMS, maka Bob dapat membuat [keyring ECDH mentah](use-raw-ecdh-keyring.md) untuk mendekripsi catatan.

Keyring AWS KMS ECDH mengenkripsi catatan dengan kunci simetris menggunakan AES-GCM. Kunci data kemudian dienkripsi dengan kunci pembungkus bersama turunan menggunakan AES-GCM. [Setiap keyring AWS KMS ECDH hanya dapat memiliki satu kunci pembungkus bersama, tetapi Anda dapat menyertakan beberapa gantungan kunci AWS KMS ECDH, sendiri atau dengan gantungan kunci lainnya, dalam multi-keyring.](use-multi-keyring.md)

**Topics**
+ [Izin yang diperlukan untuk gantungan kunci AWS KMS ECDH](#kms-ecdh-permissions)
+ [Membuat keyring AWS KMS ECDH](#kms-ecdh-create)
+ [Membuat keyring AWS KMS penemuan ECDH](#kms-ecdh-discovery)

## Izin yang diperlukan untuk gantungan kunci AWS KMS ECDH
<a name="kms-ecdh-permissions"></a>

SDK Enkripsi AWS Database tidak memerlukan AWS akun dan tidak bergantung pada AWS layanan apa pun. Namun, untuk menggunakan keyring AWS KMS ECDH, Anda memerlukan AWS akun dan izin minimum berikut pada keyring Anda. AWS KMS keys Izin bervariasi berdasarkan skema perjanjian kunci yang Anda gunakan.
+ Untuk mengenkripsi dan mendekripsi catatan menggunakan skema perjanjian `KmsPrivateKeyToStaticPublicKey` kunci, Anda memerlukan [kms: GetPublicKey dan kms: DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) [pada key pair KMS *asimetris*](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) pengirim. Jika Anda langsung memberikan kunci publik yang dienkode DER pengirim saat membuat instance keyring, Anda hanya perlu DeriveSharedSecret izin [kms: pada key pair KMS asimetris](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) pengirim.
+ Untuk mendekripsi catatan menggunakan skema perjanjian `KmsPublicKeyDiscovery` kunci, Anda memerlukan GetPublicKey izin [kms: DeriveSharedSecret dan kms:](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) pada key [pair KMS](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) asimetris yang ditentukan.

## Membuat keyring AWS KMS ECDH
<a name="kms-ecdh-create"></a>

Untuk membuat keyring AWS KMS ECDH yang mengenkripsi dan mendekripsi data, Anda harus menggunakan skema perjanjian kunci. `KmsPrivateKeyToStaticPublicKey` Untuk menginisialisasi keyring AWS KMS ECDH dengan skema perjanjian `KmsPrivateKeyToStaticPublicKey` kunci, berikan nilai-nilai berikut:
+ **ID Pengirim AWS KMS key **

  Harus mengidentifikasi asymmetric NIST recommended elliptic curve (ECC) KMS key pair dengan nilai. `KeyUsage` `KEY_AGREEMENT` Kunci pribadi pengirim digunakan untuk mendapatkan rahasia bersama.
+ **(Opsional) Kunci publik pengirim**

  [Harus berupa kunci publik X.509 yang dikodekan DER, juga dikenal sebagai `SubjectPublicKeyInfo` (SPKI), sebagaimana didefinisikan dalam RFC 5280.](https://tools.ietf.org/html/rfc5280)

   AWS KMS [GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)Operasi mengembalikan kunci publik dari key pair KMS asimetris dalam format yang dienkode DER yang diperlukan.

  Untuk mengurangi jumlah AWS KMS panggilan yang dilakukan keyring Anda, Anda dapat langsung memberikan kunci publik pengirim. Jika tidak ada nilai yang diberikan untuk kunci publik pengirim, keyring akan memanggil AWS KMS untuk mengambil kunci publik pengirim.
+ **Kunci publik penerima**

  [Anda harus memberikan kunci publik X.509 yang dikodekan DER penerima, juga dikenal sebagai `SubjectPublicKeyInfo` (SPKI), sebagaimana didefinisikan dalam RFC 5280.](https://tools.ietf.org/html/rfc5280)

   AWS KMS [GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)Operasi mengembalikan kunci publik dari key pair KMS asimetris dalam format yang dienkode DER yang diperlukan.
+ **Spesifikasi kurva**

  Mengidentifikasi spesifikasi kurva elips dalam pasangan kunci yang ditentukan. Pasangan kunci pengirim dan penerima harus memiliki spesifikasi kurva yang sama.

  Nilai valid: `ECC_NIST_P256`, `ECC_NIS_P384`, `ECC_NIST_P512`
+ **(Opsional) Daftar Token Hibah**

  Jika Anda mengontrol akses ke kunci KMS di keyring AWS KMS ECDH Anda dengan [hibah, Anda harus memberikan semua token hibah](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) yang diperlukan saat Anda menginisialisasi keyring.

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

Contoh berikut membuat keyring AWS KMS ECDH dengan kunci KMS pengirim, kunci publik pengirim, dan kunci publik penerima. Contoh ini menggunakan `senderPublicKey` parameter opsional untuk menyediakan kunci publik pengirim. Jika Anda tidak memberikan kunci publik pengirim, keyring akan memanggil AWS KMS untuk mengambil kunci publik pengirim. Pasangan kunci pengirim dan penerima berada di `ECC_NIST_P256` kurva. 

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

Contoh berikut membuat keyring AWS KMS ECDH dengan kunci KMS pengirim, kunci publik pengirim, dan kunci publik penerima. Contoh ini menggunakan `senderPublicKey` parameter opsional untuk menyediakan kunci publik pengirim. Jika Anda tidak memberikan kunci publik pengirim, keyring akan memanggil AWS KMS untuk mengambil kunci publik pengirim. Pasangan kunci pengirim dan penerima berada di `ECC_NIST_P256` kurva. 

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

Contoh berikut membuat keyring AWS KMS ECDH dengan kunci KMS pengirim, kunci publik pengirim, dan kunci publik penerima. Contoh ini menggunakan `sender_public_key` parameter opsional untuk menyediakan kunci publik pengirim. Jika Anda tidak memberikan kunci publik pengirim, keyring akan memanggil AWS KMS untuk mengambil kunci publik pengirim.

```
// 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?;
```

------

## Membuat keyring AWS KMS penemuan ECDH
<a name="kms-ecdh-discovery"></a>

Saat mendekripsi, ini adalah praktik terbaik untuk menentukan kunci yang dapat digunakan SDK Enkripsi AWS Database. Untuk mengikuti praktik terbaik ini, gunakan gantungan kunci AWS KMS ECDH dengan skema perjanjian `KmsPrivateKeyToStaticPublicKey` kunci. Namun, Anda juga dapat membuat keyring penemuan AWS KMS ECDH, yaitu keyring AWS KMS ECDH yang dapat mendekripsi catatan apa pun di mana kunci publik dari key pair KMS yang ditentukan cocok dengan kunci publik *penerima yang disimpan di bidang deskripsi material dari catatan terenkripsi*.

**penting**  
Ketika Anda mendekripsi catatan menggunakan skema perjanjian `KmsPublicKeyDiscovery` kunci, Anda menerima semua kunci publik, terlepas dari siapa yang memilikinya.

Untuk menginisialisasi keyring AWS KMS ECDH dengan skema perjanjian `KmsPublicKeyDiscovery` kunci, berikan nilai-nilai berikut:
+ ** AWS KMS key ID Penerima**

  Harus mengidentifikasi asymmetric NIST recommended elliptic curve (ECC) KMS key pair dengan nilai. `KeyUsage` `KEY_AGREEMENT`
+ **Spesifikasi kurva**

  Mengidentifikasi spesifikasi kurva eliptik dalam key pair KMS penerima.

  Nilai valid: `ECC_NIST_P256`, `ECC_NIS_P384`, `ECC_NIST_P512`
+ **(Opsional) Daftar Token Hibah**

  Jika Anda mengontrol akses ke kunci KMS di keyring AWS KMS ECDH Anda dengan [hibah, Anda harus memberikan semua token hibah](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) yang diperlukan saat Anda menginisialisasi keyring.

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

Contoh berikut membuat keyring penemuan AWS KMS ECDH dengan key pair KMS pada kurva. `ECC_NIST_P256` Anda harus memiliki DeriveSharedSecret izin [kms: GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) dan [kms:](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) pada key pair KMS yang ditentukan. Keyring ini dapat mendekripsi catatan apa pun di mana kunci publik dari key pair KMS yang ditentukan cocok dengan kunci publik penerima yang disimpan di bidang deskripsi material dari catatan terenkripsi.

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

Contoh berikut membuat keyring penemuan AWS KMS ECDH dengan key pair KMS pada kurva. `ECC_NIST_P256` Anda harus memiliki DeriveSharedSecret izin [kms: GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html) dan [kms:](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html) pada key pair KMS yang ditentukan. Keyring ini dapat mendekripsi catatan apa pun di mana kunci publik dari key pair KMS yang ditentukan cocok dengan kunci publik penerima yang disimpan di bidang deskripsi material dari catatan terenkripsi.

```
// 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?;
```

------