

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

# AWS SDK Enkripsi Database untuk DynamoDB
<a name="dynamodb-encryption-client"></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). | 

[SDK Enkripsi AWS Database untuk DynamoDB adalah pustaka perangkat lunak yang memungkinkan Anda menyertakan enkripsi sisi klien dalam desain Amazon DynamoDB Anda.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/) SDK Enkripsi AWS Database untuk DynamoDB menyediakan enkripsi tingkat atribut dan memungkinkan Anda menentukan item mana yang akan dienkripsi dan item mana yang akan disertakan dalam tanda tangan yang memastikan keaslian data Anda. Mengenkripsi data sensitif Anda saat transit dan diam membantu memastikan bahwa data teks biasa Anda tidak tersedia untuk pihak ketiga mana pun, termasuk. AWS

**catatan**  
SDK Enkripsi AWS Database tidak mendukung PartiQL.

Dalam DynamoDB, [tabel](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.TablesItemsAttributes) adalah koleksi item. Setiap *item* adalah koleksi *atribut*. Tiap atribut memiliki nama dan nilai. SDK Enkripsi AWS Database untuk DynamoDB mengenkripsi nilai atribut. Kemudian, DynamoDB Encryption Client menghitung tanda tangan atas atribut. Anda menentukan nilai atribut mana yang akan dienkripsi dan mana yang akan disertakan dalam tanda tangan dalam tindakan [kriptografi](concepts.md#crypt-actions).

Topik dalam Bab ini memberikan gambaran umum tentang SDK Enkripsi AWS Database untuk DynamoDB, termasuk bidang mana yang dienkripsi, panduan tentang instalasi dan konfigurasi klien, dan contoh Java untuk membantu Anda memulai.

**Topics**
+ [Enkripsi di sisi klien dan sisi server](client-server-side.md)
+ [Bidang mana yang dienkripsi dan ditandatangani?](DDB-encrypted-and-signed.md)
+ [Enkripsi yang dapat dicari di DynamoDB](ddb-searchable-encryption.md)
+ [Memperbarui model data Anda](ddb-update-data-model.md)
+ [AWS SDK Enkripsi Database untuk DynamoDB bahasa pemrograman yang tersedia](ddb-programming-languages.md)
+ [Klien Enkripsi DynamoDB Legacy](legacy-dynamodb-encryption-client.md)

# Enkripsi di sisi klien dan sisi server
<a name="client-server-side"></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). | 

SDK Enkripsi AWS Database untuk DynamoDB *mendukung enkripsi sisi klien*, tempat Anda mengenkripsi data tabel sebelum mengirimkannya ke database. Namun, DynamoDB menyediakan fitur *enkripsi saat istirahat* di sisi server yang secara transparan mengenkripsi tabel Anda ketika ditahan ke disk dan mendekripsinya ketika Anda mengakses tabel. 

Alat-alat yang Anda pilih bergantung pada sensitivitas data Anda dan persyaratan keamanan aplikasi Anda. Anda dapat menggunakan SDK Enkripsi AWS Database untuk DynamoDB dan enkripsi saat istirahat. Ketika Anda mengirim item yang dienkripsi dan ditandatangani ke DynamoDB, DynamoDB tidak mengenali item sebagai dilindungi. DynamoDB hanya mendeteksi item tabel khas dengan nilai-nilai atribut biner. 

**Enkripsi sisi server saat istirahat**

DynamoDB mendukung [enkripsi saat istirahat](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EncryptionAtRest.html), sebuah fitur *enkripsi di sisi server* yang mana DynamoDB secara transparan mengenkripsi tabel Anda untuk Anda ketika tabel bertahan untuk disk, dan mendekripsinya ketika Anda mengakses data tabel.

Saat Anda menggunakan AWS SDK untuk berinteraksi dengan DynamoDB, secara default, data Anda dienkripsi saat transit melalui koneksi HTTPS, didekripsi di titik akhir DynamoDB, dan kemudian dienkripsi ulang sebelum disimpan di DynamoDB.
+ **Enkripsi secara default.** DynamoDB secara transparan mengenkripsi dan mendekripsi semua tabel saat ditulis. Tidak ada pilihan untuk mengaktifkan atau menonaktifkan enkripsi saat istirahat. 
+ **DynamoDB membuat dan mengelola kunci kriptografi.**Kunci unik untuk setiap tabel dilindungi oleh [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)yang tidak pernah meninggalkan [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) tidak terenkripsi. Secara default, DynamoDB menggunakan [Kunci milik AWS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)di akun layanan DynamoDB, tetapi Anda dapat memilih atau kunci [Kunci yang dikelola AWS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)yang [dikelola pelanggan di akun Anda untuk melindungi sebagian atau](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) semua tabel Anda.
+ **Semua data tabel dienkripsi pada disk.**Ketika tabel yang dienkripsi disimpan ke disk, DynamoDB mengenkripsi semua data tabel, termasuk [kunci primer](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) serta [indeks sekunder](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.SecondaryIndexes) lokal dan global. Jika tabel Anda memiliki kunci sortir, beberapa kunci sortir yang menandai batas kisaran disimpan dalam plaintext dalam metadata tabel.
+ **Objek yang terkait dengan tabel juga dienkripsi.** Enkripsi saat istirahat melindungi [DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html), [tabel global](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), dan [cadangan](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BackupRestore.html) setiap kali ditulis untuk media tahan lama.
+ **Item Anda didekripsi saat Anda mengaksesnya.**Ketika Anda mengakses tabel, DynamoDB mendekripsi bagian dari tabel yang mencakup item target Anda, dan mengembalikan item plaintext untuk Anda.

**AWS SDK Enkripsi Database untuk DynamoDB**

Enkripsi sisi klien memberikan end-to-end perlindungan untuk data Anda, dalam perjalanan dan saat istirahat, dari sumbernya ke penyimpanan di DynamoDB. Data plaintext Anda tidak pernah diekspos ke pihak ketiga mana pun, termasuk. AWS Anda dapat menggunakan SDK Enkripsi AWS Database untuk DynamoDB dengan tabel DynamoDB baru, atau Anda dapat memigrasikan tabel Amazon DynamoDB yang ada ke versi terbaru SDK Enkripsi Database untuk DynamoDB. AWS 
+ **Data Anda dilindungi saat transit dan saat istirahat.** Itu tidak pernah diekspos ke pihak ketiga mana pun, termasuk AWS.
+ **Anda dapat menandatangani Item tabel Anda.** Anda dapat mengarahkan SDK Enkripsi AWS Database untuk DynamoDB untuk menghitung tanda tangan atas semua atau sebagian item tabel, termasuk atribut kunci utama. Tanda tangan ini memungkinkan Anda untuk mendeteksi perubahan yang tidak sah pada item secara keseluruhan, termasuk menambahkan atau menghapus atribut, atau menukar nilai atribut.
+ **Anda menentukan bagaimana data Anda dilindungi** dengan [memilih keyring](keyrings.md). Keyring Anda menentukan kunci pembungkus yang melindungi kunci data Anda, dan akhirnya, data Anda. Gunakan kunci pembungkus paling aman yang praktis untuk tugas Anda.
+ **SDK Enkripsi AWS Database untuk DynamoDB tidak mengenkripsi seluruh tabel.** Anda memilih atribut mana yang dienkripsi dalam item Anda. SDK Enkripsi AWS Database untuk DynamoDB tidak mengenkripsi seluruh item. Ini tidak mengenkripsi nama atribut, atau nama atau nilai atribut kunci utama (kunci partisi dan kunci sortir).

**AWS Encryption SDK**

Jika Anda mengenkripsi data yang Anda simpan di DynamoDB, kami merekomendasikan SDK Enkripsi Database AWS untuk DynamoDB. 

[AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/) adalah pustaka enkripsi di sisi klien yang membantu Anda untuk mengenkripsi dan mendekripsi data generik. Meskipun dapat melindungi semua jenis data, ia tidak dirancang untuk bekerja dengan data terstruktur, seperti catatan basis data. Tidak seperti SDK Enkripsi AWS Database untuk DynamoDB, AWS Encryption SDK tidak dapat memberikan pemeriksaan integritas tingkat item dan tidak memiliki logika untuk mengenali atribut atau mencegah enkripsi kunci utama.

Jika Anda menggunakan AWS Encryption SDK untuk mengenkripsi elemen apa pun dari tabel Anda, ingatlah bahwa itu tidak kompatibel dengan SDK Enkripsi AWS Database untuk DynamoDB. Anda tidak dapat mengenkripsi dengan satu pustaka dan mendekripsinya dengan pustaka yang lain.

# Bidang mana yang dienkripsi dan ditandatangani?
<a name="DDB-encrypted-and-signed"></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). | 

SDK Enkripsi AWS Database untuk DynamoDB adalah pustaka enkripsi sisi klien yang dirancang khusus untuk aplikasi Amazon DynamoDB. Amazon DynamoDB menyimpan data [dalam](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.TablesItemsAttributes) tabel, yang merupakan kumpulan item. Setiap *item* adalah koleksi *atribut*. Tiap atribut memiliki nama dan nilai. SDK Enkripsi AWS Database untuk DynamoDB mengenkripsi nilai atribut. Kemudian, DynamoDB Encryption Client menghitung tanda tangan atas atribut. Anda dapat menentukan nilai atribut untuk dienkripsi dan yang disertakan dalam tanda tangan.

Enkripsi melindungi kerahasiaan nilai atribut. Penandatanganan menyediakan integritas semua atribut yang ditandatangani dan hubungan satu sama lain, dan menyediakan autentikasi. Hal ini memungkinkan Anda untuk mendeteksi perubahan yang tidak sah pada item secara keseluruhan, termasuk menambahkan atau menghapus atribut, atau mengganti satu nilai terenkripsi dengan yang lain.

Dalam item terenkripsi, beberapa data tetap dalam teks biasa, termasuk nama tabel, semua nama atribut, nilai atribut yang tidak Anda enkripsi, nama dan nilai atribut kunci primer (kunci partisi dan kunci sortir), dan jenis atribut. Jangan menyimpan data sensitif dalam bidang ini.

Untuk informasi selengkapnya tentang cara kerja SDK Enkripsi AWS Database untuk DynamoDB, lihat. [Cara kerja SDK Enkripsi AWS Database](how-it-works.md)

**catatan**  
[Semua penyebutan *tindakan atribut* dalam AWS Database Encryption SDK untuk topik DynamoDB mengacu pada tindakan kriptografi.](concepts.md#crypt-actions)

**Topics**
+ [Enkripsi nilai atribut](#encrypt-attribute-values)
+ [Penandatanganan item](#sign-the-item)

## Enkripsi nilai atribut
<a name="encrypt-attribute-values"></a>

SDK Enkripsi AWS Database untuk DynamoDB mengenkripsi nilai (tetapi bukan nama atau jenis atribut) atribut yang Anda tentukan. Untuk menentukan nilai atribut yang dienkripsi, gunakan [tindakan atribut](concepts.md#crypt-actions). 

Sebagai contoh, item ini termasuk atribut `example` dan `test`.

```
'example': 'data',
'test': 'test-value',
...
```

Jika Anda mengenkripsi atribut `example`, tetapi tidak mengenkripsi atribut `test`, hasilnya terlihat seperti berikut ini. Nilai atribut `example` yang dienkripsi adalah data biner, bukan string.

```
'example': Binary(b"'b\x933\x9a+s\xf1\xd6a\xc5\xd5\x1aZ\xed\xd6\xce\xe9X\xf0T\xcb\x9fY\x9f\xf3\xc9C\x83\r\xbb\\"),
'test': 'test-value'
...
```

Atribut kunci primer - kunci partisi dan kunci sortir-dari setiap item harus tetap dalam plaintext karena DynamoDB menggunakannya untuk menemukan item dalam tabel. Atribut itu harus ditandatangani, tapi tidak dienkripsi. 

SDK Enkripsi AWS Database untuk DynamoDB mengidentifikasi atribut kunci utama untuk Anda dan memastikan bahwa nilainya ditandatangani, tetapi tidak dienkripsi. Dan, jika Anda mengidentifikasi kunci utama Anda dan kemudian mencoba untuk mengenkripsinya, klien akan melemparkan pengecualian.

Klien menyimpan [deskripsi materi](concepts.md#material-description) dalam atribut baru (`aws_dbe_head`) yang ditambahkan ke item. Deskripsi materi menjelaskan bagaimana item dienkripsi dan ditandatangani. Klien menggunakan informasi ini untuk memverifikasi dan mendekripsi item. Bidang yang menyimpan deskripsi materi tidak dienkripsi.

## Penandatanganan item
<a name="sign-the-item"></a>

[Setelah mengenkripsi nilai atribut yang ditentukan, SDK Enkripsi AWS Database untuk DynamoDB menghitung Kode Otentikasi Pesan Berbasis Hash (HMACs) dan [tanda tangan digital](concepts.md#digital-sigs) atas kanonikalisasi deskripsi materi, [konteks enkripsi](concepts.md#encryption-context), dan setiap bidang yang ditandai, atau dalam tindakan atribut. `ENCRYPT_AND_SIGN``SIGN_ONLY``SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`](concepts.md#crypt-actions) Tanda tangan ECDSA diaktifkan secara default, tetapi tidak diperlukan. Klien menyimpan HMACs dan tanda tangan dalam atribut baru (`aws_dbe_foot`) yang ditambahkan ke item.

# Enkripsi yang dapat dicari di DynamoDB
<a name="ddb-searchable-encryption"></a>

Untuk mengonfigurasi tabel Amazon DynamoDB Anda untuk enkripsi yang dapat dicari, Anda harus menggunakan AWS KMS keyring [Hierarkis](use-hierarchical-keyring.md) untuk menghasilkan, mengenkripsi, dan mendekripsi kunci data yang digunakan untuk melindungi item Anda. Anda juga harus menyertakan konfigurasi enkripsi tabel Anda. [`SearchConfig`](ddb-net-using.md#ddb-net-search-config) 

**catatan**  
Jika Anda menggunakan pustaka enkripsi sisi klien Java untuk DynamoDB, Anda harus menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API untuk mengenkripsi, menandatangani, memverifikasi, dan mendekripsi item tabel Anda. DynamoDB Enhanced Client dan `DynamoDBItemEncryptor` level yang lebih rendah tidak mendukung enkripsi yang dapat dicari.

**Topics**
+ [Mengkonfigurasi indeks sekunder dengan beacon](#ddb-beacon-indexes)
+ [Menguji output suar](#ddb-beacon-testing)

## Mengkonfigurasi indeks sekunder dengan beacon
<a name="ddb-beacon-indexes"></a>

Setelah [Anda mengkonfigurasi beacon](configure-beacons.md) Anda, Anda harus mengkonfigurasi indeks sekunder yang mencerminkan setiap suar sebelum Anda dapat mencari pada atribut terenkripsi.

Saat Anda mengonfigurasi suar standar atau gabungan, SDK Enkripsi AWS Database menambahkan `aws_dbe_b_` awalan ke nama suar sehingga server dapat dengan mudah mengidentifikasi beacon. Misalnya, jika Anda menamai suar majemuk`compoundBeacon`, nama suar lengkapnya sebenarnya. `aws_dbe_b_compoundBeacon` Jika Anda ingin mengonfigurasi [indeks sekunder](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html) yang menyertakan suar standar atau majemuk, Anda harus menyertakan `aws_dbe_b_` awalan saat mengidentifikasi nama suar.

**Partisi dan sortir kunci**  
Anda tidak dapat mengenkripsi nilai kunci primer. Kunci partisi dan sortir Anda harus ditandatangani. Nilai kunci primer Anda tidak bisa menjadi suar standar atau majemuk.  
Nilai kunci utama Anda harus`SIGN_ONLY`, kecuali Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.  
Nilai kunci utama Anda dapat ditandatangani beacon. Jika Anda mengonfigurasi beacon bertanda tangan yang berbeda untuk setiap nilai kunci utama, Anda harus menentukan nama atribut yang mengidentifikasi nilai kunci primer sebagai nama suar yang ditandatangani. Namun, SDK Enkripsi AWS Database tidak menambahkan `aws_dbe_b_` awalan ke beacon yang ditandatangani. Bahkan jika Anda mengonfigurasi beacon bertanda tangan yang berbeda untuk nilai kunci utama Anda, Anda hanya perlu menentukan nama atribut untuk nilai kunci primer saat Anda mengonfigurasi indeks sekunder.

**Indeks sekunder lokal**  
Kunci sortir untuk [indeks sekunder lokal](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html) dapat berupa suar.  
Jika Anda menentukan suar untuk kunci sortir, tipenya harus String. Jika Anda menentukan standar atau suar majemuk untuk kunci sortir, Anda harus menyertakan `aws_dbe_b_` awalan saat Anda menentukan nama suar. Jika Anda menentukan suar yang ditandatangani, tentukan nama suar tanpa awalan apa pun.

**Indeks sekunder global**  
Kunci partisi dan sortir untuk [indeks sekunder global](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html) dapat berupa beacon.  
Jika Anda menentukan suar untuk partisi atau kunci sortir, jenisnya harus String. Jika Anda menentukan standar atau suar majemuk untuk kunci sortir, Anda harus menyertakan `aws_dbe_b_` awalan saat Anda menentukan nama suar. Jika Anda menentukan suar yang ditandatangani, tentukan nama suar tanpa awalan apa pun.

**Proyeksi atribut**  
[Proyeksi](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Projections) adalah kumpulan atribut yang disalin dari tabel ke indeks sekunder. Kunci partisi dan kunci urutan tabel selalu diproyeksikan ke dalam indeks; Anda dapat memproyeksikan atribut lain untuk mendukung persyaratan kueri aplikasi Anda. DynamoDB menyediakan tiga opsi berbeda untuk proyeksi `KEYS_ONLY` atribut:,, dan. `INCLUDE` `ALL`  
Jika Anda menggunakan proyeksi atribut INCLUDE untuk mencari pada suar, Anda harus menentukan nama untuk semua atribut yang suar dibangun dari dan nama suar dengan awalan. `aws_dbe_b_` Misalnya, jika Anda mengkonfigurasi suar majemuk,`compoundBeacon`, dari,`field1`, dan `field2``field3`, Anda harus menentukan`aws_dbe_b_compoundBeacon`,, `field1``field2`, dan `field3` dalam proyeksi.  
Indeks sekunder global hanya dapat menggunakan atribut yang ditentukan secara eksplisit dalam proyeksi, tetapi indeks sekunder lokal dapat menggunakan atribut apa pun.

## Menguji output suar
<a name="ddb-beacon-testing"></a>

Jika Anda [mengonfigurasi suar majemuk](configure-beacons.md#config-compound-beacons) atau membuat beacon menggunakan [bidang virtual](configure-beacons.md#create-virtual-field), sebaiknya verifikasi bahwa beacon ini menghasilkan output yang diharapkan sebelum mengisi tabel DynamoDB Anda.

 AWS Database Encryption SDK menyediakan `DynamoDbEncryptionTransforms` layanan untuk membantu Anda memecahkan masalah bidang virtual dan output suar gabungan.

### Menguji bidang virtual
<a name="ddb-beacon-testing-virtual-field"></a>

Cuplikan berikut membuat item pengujian, mendefinisikan `DynamoDbEncryptionTransforms` layanan dengan [konfigurasi enkripsi tabel DynamoDB](ddb-java-using.md#ddb-config-encrypt), dan menunjukkan cara menggunakan `ResolveAttributes` untuk memverifikasi bahwa bidang virtual menghasilkan output yang diharapkan.

------
#### [ Java ]

**Lihat contoh kode lengkapnya**: [VirtualBeaconSearchableEncryptionExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/searchableencryption/VirtualBeaconSearchableEncryptionExample.java) 

```
// Create test items
final PutItemRequest itemWithHasTestResultPutRequest = PutItemRequest.builder()
    .tableName(ddbTableName)
    .item(itemWithHasTestResult)
    .build();

final PutItemResponse itemWithHasTestResultPutResponse = ddb.putItem(itemWithHasTestResultPutRequest);

final PutItemRequest itemWithNoHasTestResultPutRequest = PutItemRequest.builder()
    .tableName(ddbTableName)
    .item(itemWithNoHasTestResult)
    .build();
    
final PutItemResponse itemWithNoHasTestResultPutResponse = ddb.putItem(itemWithNoHasTestResultPutRequest);    

// Define the DynamoDbEncryptionTransforms service
final DynamoDbEncryptionTransforms trans = DynamoDbEncryptionTransforms.builder()
    .DynamoDbTablesEncryptionConfig(encryptionConfig).build();

// Verify configuration
final ResolveAttributesInput resolveInput = ResolveAttributesInput.builder()
    .TableName(ddbTableName)
    .Item(itemWithHasTestResult)
    .Version(1)
    .build();
final ResolveAttributesOutput resolveOutput = trans.ResolveAttributes(resolveInput);

// Verify that VirtualFields has the expected value
Map<String, String> vf = new HashMap<>();
vf.put("stateAndHasTestResult", "CAt");
assert resolveOutput.VirtualFields().equals(vf);
```

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

**Lihat contoh kode lengkapnya**: [VirtualBeaconSearchableEncryptionExample.cs.](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/searchableencryption/VirtualBeaconSearchableEncryptionExample.cs)

```
 // Create item with hasTestResult=true
var itemWithHasTestResult = new Dictionary<String, AttributeValue>
{
    ["customer_id"] = new AttributeValue("ABC-123"),
    ["create_time"] = new AttributeValue { N = "1681495205" },
    ["state"] = new AttributeValue("CA"),
    ["hasTestResult"] = new AttributeValue { BOOL = true }
};

// Create item with hasTestResult=false
var itemWithNoHasTestResult = new Dictionary<String, AttributeValue>
{
    ["customer_id"] = new AttributeValue("DEF-456"),
    ["create_time"] = new AttributeValue { N = "1681495205" },
    ["state"] = new AttributeValue("CA"),
    ["hasTestResult"] = new AttributeValue { BOOL = false }
};

// Define the DynamoDbEncryptionTransforms service
var trans = new DynamoDbEncryptionTransforms(encryptionConfig);

// Verify configuration
var resolveInput = new ResolveAttributesInput
{
    TableName = ddbTableName,
    Item = itemWithHasTestResult,
    Version = 1
};
var resolveOutput = trans.ResolveAttributes(resolveInput);

// Verify that VirtualFields has the expected value
Debug.Assert(resolveOutput.VirtualFields.Count == 1);
Debug.Assert(resolveOutput.VirtualFields["stateAndHasTestResult"] == "CAt");
```

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

**Lihat contoh kode lengkap: [virtual\$1beacon\$1searchable\$1encryption.rs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/searchableencryption/virtual_beacon_searchable_encryption.rs)**.

```
// Create item with hasTestResult=true
let item_with_has_test_result = HashMap::from([
    (
        "customer_id".to_string(),
        AttributeValue::S("ABC-123".to_string()),
    ),
    (
        "create_time".to_string(),
        AttributeValue::N("1681495205".to_string()),
    ),
    ("state".to_string(), AttributeValue::S("CA".to_string())),
    ("hasTestResult".to_string(), AttributeValue::Bool(true)),
]);

// Create item with hasTestResult=false
let item_with_no_has_test_result = HashMap::from([
    (
        "customer_id".to_string(),
        AttributeValue::S("DEF-456".to_string()),
    ),
    (
        "create_time".to_string(),
        AttributeValue::N("1681495205".to_string()),
    ),
    ("state".to_string(), AttributeValue::S("CA".to_string())),
    ("hasTestResult".to_string(), AttributeValue::Bool(false)),
]);

// Define the transform service
let trans = transform_client::Client::from_conf(encryption_config.clone())?;

// Verify the configuration 
let resolve_output = trans
    .resolve_attributes()
    .table_name(ddb_table_name)
    .item(item_with_has_test_result.clone())
    .version(1)
    .send()
    .await?;

// Verify that VirtualFields has the expected value
let virtual_fields = resolve_output.virtual_fields.unwrap();
assert_eq!(virtual_fields.len(), 1);
assert_eq!(virtual_fields["stateAndHasTestResult"], "CAt");
```

------

### Menguji suar majemuk
<a name="ddb-beacon-testing-compound-beacon"></a>

Cuplikan berikut membuat item uji, mendefinisikan `DynamoDbEncryptionTransforms` layanan dengan [konfigurasi enkripsi tabel](ddb-java-using.md#ddb-config-encrypt) DynamoDB, dan menunjukkan cara menggunakan untuk memverifikasi bahwa suar majemuk menghasilkan output yang `ResolveAttributes` diharapkan.

------
#### [ Java ]

**Lihat contoh kode lengkapnya**: [CompoundBeaconSearchableEncryptionExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/searchableencryption/CompoundBeaconSearchableEncryptionExample.java) 

```
// Create an item with both attributes used in the compound beacon.
final HashMap<String, AttributeValue> item = new HashMap<>();
item.put("work_id", AttributeValue.builder().s("9ce39272-8068-4efd-a211-cd162ad65d4c").build());
item.put("inspection_date", AttributeValue.builder().s("2023-06-13").build());
item.put("inspector_id_last4", AttributeValue.builder().s("5678").build());
item.put("unit", AttributeValue.builder().s("011899988199").build());
                            
// Define the DynamoDbEncryptionTransforms service
final DynamoDbEncryptionTransforms trans = DynamoDbEncryptionTransforms.builder()
    .DynamoDbTablesEncryptionConfig(encryptionConfig).build();

// Verify configuration 
final ResolveAttributesInput resolveInput = ResolveAttributesInput.builder()
    .TableName(ddbTableName)
    .Item(item)
    .Version(1)
    .build();

final ResolveAttributesOutput resolveOutput = trans.ResolveAttributes(resolveInput);
                            
// Verify that CompoundBeacons has the expected value   
Map<String, String> cbs = new HashMap<>();
cbs.put("last4UnitCompound", "L-5678.U-011899988199");
assert resolveOutput.CompoundBeacons().equals(cbs);
// Note : the compound beacon actually stored in the table is not "L-5678.U-011899988199"
// but rather something like "L-abc.U-123", as both parts are EncryptedParts
// and therefore the text is replaced by the associated beacon
```

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

**Lihat contoh kode lengkapnya**: [CompoundBeaconSearchableEncryptionExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/searchableencryption/CompoundBeaconSearchableEncryptionExample.cs)

```
// Create an item with both attributes used in the compound beacon
var item = new Dictionary<String, AttributeValue>
{
    ["work_id"] = new AttributeValue("9ce39272-8068-4efd-a211-cd162ad65d4c"),
    ["inspection_date"] = new AttributeValue("2023-06-13"),
    ["inspector_id_last4"] = new AttributeValue("5678"),
    ["unit"] = new AttributeValue("011899988199")
};                           
                            
// Define the DynamoDbEncryptionTransforms service
var trans = new DynamoDbEncryptionTransforms(encryptionConfig);

// Verify configuration
var resolveInput = new ResolveAttributesInput
{
    TableName = ddbTableName,
    Item = item,
    Version = 1
};
var resolveOutput = trans.ResolveAttributes(resolveInput);                            
                            
// Verify that CompoundBeacons has the expected value 
Debug.Assert(resolveOutput.CompoundBeacons.Count == 1);
Debug.Assert(resolveOutput.CompoundBeacons["last4UnitCompound"] == "L-5678.U-011899988199");
// Note : the compound beacon actually stored in the table is not "L-5678.U-011899988199"
// but rather something like "L-abc.U-123", as both parts are EncryptedParts
// and therefore the text is replaced by the associated beacon
```

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

**Lihat contoh kode lengkap: [compound\$1beacon\$1searchable\$1encryption.rs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/searchableencryption/compound_beacon_searchable_encryption.rs)**

```
// Create an item with both attributes used in the compound beacon
let item = HashMap::from([
    (
        "work_id".to_string(),
        AttributeValue::S("9ce39272-8068-4efd-a211-cd162ad65d4c".to_string()),
    ),
    (
        "inspection_date".to_string(),
        AttributeValue::S("2023-06-13".to_string()),
    ),
    (
        "inspector_id_last4".to_string(),
        AttributeValue::S("5678".to_string()),
    ),
    (
        "unit".to_string(),
        AttributeValue::S("011899988199".to_string()),
    ),
]);                           
                            
// Define the transforms service
let trans = transform_client::Client::from_conf(encryption_config.clone())?;

// Verify configuration
let resolve_output = trans
    .resolve_attributes()
    .table_name(ddb_table_name)
    .item(item.clone())
    .version(1)
    .send()
    .await?;                            
                            
// Verify that CompoundBeacons has the expected value 
let compound_beacons = resolve_output.compound_beacons.unwrap();
assert_eq!(compound_beacons.len(), 1);
assert_eq!(
    compound_beacons["last4UnitCompound"],
    "L-5678.U-011899988199"
);
// but rather something like "L-abc.U-123", as both parts are EncryptedParts
// and therefore the text is replaced by the associated beacon
```

------

# Memperbarui model data Anda
<a name="ddb-update-data-model"></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). | 

[Saat mengonfigurasi SDK Enkripsi AWS Database untuk DynamoDB, Anda memberikan tindakan atribut.](concepts.md#crypt-actions) Pada enkripsi, AWS Database Encryption SDK menggunakan tindakan atribut untuk mengidentifikasi atribut mana yang akan dienkripsi dan ditandatangani, atribut mana yang akan ditandatangani (tetapi tidak mengenkripsi), dan mana yang harus diabaikan. Anda juga menentukan [atribut unsigned yang diizinkan](ddb-java-using.md#allowed-unauth) untuk secara eksplisit memberi tahu klien atribut mana yang dikecualikan dari tanda tangan. Saat mendekripsi, SDK Enkripsi AWS Database menggunakan atribut unsigned yang diizinkan yang Anda tetapkan untuk mengidentifikasi atribut mana yang tidak disertakan dalam tanda tangan. Tindakan atribut tidak disimpan dalam item terenkripsi dan SDK Enkripsi AWS Database tidak memperbarui tindakan atribut Anda secara otomatis.

Pilih tindakan atribut Anda dengan hati-hati. Bila ragu, gunakan **Enkripsi dan tanda tangan**. Setelah Anda menggunakan AWS Database Encryption SDK untuk melindungi item Anda, Anda tidak dapat mengubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada `ENCRYPT_AND_SIGN``SIGN_ONLY`, atau ke`DO_NOTHING`. Namun, Anda dapat dengan aman melakukan perubahan berikut.
+ [Tambahkan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut baru `ENCRYPT_AND_SIGN``SIGN_ONLY`, dan](#ddb-add-auth-attribute)
+ [Hapus atribut yang ada](#ddb-remove-attribute)
+ [Ubah `ENCRYPT_AND_SIGN` atribut yang ada ke `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`](#ddb-encrypt-to-sign)
+ [Ubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut `SIGN_ONLY` atau yang sudah ada ke `ENCRYPT_AND_SIGN`](#ddb-sign-to-encrypt)
+ [Tambahkan `DO_NOTHING` atribut baru](#ddb-add-unauth-attribute)
+ [Ubah `SIGN_ONLY` atribut yang ada menjadi `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`](#ddb-signOnly-to-signInclude)
+ [Ubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada menjadi `SIGN_ONLY`](#ddb-signInclude-to-signOnly)

**Pertimbangan untuk enkripsi yang dapat dicari**  
Sebelum Anda memperbarui model data Anda, pertimbangkan dengan cermat bagaimana pembaruan Anda dapat memengaruhi [beacon](beacons.md) apa pun yang Anda buat dari atribut. Setelah Anda menulis catatan baru dengan suar, Anda tidak dapat memperbarui konfigurasi suar. Anda tidak dapat memperbarui tindakan atribut yang terkait dengan atribut yang Anda gunakan untuk membangun beacon. Jika Anda menghapus atribut yang ada dan suar terkait, Anda tidak akan dapat menanyakan catatan yang ada menggunakan suar itu. Anda dapat membuat beacon baru untuk bidang baru yang ditambahkan ke rekaman, tetapi Anda tidak dapat memperbarui beacon yang ada untuk menyertakan bidang baru.

**Pertimbangan untuk atribut `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`**  
Secara default, kunci partisi dan sortir adalah satu-satunya atribut yang disertakan dalam konteks enkripsi. Anda dapat mempertimbangkan untuk mendefinisikan bidang tambahan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` agar pemasok ID kunci cabang untuk [keyring AWS KMS Hierarkis](use-hierarchical-keyring.md) Anda dapat mengidentifikasi kunci cabang mana yang diperlukan untuk dekripsi dari konteks enkripsi. Untuk informasi selengkapnya, lihat [pemasok ID kunci cabang](use-hierarchical-keyring.md#branch-key-id-supplier). Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**catatan**  
Untuk menggunakan tindakan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` kriptografi, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.3 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum [memperbarui model data Anda](#ddb-update-data-model) untuk disertakan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

## Tambahkan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut baru `ENCRYPT_AND_SIGN``SIGN_ONLY`, dan
<a name="ddb-add-auth-attribute"></a>

Untuk menambahkan atribut baru `ENCRYPT_AND_SIGN``SIGN_ONLY`, atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut, tentukan atribut baru dalam tindakan atribut Anda.

Anda tidak dapat menghapus `DO_NOTHING` atribut yang ada dan menambahkannya kembali sebagai`ENCRYPT_AND_SIGN`,`SIGN_ONLY`, atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut.

**Menggunakan kelas data beranotasi**  
Jika Anda mendefinisikan tindakan atribut Anda dengan a`TableSchema`, tambahkan atribut baru ke kelas data beranotasi Anda. Jika Anda tidak menentukan anotasi tindakan atribut untuk atribut baru, klien akan mengenkripsi dan menandatangani atribut baru secara default (kecuali atribut adalah bagian dari kunci utama). Jika Anda hanya ingin menandatangani atribut baru, Anda harus menambahkan atribut baru dengan `@DynamoDBEncryptionSignOnly` atau `@DynamoDBEncryptionSignAndIncludeInEncryptionContext` anotasi.

**Menggunakan model objek**  
Jika Anda secara manual mendefinisikan tindakan atribut Anda, tambahkan atribut baru ke tindakan atribut dalam model objek Anda dan tentukan `ENCRYPT_AND_SIGN``SIGN_ONLY`,, atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` sebagai tindakan atribut.

## Hapus atribut yang ada
<a name="ddb-remove-attribute"></a>

Jika Anda memutuskan bahwa Anda tidak lagi memerlukan atribut, Anda dapat berhenti menulis data ke atribut tersebut atau Anda dapat secara resmi menghapusnya dari tindakan atribut Anda. Ketika Anda berhenti menulis data baru ke atribut, atribut masih muncul dalam tindakan atribut Anda. Ini dapat membantu jika Anda perlu mulai menggunakan atribut lagi di masa mendatang. Menghapus atribut secara formal dari tindakan atribut Anda tidak menghapusnya dari kumpulan data Anda. Dataset Anda akan tetap berisi item yang menyertakan atribut itu.

Untuk menghapus `DO_NOTHING` atribut`ENCRYPT_AND_SIGN`,, `SIGN_ONLY` atau yang sudah ada secara resmi, perbarui tindakan atribut Anda. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`

Jika Anda menghapus `DO_NOTHING` atribut, Anda tidak boleh menghapus atribut tersebut dari atribut yang [tidak ditandatangani yang diizinkan](ddb-java-using.md#allowed-unauth). Bahkan jika Anda tidak lagi menulis nilai baru ke atribut itu, klien masih perlu tahu bahwa atribut tersebut tidak ditandatangani untuk membaca item yang ada yang berisi atribut.

**Menggunakan kelas data beranotasi**  
Jika Anda mendefinisikan tindakan atribut Anda dengan a`TableSchema`, hapus atribut dari kelas data beranotasi Anda.

**Menggunakan model objek**  
Jika Anda secara manual mendefinisikan tindakan atribut Anda, hapus atribut dari tindakan atribut dalam model objek Anda.

## Ubah `ENCRYPT_AND_SIGN` atribut yang ada ke `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`
<a name="ddb-encrypt-to-sign"></a>

Untuk mengubah `ENCRYPT_AND_SIGN` atribut yang ada ke `SIGN_ONLY` atau`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, Anda harus memperbarui tindakan atribut Anda. Setelah Anda menerapkan pembaruan, klien akan dapat memverifikasi dan mendekripsi nilai yang ada yang ditulis ke atribut, tetapi hanya akan menandatangani nilai baru yang ditulis ke atribut.

**catatan**  
Pertimbangkan persyaratan keamanan Anda dengan cermat sebelum mengubah `ENCRYPT_AND_SIGN` atribut yang ada ke `SIGN_ONLY` atau`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Atribut apa pun yang dapat menyimpan data sensitif harus dienkripsi.

**Menggunakan kelas data beranotasi**  
Jika Anda mendefinisikan tindakan atribut dengan a`TableSchema`, perbarui atribut yang ada untuk menyertakan `@DynamoDBEncryptionSignOnly` atau `@DynamoDBEncryptionSignAndIncludeInEncryptionContext` anotasi dalam kelas data beranotasi Anda.

**Menggunakan model objek**  
Jika Anda menentukan tindakan atribut secara manual, perbarui tindakan atribut yang terkait dengan atribut yang ada dari `ENCRYPT_AND_SIGN` ke `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` dalam model objek Anda.

## Ubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut `SIGN_ONLY` atau yang sudah ada ke `ENCRYPT_AND_SIGN`
<a name="ddb-sign-to-encrypt"></a>

Untuk mengubah atribut `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada`ENCRYPT_AND_SIGN`, Anda harus memperbarui tindakan atribut Anda. Setelah Anda menyebarkan pembaruan, klien akan dapat memverifikasi nilai yang ada yang ditulis ke atribut, dan akan mengenkripsi dan menandatangani nilai baru yang ditulis ke atribut.

**Menggunakan kelas data beranotasi**  
Jika Anda menentukan tindakan atribut Anda dengan a`TableSchema`, hapus `@DynamoDBEncryptionSignOnly` atau `@DynamoDBEncryptionSignAndIncludeInEncryptionContext` anotasi dari atribut yang ada.

**Menggunakan model objek**  
Jika Anda menentukan tindakan atribut secara manual, perbarui tindakan atribut yang terkait dengan atribut dari `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` ke `ENCRYPT_AND_SIGN` dalam model objek Anda.

## Tambahkan `DO_NOTHING` atribut baru
<a name="ddb-add-unauth-attribute"></a>

Untuk mengurangi risiko kesalahan saat menambahkan `DO_NOTHING` atribut baru, sebaiknya tentukan awalan yang berbeda saat menamai `DO_NOTHING` atribut Anda, lalu gunakan awalan tersebut untuk menentukan atribut unsigned yang [diizinkan](ddb-java-using.md#allowed-unauth).

Anda tidak dapat menghapus `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada `ENCRYPT_AND_SIGN``SIGN_ONLY`,, atau dari kelas data beranotasi dan kemudian menambahkan atribut kembali sebagai `DO_NOTHING` atribut. Anda hanya dapat menambahkan `DO_NOTHING` atribut yang sama sekali baru.

Langkah-langkah yang Anda ambil untuk menambahkan `DO_NOTHING` atribut baru bergantung pada apakah Anda menetapkan atribut unsigned yang diizinkan secara eksplisit dalam daftar atau dengan awalan.

**Menggunakan awalan atribut unsigned yang diizinkan**  
Jika Anda mendefinisikan tindakan atribut Anda dengan a`TableSchema`, tambahkan `DO_NOTHING` atribut baru ke kelas data beranotasi Anda dengan anotasi`@DynamoDBEncryptionDoNothing`. Jika Anda menentukan tindakan atribut secara manual, perbarui tindakan atribut Anda untuk menyertakan atribut baru. Pastikan untuk secara eksplisit mengkonfigurasi atribut baru dengan tindakan `DO_NOTHING` atribut. Anda harus menyertakan awalan berbeda yang sama dalam nama atribut baru.

**Menggunakan daftar atribut unsigned yang diizinkan**

1. Tambahkan `DO_NOTHING` atribut baru ke daftar atribut unsigned yang diizinkan dan terapkan daftar yang diperbarui.

1. Terapkan perubahan dari **Langkah 1**.

   Anda tidak dapat melanjutkan ke **Langkah 3** sampai perubahan telah menyebar ke semua host yang perlu membaca data ini.

1. Tambahkan `DO_NOTHING` atribut baru ke tindakan atribut Anda.

   1. Jika Anda mendefinisikan tindakan atribut Anda dengan a`TableSchema`, tambahkan `DO_NOTHING` atribut baru ke kelas data beranotasi Anda dengan anotasi`@DynamoDBEncryptionDoNothing`.

   1. Jika Anda menentukan tindakan atribut secara manual, perbarui tindakan atribut Anda untuk menyertakan atribut baru. Pastikan untuk secara eksplisit mengkonfigurasi atribut baru dengan tindakan `DO_NOTHING` atribut.

1. Terapkan perubahan dari **Langkah 3**.

## Ubah `SIGN_ONLY` atribut yang ada menjadi `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`
<a name="ddb-signOnly-to-signInclude"></a>

Untuk mengubah `SIGN_ONLY` atribut yang ada`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, Anda harus memperbarui tindakan atribut Anda. Setelah Anda menyebarkan pembaruan, klien akan dapat memverifikasi nilai yang ada yang ditulis ke atribut, dan akan terus menandatangani nilai baru yang ditulis ke atribut. Nilai baru yang ditulis ke atribut akan disertakan dalam [konteks enkripsi](concepts.md#encryption-context).

Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**Menggunakan kelas data beranotasi**  
Jika Anda menentukan tindakan atribut Anda dengan a`TableSchema`, perbarui tindakan atribut yang terkait dengan atribut dari `@DynamoDBEncryptionSignOnly` ke`@DynamoDBEncryptionSignAndIncludeInEncryptionContext`.

**Menggunakan model objek**  
Jika Anda menentukan tindakan atribut secara manual, perbarui tindakan atribut yang terkait dengan atribut dari `SIGN_ONLY` ke `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` dalam model objek Anda.

## Ubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada menjadi `SIGN_ONLY`
<a name="ddb-signInclude-to-signOnly"></a>

Untuk mengubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada`SIGN_ONLY`, Anda harus memperbarui tindakan atribut Anda. Setelah Anda menyebarkan pembaruan, klien akan dapat memverifikasi nilai yang ada yang ditulis ke atribut, dan akan terus menandatangani nilai baru yang ditulis ke atribut. Nilai baru yang ditulis ke atribut tidak akan disertakan dalam [konteks enkripsi](concepts.md#encryption-context).

Sebelum mengubah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut yang ada`SIGN_ONLY`, pertimbangkan dengan cermat bagaimana pembaruan Anda dapat memengaruhi fungsionalitas [pemasok ID kunci cabang](use-hierarchical-keyring.md#branch-key-id-supplier) Anda.

**Menggunakan kelas data beranotasi**  
Jika Anda menentukan tindakan atribut Anda dengan a`TableSchema`, perbarui tindakan atribut yang terkait dengan atribut dari `@DynamoDBEncryptionSignAndIncludeInEncryptionContext` ke`@DynamoDBEncryptionSignOnly`.

**Menggunakan model objek**  
Jika Anda menentukan tindakan atribut secara manual, perbarui tindakan atribut yang terkait dengan atribut dari `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` ke `SIGN_ONLY` dalam model objek Anda.

# AWS SDK Enkripsi Database untuk DynamoDB bahasa pemrograman yang tersedia
<a name="ddb-programming-languages"></a>

SDK Enkripsi AWS Database untuk DynamoDB tersedia untuk bahasa pemrograman berikut. Pustaka spesifik-bahasa bervariasi, tetapi implementasi yang dihasilkan dapat dioperasikan. Anda dapat mengenkripsi dengan satu implementasi bahasa dan mendekripsi dengan yang lain. Interoperabilitas mungkin tunduk pada kendala bahasa. Jika demikian, kendala ini dijelaskan dalam topik tentang implementasi bahasa. 

**Topics**
+ [Java](ddb-java.md)
+ [.NET](ddb-net.md)
+ [Karat](ddb-rust.md)

# Java
<a name="ddb-java"></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). | 

Topik ini menjelaskan cara menginstal dan menggunakan versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB. Untuk detail tentang pemrograman dengan AWS Database Encryption SDK untuk DynamoDB, lihat contoh [Java di aws-database-encryption-sdk repositori -dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples) aktif. GitHub

**catatan**  
Topik berikut fokus pada versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB.  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). AWS Database Encryption SDK terus mendukung versi Klien Enkripsi [DynamoDB lama](legacy-dynamodb-encryption-client.md).

**Topics**
+ [Prasyarat](#ddb-java-prerequisites)
+ [Penginstalan](#ddb-java-installation)
+ [Menggunakan klien Java](ddb-java-using.md)
+ [Contoh Java](ddb-java-examples.md)
+ [Tambahkan versi 3.x ke tabel yang ada](ddb-java-config-existing-table.md)
+ [Migrasi ke versi 3.x](ddb-java-migrate.md)

## Prasyarat
<a name="ddb-java-prerequisites"></a>

Sebelum Anda menginstal versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB, pastikan Anda memiliki prasyarat berikut.

**Lingkungan pengembangan Java**  
Anda akan membutuhkan Java 8 atau yang lebih baru. Di situs web Oracle, buka [Unduhan Java SE](https://www.oracle.com/java/technologies/downloads/), kemudian unduh dan instal Java SE Development Kit (JDK).  
Jika Anda menggunakan Oracle JDK, Anda juga harus mengunduh dan menginstal [File Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy](http://www.oracle.com/java/technologies/javase-jce8-downloads.html).

**AWS SDK for Java 2.x**  
SDK Enkripsi AWS Database untuk DynamoDB memerlukan modul DynamoDB [Enhanced Client dari modul](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html). AWS SDK for Java 2.x Anda dapat menginstal seluruh SDK atau modul ini saja.  
Untuk informasi tentang memperbarui versi Anda AWS SDK untuk Java, lihat [Memigrasi dari versi 1.x ke 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration.html). AWS SDK untuk Java  
Tersedia melalui Apache Maven. AWS SDK untuk Java Anda dapat mendeklarasikan ketergantungan untuk keseluruhan AWS SDK untuk Java, atau hanya modul. `dynamodb-enhanced`  

**Instal AWS SDK untuk Java menggunakan Apache Maven**
+ Untuk [mengimpor keseluruhan AWS SDK untuk Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#build-the-entire-sdk-into-your-project) sebagai dependensi, deklarasikan dalam file Anda. `pom.xml`
+ Untuk membuat dependensi hanya untuk modul Amazon DynamoDB AWS SDK untuk Java di, ikuti [petunjuk](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-project-maven.html#modules-dependencies) untuk menentukan modul tertentu. Atur `groupId` ke `software.amazon.awssdk` dan `artifactID` ke`dynamodb-enhanced`.
**catatan**  
Jika Anda menggunakan AWS KMS keyring atau keyring AWS KMS Hierarchical, Anda juga perlu membuat dependensi untuk modul. AWS KMS Atur `groupId` ke `software.amazon.awssdk` dan `artifactID` ke`kms`.

## Penginstalan
<a name="ddb-java-installation"></a>

Anda dapat menginstal versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB dengan cara berikut.

**Menggunakan Apache Maven**  
Amazon DynamoDB Encryption Client untuk Java tersedia melalui [Apache Maven](https://maven.apache.org/) dengan definisi dependensi berikut.  

```
<dependency>
  <groupId>software.amazon.cryptography</groupId>
  <artifactId>aws-database-encryption-sdk-dynamodb</artifactId>
  <version>version-number</version>
</dependency>
```

**Menggunakan Gradle Kotlin**  
*Anda dapat menggunakan [Gradle](https://gradle.org/) untuk mendeklarasikan dependensi pada Klien Enkripsi Amazon DynamoDB untuk Java dengan menambahkan yang berikut ini ke bagian dependensi proyek Gradle Anda.*  

```
implementation("software.amazon.cryptography:aws-database-encryption-sdk-dynamodb:version-number")
```

**Secara manual**  
[Untuk menginstal pustaka enkripsi sisi klien Java untuk DynamoDB, kloning atau unduh repositori -dynamodb. aws-database-encryption-sdk](https://github.com/aws/aws-database-encryption-sdk-dynamodb/) GitHub

Setelah Anda menginstal SDK, mulailah dengan melihat kode contoh dalam panduan ini dan [contoh Java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples) di repositori aws-database-encryption-sdk -dynamodb aktif. GitHub

# Menggunakan pustaka enkripsi sisi klien Java untuk DynamoDB
<a name="ddb-java-using"></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). | 

Topik ini menjelaskan beberapa fungsi dan kelas pembantu di versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB. 

Untuk detail tentang pemrograman dengan pustaka enkripsi sisi klien Java untuk DynamoDB, lihat contoh Java, [contoh Java](java-examples.md) di repositori -dynamodb [aktif](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples). aws-database-encryption-sdk GitHub

**Topics**
+ [Enkriptor item](#ddb-item-encryptors)
+ [Tindakan atribut](#ddb-attribute-actions)
+ [Konfigurasi enkripsi](#ddb-config-encrypt)
+ [Memperbarui item](#ddb-update-items)
+ [Mendekripsi set yang ditandatangani](#ddb-java-signed-sets)

## Enkriptor item
<a name="ddb-item-encryptors"></a>

Pada intinya, AWS Database Encryption SDK untuk DynamoDB adalah enkripsi item. Anda dapat menggunakan versi 3. *x* pustaka enkripsi sisi klien Java untuk DynamoDB untuk mengenkripsi, menandatangani, memverifikasi, dan mendekripsi item tabel DynamoDB Anda dengan cara berikut.

**Klien yang Ditingkatkan DynamoDB**  
Anda dapat mengkonfigurasi [DynamoDB Enhanced Client dengan untuk secara otomatis mengenkripsi dan menandatangani item sisi klien dengan `DynamoDbEncryptionInterceptor` permintaan DynamoDB](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html) Anda. `PutItem` Dengan DynamoDB Enhanced Client, Anda dapat menentukan tindakan atribut Anda menggunakan kelas data [beranotasi](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html#ddb-en-client-gs-tableschema-anno-bean). Sebaiknya gunakan DynamoDB Enhanced Client bila memungkinkan.  
[DynamoDB Enhanced Client tidak mendukung enkripsi yang dapat dicari.](searchable-encryption.md)  
SDK Enkripsi AWS Database tidak mendukung anotasi pada atribut [bersarang](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html).

**API DynamoDB tingkat rendah**  
Anda dapat mengonfigurasi API [DynamoDB tingkat rendah dengan untuk secara otomatis mengenkripsi dan menandatangani item `DynamoDbEncryptionInterceptor` sisi klien dengan permintaan DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html) Anda. `PutItem`  
[Anda harus menggunakan API DynamoDB tingkat rendah untuk menggunakan enkripsi yang dapat dicari.](searchable-encryption.md)

**Tingkat yang lebih rendah `DynamoDbItemEncryptor`**  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` secara langsung mengenkripsi dan menandatangani atau mendekripsi dan memverifikasi item tabel Anda tanpa memanggil DynamoDB. Itu tidak membuat DynamoDB atau `PutItem` permintaan`GetItem`. Misalnya, Anda dapat menggunakan level yang lebih rendah `DynamoDbItemEncryptor` untuk langsung mendekripsi dan memverifikasi item DynamoDB yang telah Anda ambil.  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` tidak mendukung enkripsi yang dapat [dicari](searchable-encryption.md).

## Tindakan atribut dalam SDK Enkripsi AWS Database untuk DynamoDB
<a name="ddb-attribute-actions"></a>

[Tindakan atribut](concepts.md#crypt-actions) menentukan nilai atribut mana yang dienkripsi dan ditandatangani, yang hanya ditandatangani, yang ditandatangani dan disertakan dalam konteks enkripsi, dan mana yang diabaikan.

**catatan**  
Untuk menggunakan tindakan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` kriptografi, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.3 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum [memperbarui model data Anda](ddb-update-data-model.md) untuk disertakan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

Jika Anda menggunakan API DynamoDB tingkat rendah atau level yang `DynamoDbItemEncryptor` lebih rendah, Anda harus menentukan tindakan atribut secara manual. [Jika Anda menggunakan DynamoDB Enhanced Client, Anda dapat menentukan tindakan atribut secara manual, atau Anda dapat menggunakan kelas data beranotasi untuk menghasilkan. `TableSchema`](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html) Untuk menyederhanakan proses konfigurasi, kami sarankan menggunakan kelas data beranotasi. Bila Anda menggunakan kelas data beranotasi, Anda hanya perlu memodelkan objek Anda sekali.

**catatan**  
Setelah menentukan tindakan atribut, Anda harus menentukan atribut mana yang dikecualikan dari tanda tangan. Untuk mempermudah menambahkan atribut unsigned baru di masa mendatang, sebaiknya pilih awalan yang berbeda (seperti "`:`“) untuk mengidentifikasi atribut unsigned Anda. Sertakan awalan ini dalam nama atribut untuk semua atribut yang ditandai `DO_NOTHING` saat Anda menentukan skema DynamoDB dan tindakan atribut.

### Gunakan kelas data beranotasi
<a name="ddb-attribute-actions-annotated-data-class"></a>

Gunakan [kelas data beranotasi](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html#ddb-en-client-gs-tableschema-anno-bean) untuk menentukan tindakan atribut Anda dengan DynamoDB Enhanced Client dan. `DynamoDbEncryptionInterceptor` SDK Enkripsi AWS Database untuk DynamoDB menggunakan anotasi [atribut DynamoDB standar yang menentukan jenis atribut](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/mapper/annotations/package-summary.html) untuk menentukan cara melindungi atribut. Secara default, semua atribut dienkripsi dan ditandatangani kecuali kunci utama, yang ditandatangani tetapi tidak dienkripsi.

**catatan**  
Untuk menggunakan tindakan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` kriptografi, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.3 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum [memperbarui model data Anda](ddb-update-data-model.md) untuk disertakan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

Lihat [SimpleClass.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java) di repositori aws-database-encryption-sdk -dynamodb untuk panduan GitHub lebih lanjut tentang anotasi DynamoDB Enhanced Client.

Secara default, atribut kunci primer ditandatangani tetapi tidak dienkripsi (`SIGN_ONLY`) dan semua atribut lainnya dienkripsi dan ditandatangani (). `ENCRYPT_AND_SIGN` Jika Anda mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Untuk menentukan pengecualian, gunakan anotasi enkripsi yang ditentukan dalam pustaka enkripsi sisi klien Java untuk DynamoDB. Misalnya, jika Anda ingin atribut tertentu hanya ditandatangani, gunakan `@DynamoDbEncryptionSignOnly` anotasi. Jika Anda ingin atribut tertentu ditandatangani dan disertakan dalam konteks enkripsi, gunakan`@DynamoDbEncryptionSignAndIncludeInEncryptionContext`. Jika Anda ingin atribut tertentu tidak ditandatangani atau dienkripsi (`DO_NOTHING`), gunakan anotasi`@DynamoDbEncryptionDoNothing`.

**catatan**  
SDK Enkripsi AWS Database tidak mendukung anotasi pada atribut [bersarang](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html).

Contoh berikut menunjukkan anotasi yang digunakan untuk mendefinisikan`ENCRYPT_AND_SIGN`,`SIGN_ONLY`, dan `DO_NOTHING` atribut tindakan. Untuk contoh yang menunjukkan anotasi yang digunakan untuk mendefinisikan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, lihat [SimpleClass4.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass4.java).

```
@DynamoDbBean
public class SimpleClass {

    private String partitionKey;
    private int sortKey;
    private String attribute1;
    private String attribute2;
    private String attribute3;

    @DynamoDbPartitionKey
    @DynamoDbAttribute(value = "partition_key")
    public String getPartitionKey() {
        return this.partitionKey;
    }

    public void setPartitionKey(String partitionKey) {
        this.partitionKey = partitionKey;
    }

    @DynamoDbSortKey
    @DynamoDbAttribute(value = "sort_key")
    public int getSortKey() {
        return this.sortKey;
    }

    public void setSortKey(int sortKey) {
        this.sortKey = sortKey;
    }

    public String getAttribute1() {
        return this.attribute1;
    }

    public void setAttribute1(String attribute1) {
        this.attribute1 = attribute1;
    }

    @DynamoDbEncryptionSignOnly
    public String getAttribute2() {
        return this.attribute2;
    }

    public void setAttribute2(String attribute2) {
        this.attribute2 = attribute2;
    }

    @DynamoDbEncryptionDoNothing
    public String getAttribute3() {
        return this.attribute3;
    }

    @DynamoDbAttribute(value = ":attribute3")
    public void setAttribute3(String attribute3) {
        this.attribute3 = attribute3;
    }
    
}
```

Gunakan kelas data beranotasi Anda untuk membuat `TableSchema` seperti yang ditunjukkan dalam cuplikan berikut.

```
final TableSchema<SimpleClass> tableSchema = TableSchema.fromBean(SimpleClass.class);
```

### Tentukan tindakan atribut Anda secara manual
<a name="ddb-attribute-actions-manual"></a>

Untuk menentukan tindakan atribut secara manual, buat `Map` objek di mana pasangan nama-nilai mewakili nama atribut dan tindakan yang ditentukan.

Tentukan `ENCRYPT_AND_SIGN` untuk mengenkripsi dan menandatangani atribut. Tentukan `SIGN_ONLY` untuk menandatangani, tetapi tidak mengenkripsi, atribut. Tentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` untuk menandatangani atribut dan sertakan dalam konteks enkripsi. Anda tidak dapat mengenkripsi atribut tanpa menandatanganinya juga. Tentukan `DO_NOTHING` untuk mengabaikan atribut.

Partisi dan atribut sortir harus salah satu `SIGN_ONLY` atau`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**catatan**  
Untuk menggunakan tindakan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` kriptografi, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.3 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum [memperbarui model data Anda](ddb-update-data-model.md) untuk disertakan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be signed
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); 
// The sort attribute must be signed
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put("attribute3", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT);
attributeActionsOnEncrypt.put(":attribute4", CryptoAction.DO_NOTHING);
```

## Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB
<a name="ddb-config-encrypt"></a>

Bila Anda menggunakan AWS Database Encryption SDK, Anda harus secara eksplisit menentukan konfigurasi enkripsi untuk tabel DynamoDB Anda. Nilai yang diperlukan dalam konfigurasi enkripsi Anda bergantung pada apakah Anda mendefinisikan tindakan atribut secara manual atau dengan kelas data beranotasi.

Cuplikan berikut mendefinisikan konfigurasi enkripsi tabel DynamoDB menggunakan DynamoDB Enhanced Client, [https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html)dan mengizinkan atribut unsigned yang ditentukan oleh awalan yang berbeda.

```
final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
tableConfigs.put(ddbTableName,
        DynamoDbEnhancedTableEncryptionConfig.builder()
            .logicalTableName(ddbTableName)
            .keyring(kmsKeyring)
            .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
            .schemaOnEncrypt(tableSchema)
            // Optional: only required if you use beacons
            .search(SearchConfig.builder() 
                    .writeVersion(1) // MUST be 1
                    .versions(beaconVersions)
                    .build())         
            .build());
```

**Nama tabel logis**  
Sebuah nama tabel logis untuk tabel DynamoDB Anda.  
Nama tabel logis terikat secara kriptografis ke semua data yang disimpan dalam tabel untuk menyederhanakan operasi pemulihan DynamoDB. Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Anda harus selalu menentukan nama tabel logis yang sama. Agar dekripsi berhasil, nama tabel logis harus sesuai dengan nama yang ditentukan pada enkripsi. Jika nama tabel DynamoDB Anda berubah setelah [memulihkan tabel DynamoDB Anda dari cadangan, nama tabel](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html) logis memastikan bahwa operasi dekripsi masih mengenali tabel.

**Atribut yang tidak ditandatangani yang diizinkan**  
Atribut yang ditandai `DO_NOTHING` dalam tindakan atribut Anda.  
Atribut unsigned yang diizinkan memberi tahu klien atribut mana yang dikecualikan dari tanda tangan. Klien mengasumsikan bahwa semua atribut lainnya termasuk dalam tanda tangan. Kemudian, saat mendekripsi catatan, klien menentukan atribut mana yang perlu diverifikasi dan mana yang harus diabaikan dari atribut unsigned yang diizinkan yang Anda tentukan. Anda tidak dapat menghapus atribut dari atribut yang tidak ditandatangani yang diizinkan.  
Anda dapat menentukan atribut unsigned yang diizinkan secara eksplisit dengan membuat array yang mencantumkan semua atribut Anda. `DO_NOTHING` Anda juga dapat menentukan awalan yang berbeda saat menamai `DO_NOTHING` atribut Anda dan menggunakan awalan untuk memberi tahu klien atribut mana yang tidak ditandatangani. Kami sangat menyarankan untuk menentukan awalan yang berbeda karena menyederhanakan proses penambahan `DO_NOTHING` atribut baru di masa depan. Untuk informasi selengkapnya, lihat [Memperbarui model data Anda](ddb-update-data-model.md).  
Jika Anda tidak menentukan awalan untuk semua `DO_NOTHING` atribut, Anda dapat mengonfigurasi `allowedUnsignedAttributes` array yang secara eksplisit mencantumkan semua atribut yang diharapkan klien tidak ditandatangani saat bertemu dengan mereka pada dekripsi. Anda hanya harus secara eksplisit mendefinisikan atribut unsigned yang diizinkan jika benar-benar diperlukan.

**Konfigurasi Pencarian (Opsional)**  
`SearchConfig`Mendefinisikan versi [beacon](using-beacons.md#beacon-version).  
`SearchConfig`Harus ditentukan untuk menggunakan [enkripsi yang dapat dicari](searchable-encryption.md) atau suar yang [ditandatangani](configure.md#signed-beacons).

**Suite Algoritma (Opsional)**  
`algorithmSuiteId`Mendefinisikan algoritma mana yang sesuai dengan AWS Database Encryption SDK yang digunakan.  
Kecuali Anda secara eksplisit menentukan rangkaian algoritme alternatif, SDK Enkripsi AWS Database menggunakan rangkaian algoritme [default](supported-algorithms.md#recommended-algorithms). [Rangkaian algoritma default menggunakan algoritma AES-GCM dengan derivasi kunci, [tanda tangan digital](concepts.md#digital-sigs), dan komitmen kunci.](concepts.md#key-commitment) Meskipun rangkaian algoritme default kemungkinan cocok untuk sebagian besar aplikasi, Anda dapat memilih rangkaian algoritma alternatif. Misalnya, beberapa model kepercayaan akan dipenuhi oleh rangkaian algoritma tanpa tanda tangan digital. Untuk informasi tentang rangkaian algoritme yang didukung SDK Enkripsi AWS Database, lihat[Rangkaian algoritme yang didukung di SDK Enkripsi AWS Database](supported-algorithms.md).  
Untuk memilih [rangkaian algoritma AES-GCM tanpa tanda tangan digital ECDSA](supported-algorithms.md#other-algorithms), sertakan cuplikan berikut dalam konfigurasi enkripsi tabel Anda.  

```
.algorithmSuiteId(
    DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384)
```

## Memperbarui item dengan AWS Database Encryption SDK
<a name="ddb-update-items"></a>

SDK Enkripsi AWS Database tidak mendukung [ddb: UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) untuk item yang telah dienkripsi atau ditandatangani. Untuk memperbarui item terenkripsi atau ditandatangani, Anda harus menggunakan [ddb](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html):. PutItem Saat Anda menentukan kunci utama yang sama dengan item yang ada dalam `PutItem` permintaan Anda, item baru sepenuhnya menggantikan item yang ada. Anda juga dapat menggunakan [CLOBBER](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html#CLOBBER) untuk menghapus dan mengganti semua atribut yang disimpan setelah memperbarui item Anda.

## Mendekripsi set yang ditandatangani
<a name="ddb-java-signed-sets"></a>

Di SDK Enkripsi AWS Database versi 3.0.0 dan 3.1.0, jika Anda menentukan atribut [tipe set](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.SetTypes) sebagai`SIGN_ONLY`, nilai himpunan akan dikanonikalisasi dalam urutan yang disediakan. DynamoDB tidak mempertahankan urutan set. Akibatnya, ada kemungkinan validasi tanda tangan dari item yang berisi set akan gagal. Validasi tanda tangan gagal ketika nilai set dikembalikan dalam urutan yang berbeda dari yang diberikan ke SDK Enkripsi AWS Database, meskipun atribut set berisi nilai yang sama.

**catatan**  
Versi 3.1.1 dan yang lebih baru dari AWS Database Encryption SDK mengkanonikalisasikan nilai semua atribut tipe set, sehingga nilai dibaca dalam urutan yang sama dengan yang ditulis ke DynamoDB.

Jika validasi tanda tangan gagal, operasi dekripsi gagal dan mengembalikan pesan kesalahan berikut.


|  | 
| --- |
| software.amazon.cryptography.dbencryptionsdk.structuredencryption.model. StructuredEncryptionException: Tidak ada tag penerima yang cocok. | 

Jika Anda menerima pesan kesalahan di atas, dan yakin bahwa item yang Anda coba dekripsi menyertakan set yang ditandatangani menggunakan versi 3.0.0 atau 3.1.0, lihat [DecryptWithPermute](https://github.com/aws/aws-database-encryption-sdk-dynamodb-java/tree/v3.1.1/DecryptWithPermute)direktori repositori aws-database-encryption-sdk -dynamodb-java untuk detail tentang cara berhasil memvalidasi set. GitHub 

# Contoh Java
<a name="ddb-java-examples"></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). | 

Contoh berikut menunjukkan cara menggunakan pustaka enkripsi sisi klien Java untuk DynamoDB untuk melindungi item tabel dalam aplikasi Anda. Anda dapat menemukan lebih banyak contoh (dan berkontribusi sendiri) di [contoh Java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples) di repositori aws-database-encryption-sdk -dynamodb di. GitHub

Contoh berikut menunjukkan cara mengonfigurasi pustaka enkripsi sisi klien Java untuk DynamoDB dalam tabel Amazon DynamoDB baru yang tidak terisi. Jika Anda ingin mengonfigurasi tabel Amazon DynamoDB yang ada untuk enkripsi sisi klien, lihat. [Tambahkan versi 3.x ke tabel yang ada](ddb-java-config-existing-table.md)

**Topics**
+ [Menggunakan klien yang disempurnakan DynamoDB](#ddb-java-enhanced-client-example)
+ [Menggunakan API DynamoDB tingkat rendah](#ddb-java-lowlevel-API-example)
+ [Menggunakan level yang lebih rendah DynamoDbItemEncryptor](#ddb-java-itemencryptor)

## Menggunakan klien yang disempurnakan DynamoDB
<a name="ddb-java-enhanced-client-example"></a>

Contoh berikut menunjukkan cara menggunakan DynamoDB Enhanced Client `DynamoDbEncryptionInterceptor` dan dengan keyring untuk mengenkripsi item tabel DynamoDB [AWS KMS sebagai](use-kms-keyring.md) bagian dari panggilan API DynamoDB Anda.

Anda dapat menggunakan [keyring](keyrings.md) apa pun yang didukung dengan DynamoDB Enhanced Client, tetapi sebaiknya gunakan salah AWS KMS satu gantungan kunci bila memungkinkan.

**catatan**  
[DynamoDB Enhanced Client tidak mendukung enkripsi yang dapat dicari.](searchable-encryption.md) Gunakan `DynamoDbEncryptionInterceptor` dengan API DynamoDB tingkat rendah untuk menggunakan enkripsi yang dapat dicari.

**Lihat contoh kode lengkapnya**: [EnhancedPutGetExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/EnhancedPutGetExample.java)

**Langkah 1: Buat AWS KMS keyring**  
Contoh berikut digunakan `CreateAwsKmsMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
final MaterialProviders matProv = MaterialProviders.builder()
        .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
        .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Langkah 2: Buat skema tabel dari kelas data beranotasi**  
Contoh berikut menggunakan kelas data beranotasi untuk membuat. `TableSchema`  
[Contoh ini mengasumsikan bahwa kelas data beranotasi dan tindakan atribut didefinisikan menggunakan .java. SimpleClass](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java) Untuk panduan selengkapnya tentang menganotasi tindakan atribut Anda, lihat. [Gunakan kelas data beranotasi](ddb-java-using.md#ddb-attribute-actions-annotated-data-class)  
SDK Enkripsi AWS Database tidak mendukung anotasi pada atribut [bersarang](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-adv-features-nested.html).

```
final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);
```

**Langkah 3: Tentukan atribut mana yang dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien mengasumsikan bahwa nama atribut apa pun dengan awalan "`:`" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**Langkah 4: Buat konfigurasi enkripsi**  
Contoh berikut mendefinisikan `tableConfigs` Peta yang mewakili konfigurasi enkripsi untuk tabel DynamoDB.   
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-java-using.md#logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Untuk informasi selengkapnya, lihat [Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-java-using.md#ddb-config-encrypt).  
Untuk menggunakan [enkripsi yang dapat dicari](searchable-encryption.md) atau [suar yang ditandatangani](configure.md#signed-beacons), Anda juga harus menyertakan [`SearchConfig`](ddb-java-using.md#ddb-search-config)dalam konfigurasi enkripsi Anda.

```
final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
tableConfigs.put(ddbTableName,
    DynamoDbEnhancedTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .schemaOnEncrypt(tableSchema)
        .build());
```

**Langkah 5: Menciptakan `DynamoDbEncryptionInterceptor`**  
Contoh berikut membuat yang baru `DynamoDbEncryptionInterceptor` dengan `tableConfigs` dari **Langkah 4**.  

```
final DynamoDbEncryptionInterceptor interceptor =
    DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
        CreateDynamoDbEncryptionInterceptorInput.builder()
            .tableEncryptionConfigs(tableConfigs)
            .build()
    );
```

**Langkah 6: Buat klien AWS SDK DynamoDB baru**  
**Contoh berikut membuat klien AWS SDK DynamoDB baru menggunakan `interceptor` dari Langkah 5.**  

```
final DynamoDbClient ddb = DynamoDbClient.builder()
        .overrideConfiguration(
                ClientOverrideConfiguration.builder()
                       .addExecutionInterceptor(interceptor)
                       .build())
        .build();
```

**Langkah 7: Buat DynamoDB Enhanced Client dan buat tabel**  
Contoh berikut membuat DynamoDB Enhanced Client menggunakan klien AWS SDK DynamoDB yang dibuat **pada Langkah** 6 dan membuat tabel menggunakan class data beranotasi.  

```
final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
        .dynamoDbClient(ddb)
        .build();
final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
```

**Langkah 8: Enkripsi dan tandatangani item tabel**  
Contoh berikut menempatkan item ke dalam tabel DynamoDB menggunakan DynamoDB Enhanced Client. Item dienkripsi dan ditandatangani sisi klien sebelum dikirim ke DynamoDB.  

```
final SimpleClass item = new SimpleClass();
item.setPartitionKey("EnhancedPutGetExample");
item.setSortKey(0);
item.setAttribute1("encrypt and sign me!");
item.setAttribute2("sign me!");
item.setAttribute3("ignore me!");

table.putItem(item);
```

## Menggunakan API DynamoDB tingkat rendah
<a name="ddb-java-lowlevel-API-example"></a>

[Contoh berikut menunjukkan cara menggunakan API DynamoDB tingkat rendah dengan keyring untuk secara otomatis mengenkripsi dan menandatangani item sisi klien dengan AWS KMS permintaan DynamoDB Anda.](use-kms-keyring.md) `PutItem`

Anda dapat menggunakan [keyring](keyrings.md) apa pun yang didukung, tetapi kami sarankan menggunakan salah satu AWS KMS gantungan kunci jika memungkinkan.

**Lihat contoh kode lengkapnya**: [BasicPutGetExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/BasicPutGetExample.java)

**Langkah 1: Buat AWS KMS keyring**  
Contoh berikut digunakan `CreateAwsKmsMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
final MaterialProviders matProv = MaterialProviders.builder()
         .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
         .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Langkah 2: Konfigurasikan tindakan atribut Anda**  
Contoh berikut mendefinisikan `attributeActionsOnEncrypt` Peta yang mewakili [tindakan atribut](concepts.md#crypt-actions) sampel untuk item tabel.  
Contoh berikut tidak mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_ONLY); 
// The sort attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_ONLY); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put(":attribute3", CryptoAction.DO_NOTHING);
```

**Langkah 3: Tentukan atribut mana yang dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien mengasumsikan bahwa nama atribut apa pun dengan awalan "`:`" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**Langkah 4: Tentukan konfigurasi enkripsi tabel DynamoDB**  
Contoh berikut mendefinisikan `tableConfigs` Peta yang mewakili konfigurasi enkripsi untuk tabel DynamoDB ini.  
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-java-using.md#logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Untuk informasi selengkapnya, lihat [Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-java-using.md#ddb-config-encrypt).  
Untuk menggunakan [enkripsi yang dapat dicari](searchable-encryption.md) atau [suar yang ditandatangani](configure.md#signed-beacons), Anda juga harus menyertakan [`SearchConfig`](ddb-java-using.md#ddb-search-config)dalam konfigurasi enkripsi Anda.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .attributeActionsOnEncrypt(attributeActionsOnEncrypt)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .build();
tableConfigs.put(ddbTableName, config);
```

**Langkah 5: Buat `DynamoDbEncryptionInterceptor`**  
Contoh berikut menciptakan `DynamoDbEncryptionInterceptor` menggunakan `tableConfigs` dari **Langkah 4**.  

```
DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder()
        .config(DynamoDbTablesEncryptionConfig.builder()
                .tableEncryptionConfigs(tableConfigs)
                .build())
        .build();
```

**Langkah 6: Buat klien AWS SDK DynamoDB baru**  
**Contoh berikut membuat klien AWS SDK DynamoDB baru menggunakan `interceptor` dari Langkah 5.**  

```
final DynamoDbClient ddb = DynamoDbClient.builder()
        .overrideConfiguration(
                ClientOverrideConfiguration.builder()
                       .addExecutionInterceptor(interceptor)
                       .build())
        .build();
```

**Langkah 7: Enkripsi dan tandatangani item tabel DynamoDB**  
Contoh berikut mendefinisikan `item` Peta yang mewakili item tabel sampel dan menempatkan item dalam tabel DynamoDB. Item dienkripsi dan ditandatangani sisi klien sebelum dikirim ke DynamoDB.  

```
final HashMap<String, AttributeValue> item = new HashMap<>();
item.put("partition_key", AttributeValue.builder().s("BasicPutGetExample").build());
item.put("sort_key", AttributeValue.builder().n("0").build());
item.put("attribute1", AttributeValue.builder().s("encrypt and sign me!").build());
item.put("attribute2", AttributeValue.builder().s("sign me!").build());
item.put(":attribute3", AttributeValue.builder().s("ignore me!").build());

final PutItemRequest putRequest = PutItemRequest.builder()
        .tableName(ddbTableName)
        .item(item)
        .build();

final PutItemResponse putResponse = ddb.putItem(putRequest);
```

## Menggunakan level yang lebih rendah DynamoDbItemEncryptor
<a name="ddb-java-itemencryptor"></a>

Contoh berikut menunjukkan cara menggunakan level yang lebih rendah `DynamoDbItemEncryptor` dengan [AWS KMS keyring](use-kms-keyring.md) untuk langsung mengenkripsi dan menandatangani item tabel. `DynamoDbItemEncryptor`Itu tidak menempatkan item di tabel DynamoDB Anda.

Anda dapat menggunakan [keyring](keyrings.md) apa pun yang didukung dengan DynamoDB Enhanced Client, tetapi sebaiknya gunakan salah AWS KMS satu gantungan kunci bila memungkinkan.

**catatan**  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` tidak mendukung enkripsi yang dapat [dicari](searchable-encryption.md). Gunakan `DynamoDbEncryptionInterceptor` dengan API DynamoDB tingkat rendah untuk menggunakan enkripsi yang dapat dicari.

**Lihat contoh kode lengkapnya**: [ItemEncryptDecryptExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/itemencryptor/ItemEncryptDecryptExample.java)

**Langkah 1: Buat AWS KMS keyring**  
Contoh berikut digunakan `CreateAwsKmsMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
final MaterialProviders matProv = MaterialProviders.builder()
         .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
         .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Langkah 2: Konfigurasikan tindakan atribut Anda**  
Contoh berikut mendefinisikan `attributeActionsOnEncrypt` Peta yang mewakili [tindakan atribut](concepts.md#crypt-actions) sampel untuk item tabel.  
Contoh berikut tidak mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>();
// The partition attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_ONLY); 
// The sort attribute must be SIGN_ONLY
attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_ONLY); 
attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY);
attributeActionsOnEncrypt.put(":attribute3", CryptoAction.DO_NOTHING);
```

**Langkah 3: Tentukan atribut mana yang dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien mengasumsikan bahwa nama atribut apa pun dengan awalan "`:`" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**Langkah 4: Tentukan `DynamoDbItemEncryptor` konfigurasi**  
Contoh berikut mendefinisikan konfigurasi untuk. `DynamoDbItemEncryptor`  
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-java-using.md#logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Untuk informasi selengkapnya, lihat [Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-java-using.md#ddb-config-encrypt).  

```
final DynamoDbItemEncryptorConfig config = DynamoDbItemEncryptorConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .attributeActionsOnEncrypt(attributeActionsOnEncrypt)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .build();
```

**Langkah 5: Buat `DynamoDbItemEncryptor`**  
Contoh berikut membuat baru `DynamoDbItemEncryptor` menggunakan `config` dari **Langkah 4**.  

```
final DynamoDbItemEncryptor itemEncryptor = DynamoDbItemEncryptor.builder()
        .DynamoDbItemEncryptorConfig(config)
        .build();
```

**Langkah 6: Langsung mengenkripsi dan menandatangani item tabel**  
Contoh berikut langsung mengenkripsi dan menandatangani item menggunakan. `DynamoDbItemEncryptor` `DynamoDbItemEncryptor`Itu tidak menempatkan item di tabel DynamoDB Anda.  

```
final Map<String, AttributeValue> originalItem = new HashMap<>();
originalItem.put("partition_key", AttributeValue.builder().s("ItemEncryptDecryptExample").build());
originalItem.put("sort_key", AttributeValue.builder().n("0").build());
originalItem.put("attribute1", AttributeValue.builder().s("encrypt and sign me!").build());
originalItem.put("attribute2", AttributeValue.builder().s("sign me!").build());
originalItem.put(":attribute3", AttributeValue.builder().s("ignore me!").build());

final Map<String, AttributeValue> encryptedItem = itemEncryptor.EncryptItem(
        EncryptItemInput.builder()
                .plaintextItem(originalItem)
                .build()
).encryptedItem();
```

# Konfigurasikan tabel DynamoDB yang ada untuk menggunakan SDK Enkripsi Database untuk AWS DynamoDB
<a name="ddb-java-config-existing-table"></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). | 

Dengan versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB, Anda dapat mengonfigurasi tabel Amazon DynamoDB yang ada untuk enkripsi sisi klien. Topik ini memberikan panduan tentang tiga langkah yang harus Anda ambil untuk menambahkan versi 3. *x* ke tabel DynamoDB yang sudah ada dan terisi.

**Prasyarat**  
Versi 3. *x* [dari pustaka enkripsi sisi klien Java untuk DynamoDB memerlukan DynamoDB Enhanced Client yang disediakan di.](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html) AWS SDK for Java 2.x Jika Anda masih menggunakan [Dynamo DBMapper](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html), Anda harus bermigrasi ke untuk menggunakan DynamoDB AWS SDK for Java 2.x Enhanced Client.

 Ikuti petunjuk untuk [bermigrasi dari versi 1.x ke 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration.html) dari file. AWS SDK untuk Java

Kemudian, ikuti petunjuk untuk [Memulai menggunakan DynamoDB Enhanced Client](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started.html) API.

[Sebelum mengkonfigurasi tabel Anda untuk menggunakan pustaka enkripsi sisi klien Java untuk DynamoDB, Anda perlu membuat `TableSchema`[menggunakan kelas data beranotasi dan membuat klien yang disempurnakan](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html#ddb-en-client-gs-tableschema-anno-bean).](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient)

## Langkah 1: Bersiaplah untuk membaca dan menulis item terenkripsi
<a name="ddb-java-add-step1"></a>

Selesaikan langkah-langkah berikut untuk mempersiapkan klien SDK Enkripsi AWS Database Anda untuk membaca dan menulis item terenkripsi. Setelah Anda menerapkan perubahan berikut, klien Anda akan terus membaca dan menulis item teks biasa. Ini tidak akan mengenkripsi atau menandatangani item baru yang ditulis ke tabel, tetapi akan dapat mendekripsi item terenkripsi segera setelah muncul. Perubahan ini mempersiapkan klien untuk mulai [mengenkripsi item baru](#ddb-java-add-step2). Perubahan berikut harus diterapkan ke setiap pembaca sebelum Anda melanjutkan ke langkah berikutnya.

**1. Tentukan [tindakan atribut](concepts.md#crypt-actions) Anda**  
Perbarui kelas data beranotasi Anda untuk menyertakan tindakan atribut yang menentukan nilai atribut mana yang akan dienkripsi dan ditandatangani, yang hanya akan ditandatangani, dan mana yang akan diabaikan.  
Lihat [SimpleClass.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass.java) di repositori aws-database-encryption-sdk -dynamodb untuk panduan GitHub lebih lanjut tentang anotasi DynamoDB Enhanced Client.  
Secara default, atribut kunci primer ditandatangani tetapi tidak dienkripsi (`SIGN_ONLY`) dan semua atribut lainnya dienkripsi dan ditandatangani (). `ENCRYPT_AND_SIGN` Untuk menentukan pengecualian, gunakan anotasi enkripsi yang ditentukan dalam pustaka enkripsi sisi klien Java untuk DynamoDB. Misalnya, jika Anda ingin atribut tertentu ditandatangani hanya gunakan `@DynamoDbEncryptionSignOnly` anotasi. Jika Anda ingin atribut tertentu ditandatangani dan disertakan dalam konteks enkripsi, gunakan `@DynamoDbEncryptionSignAndIncludeInEncryptionContext` anotasi. Jika Anda ingin atribut tertentu tidak ditandatangani atau dienkripsi (`DO_NOTHING`), gunakan anotasi`@DynamoDbEncryptionDoNothing`.  
Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Untuk contoh yang menunjukkan anotasi yang digunakan untuk mendefinisikan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, lihat [SimpleClass4.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass4.java).
Misalnya anotasi, lihat[Gunakan kelas data beranotasi](ddb-java-using.md#ddb-attribute-actions-annotated-data-class).

**2. Tentukan atribut mana yang akan dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien akan menganggap bahwa nama atribut apa pun dengan awalan `:` "" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth).  

```
final String unsignedAttrPrefix = ":";
```

**3. Buat [keyring](keyrings.md)**  
Contoh berikut membuat [AWS KMS keyring](use-kms-keyring.md). AWS KMS Keyring menggunakan enkripsi simetris atau RSA asimetris AWS KMS keys untuk menghasilkan, mengenkripsi, dan mendekripsi kunci data.  
Contoh ini digunakan `CreateMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
final MaterialProviders matProv = MaterialProviders.builder()
        .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
        .build();
final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
        .generator(kmsKeyId)
        .build();
final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**4. Tentukan konfigurasi enkripsi tabel DynamoDB **  
Contoh berikut mendefinisikan `tableConfigs` Peta yang mewakili konfigurasi enkripsi untuk tabel DynamoDB ini.  
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-java-using.md#logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Untuk informasi selengkapnya, lihat [Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-java-using.md#ddb-config-encrypt).  
Anda harus menentukan `FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` sebagai plaintext override. Kebijakan ini terus membaca dan menulis item teks biasa, membaca item terenkripsi, dan mempersiapkan klien untuk menulis item terenkripsi.  

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .schemaOnEncrypt(tableSchema)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .plaintextOverride(PlaintextOverride.FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT)
        .build();
tableConfigs.put(ddbTableName, config);
```

**5. Buat `DynamoDbEncryptionInterceptor`**  
Contoh berikut menciptakan `DynamoDbEncryptionInterceptor` menggunakan `tableConfigs` dari **Langkah 3**.  

```
DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder()
        .config(DynamoDbTablesEncryptionConfig.builder()
                .tableEncryptionConfigs(tableConfigs)                
                .build())
        .build();
```

## Langkah 2: Tulis item terenkripsi dan ditandatangani
<a name="ddb-java-add-step2"></a>

Perbarui kebijakan plaintext dalam `DynamoDbEncryptionInterceptor` konfigurasi Anda untuk memungkinkan klien menulis item terenkripsi dan ditandatangani. Setelah Anda menerapkan perubahan berikut, klien akan mengenkripsi dan menandatangani item baru berdasarkan tindakan atribut yang Anda konfigurasikan di **Langkah** 1. Klien akan dapat membaca item teks biasa dan item terenkripsi dan ditandatangani.

Sebelum Anda melanjutkan ke [Langkah 3](#ddb-java-add-step3), Anda harus mengenkripsi dan menandatangani semua item plaintext yang ada di tabel Anda. Tidak ada metrik atau kueri tunggal yang dapat Anda jalankan untuk mengenkripsi item plaintext yang ada dengan cepat. Gunakan proses yang paling masuk akal untuk sistem Anda. Misalnya, Anda dapat menggunakan proses asinkron yang memindai tabel secara perlahan dan menulis ulang item menggunakan tindakan atribut dan konfigurasi enkripsi yang Anda tentukan. Untuk mengidentifikasi item plaintext dalam tabel Anda, kami sarankan memindai semua item yang tidak berisi `aws_dbe_head` dan `aws_dbe_foot` atribut yang ditambahkan SDK Enkripsi AWS Database ke item saat dienkripsi dan ditandatangani.

Contoh berikut memperbarui konfigurasi enkripsi tabel dari **Langkah 1**. Anda harus memperbarui penggantian plaintext dengan. `FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` Kebijakan ini terus membaca item teks biasa, tetapi juga membaca dan menulis item terenkripsi. Buat yang baru `DynamoDbEncryptionInterceptor` menggunakan yang diperbarui`tableConfigs`.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .schemaOnEncrypt(tableSchema)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT)
        .build();
tableConfigs.put(ddbTableName, config);
```

## Langkah 3: Hanya baca item terenkripsi dan ditandatangani
<a name="ddb-java-add-step3"></a>

Setelah Anda mengenkripsi dan menandatangani semua item Anda, perbarui penggantian plaintext dalam `DynamoDbEncryptionInterceptor` konfigurasi Anda untuk hanya mengizinkan klien membaca dan menulis item terenkripsi dan ditandatangani. Setelah Anda menerapkan perubahan berikut, klien akan mengenkripsi dan menandatangani item baru berdasarkan tindakan atribut yang Anda konfigurasikan di **Langkah** 1. Klien hanya akan dapat membaca item terenkripsi dan ditandatangani.

Contoh berikut memperbarui konfigurasi enkripsi tabel dari **Langkah 2**. Anda dapat memperbarui penggantian plaintext dengan `FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT` atau menghapus kebijakan plaintext dari konfigurasi Anda. Klien hanya membaca dan menulis item terenkripsi dan ditandatangani secara default. Buat yang baru `DynamoDbEncryptionInterceptor` menggunakan yang diperbarui`tableConfigs`.

```
final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>();
final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder()
        .logicalTableName(ddbTableName)
        .partitionKeyName("partition_key")
        .sortKeyName("sort_key")
        .schemaOnEncrypt(tableSchema)
        .keyring(kmsKeyring)
        .allowedUnsignedAttributePrefix(unsignedAttrPrefix)
        // Optional: you can also remove the plaintext policy from your configuration
        .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT)
        .build();
tableConfigs.put(ddbTableName, config);
```

# Migrasi ke versi 3.x pustaka enkripsi sisi klien Java untuk DynamoDB
<a name="ddb-java-migrate"></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). | 

Versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB adalah penulisan ulang utama dari 2. basis kode *x*. Ini mencakup banyak pembaruan, seperti format data terstruktur baru, dukungan multitenancy yang ditingkatkan, perubahan skema yang mulus, dan dukungan enkripsi yang dapat dicari. Topik ini memberikan panduan tentang cara memigrasikan kode Anda ke versi 3. *x*.

## Migrasi dari versi 1.x ke 2.x
<a name="ddb-java-v1-to-v2"></a>

Migrasi ke versi 2. *x* sebelum Anda bermigrasi ke versi 3. *x*. Versi 2. *x* mengubah simbol untuk Penyedia Terbaru dari `MostRecentProvider` ke`CachingMostRecentProvider`. Jika saat ini Anda menggunakan versi 1. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB dengan `MostRecentProvider` simbol, Anda harus memperbarui nama simbol dalam kode Anda ke. `CachingMostRecentProvider` Untuk informasi selengkapnya, lihat [Pembaruan ke Penyedia Terbaru](most-recent-provider.md#mrp-versions).

## Migrasi dari versi 2.x ke 3.x
<a name="ddb-java-v2-to-v3"></a>

Prosedur berikut menjelaskan cara memigrasikan kode Anda dari versi 2. *x* ke versi 3. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB.

### Langkah 1. Bersiaplah untuk membaca item dalam format baru
<a name="ddb-java-migrate-step1"></a>

Selesaikan langkah-langkah berikut untuk mempersiapkan klien SDK Enkripsi AWS Database Anda untuk membaca item dalam format baru. Setelah Anda menerapkan perubahan berikut, klien Anda akan terus berperilaku dengan cara yang sama seperti di versi 2. *x*. Klien Anda akan terus membaca dan menulis item dalam versi 2. *x* format, tetapi perubahan ini mempersiapkan klien untuk [membaca item dalam format baru](#ddb-java-migrate-step2).

**Perbarui AWS SDK untuk Java ke versi 2.x**  
Versi 3. *x* [dari pustaka enkripsi sisi klien Java untuk DynamoDB memerlukan DynamoDB Enhanced Client.](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html) DynamoDB Enhanced Client menggantikan Dynamo yang digunakan [dalam DBMapper](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html) versi sebelumnya. Untuk menggunakan klien yang disempurnakan, Anda harus menggunakan AWS SDK for Java 2.x.   
Ikuti petunjuk untuk [bermigrasi dari versi 1.x ke 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration.html). AWS SDK untuk Java  
Untuk informasi lebih lanjut tentang AWS SDK for Java 2.x modul apa yang diperlukan, lihat[Prasyarat](ddb-java.md#ddb-java-prerequisites).

**Konfigurasikan klien Anda untuk membaca item yang dienkripsi oleh versi lama**  
Prosedur berikut memberikan gambaran tentang langkah-langkah yang ditunjukkan dalam contoh kode di bawah ini.  

1. Buat [keyring](keyrings.md).

   Keyrings dan [manajer bahan kriptografi menggantikan penyedia bahan](concepts.md#crypt-materials-manager) kriptografi yang digunakan dalam versi sebelumnya dari pustaka enkripsi sisi klien Java untuk DynamoDB.
**penting**  
Kunci pembungkus yang Anda tentukan saat membuat keyring harus berupa kunci pembungkus yang sama yang Anda gunakan dengan penyedia bahan kriptografi Anda di versi 2. *x*.

1. Buat skema tabel di atas kelas beranotasi Anda.

   Langkah ini mendefinisikan tindakan atribut yang akan digunakan ketika Anda mulai menulis item dalam format baru.

   *Untuk panduan tentang penggunaan DynamoDB Enhanced Client baru, lihat [Menghasilkan `TableSchema` a di AWS SDK untuk Java Panduan Pengembang](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-gs-tableschema.html).*

   Contoh berikut mengasumsikan Anda memperbarui kelas beranotasi Anda dari versi 2. *x* menggunakan anotasi tindakan atribut baru. Untuk panduan selengkapnya tentang anotasi tindakan atribut Anda, lihat. [Gunakan kelas data beranotasi](ddb-java-using.md#ddb-attribute-actions-annotated-data-class)
**catatan**  
Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Untuk contoh yang menunjukkan anotasi yang digunakan untuk mendefinisikan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, lihat [SimpleClass4.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/enhanced/SimpleClass4.java).

1. Tentukan [atribut mana yang dikecualikan dari tanda tangan](ddb-java-using.md#allowed-unauth).

1. Konfigurasikan peta eksplisit tindakan atribut yang dikonfigurasi di kelas model versi 2.x Anda.

   Langkah ini mendefinisikan tindakan atribut yang digunakan untuk menulis item dalam format lama.

1. Konfigurasikan yang `DynamoDBEncryptor` Anda gunakan di versi 2. *x* dari pustaka enkripsi sisi klien Java untuk DynamoDB.

1. Konfigurasikan perilaku lama.

1. Buat a`DynamoDbEncryptionInterceptor`.

1. Buat klien AWS SDK DynamoDB baru.

1. Buat `DynamoDBEnhancedClient` dan buat tabel dengan kelas model Anda.

   Untuk informasi selengkapnya tentang DynamoDB Enhanced Client, [lihat membuat](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient) klien yang disempurnakan.

```
public class MigrationExampleStep1 {

    public static void MigrationStep1(String kmsKeyId, String ddbTableName, int sortReadValue) {
        // 1. Create a Keyring.
        //    This example creates an AWS KMS Keyring that specifies the 
        //    same kmsKeyId previously used in the version 2.x configuration.
        //    It uses the 'CreateMrkMultiKeyring' method to create the 
        //    keyring, so that the keyring can correctly handle both single
        //    region and Multi-Region KMS Keys.
        //    Note that this example uses the AWS SDK for Java v2 KMS client.
        final MaterialProviders matProv = MaterialProviders.builder()
                .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
                .build();
        final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
                .generator(kmsKeyId)
                .build();
        final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);

        // 2. Create a Table Schema over your annotated class.
        //    For guidance on using the new attribute actions 
        //    annotations, see SimpleClass.java in the 
        //    aws-database-encryption-sdk-dynamodb GitHub repository. 
        //    All primary key attributes must be signed but not encrypted 
        //    and by default all non-primary key attributes 
        //    are encrypted and signed (ENCRYPT_AND_SIGN).
        //    If you want a particular non-primary key attribute to be signed but
        //    not encrypted, use the 'DynamoDbEncryptionSignOnly' annotation.
        //    If you want a particular attribute to be neither signed nor encrypted
        //    (DO_NOTHING), use the 'DynamoDbEncryptionDoNothing' annotation.
        final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);

        // 3. Define which attributes the client should expect to be excluded 
        //    from the signature when reading items.
        //    This value represents all unsigned attributes across the entire 
        //    dataset.
        final List<String> allowedUnsignedAttributes = Arrays.asList("attribute3");

        // 4. Configure an explicit map of the attribute actions configured 
        //    in your version 2.x modeled class.
        final Map<String, CryptoAction> legacyActions = new HashMap<>();
        legacyActions.put("partition_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("sort_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
        legacyActions.put("attribute2", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute3", CryptoAction.DO_NOTHING);

        // 5. Configure the DynamoDBEncryptor that you used in version 2.x.
        final AWSKMS kmsClient = AWSKMSClientBuilder.defaultClient();
        final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, kmsKeyId);
        final DynamoDBEncryptor oldEncryptor = DynamoDBEncryptor.getInstance(cmp);

        // 6. Configure the legacy behavior.
        //    Input the DynamoDBEncryptor and attribute actions created in 
        //    the previous steps. For Legacy Policy, use 
        //    'FORCE_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT'. This policy continues to read 
        //    and write items using the old format, but will be able to read
        //    items written in the new format as soon as they appear.
        final LegacyOverride legacyOverride = LegacyOverride
                .builder()
                .encryptor(oldEncryptor)
                .policy(LegacyPolicy.FORCE_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT)
                .attributeActionsOnEncrypt(legacyActions)
                .build();

        // 7. Create a DynamoDbEncryptionInterceptor with the above configuration.
        final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
        tableConfigs.put(ddbTableName,
                DynamoDbEnhancedTableEncryptionConfig.builder()
                        .logicalTableName(ddbTableName)
                        .keyring(kmsKeyring)
                        .allowedUnsignedAttributes(allowedUnsignedAttributes)
                        .schemaOnEncrypt(tableSchema)
                        .legacyOverride(legacyOverride)
                        .build());
        final DynamoDbEncryptionInterceptor interceptor =
                DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
                        CreateDynamoDbEncryptionInterceptorInput.builder()
                                .tableEncryptionConfigs(tableConfigs)
                                .build()
                );

        // 8. Create a new AWS SDK DynamoDb client using the 
        //    interceptor from Step 7.
        final DynamoDbClient ddb = DynamoDbClient.builder()
                .overrideConfiguration(
                        ClientOverrideConfiguration.builder()
                                .addExecutionInterceptor(interceptor)
                                .build())
                .build();

        // 9. Create the DynamoDbEnhancedClient using the AWS SDK DynamoDb client 
        //    created in Step 8, and create a table with your modeled class.
        final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();
        final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
    }
}
```

### Langkah 2. Tulis item dalam format baru
<a name="ddb-java-migrate-step2"></a>

Setelah Anda menerapkan perubahan dari Langkah 1 ke semua pembaca, selesaikan langkah-langkah berikut untuk mengonfigurasi klien SDK Enkripsi AWS Database Anda untuk menulis item dalam format baru. Setelah Anda menerapkan perubahan berikut, klien Anda akan melanjutkan membaca item dalam format lama dan mulai menulis dan membaca item dalam format baru.

Prosedur berikut memberikan gambaran tentang langkah-langkah yang ditunjukkan dalam contoh kode di bawah ini.

1. [**Lanjutkan mengonfigurasi keyring, skema tabel, tindakan atribut lama`allowedUnsignedAttributes`, dan `DynamoDBEncryptor` seperti yang Anda lakukan di Langkah 1.**](#ddb-java-migrate-step1)

1. Perbarui perilaku lama Anda untuk hanya menulis item baru menggunakan format baru.

1. Buat `DynamoDbEncryptionInterceptor `

1. Buat klien AWS SDK DynamoDB baru.

1. Buat `DynamoDBEnhancedClient` dan buat tabel dengan kelas model Anda.

   Untuk informasi selengkapnya tentang DynamoDB Enhanced Client, [lihat membuat](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient) klien yang disempurnakan.

```
public class MigrationExampleStep2 {

    public static void MigrationStep2(String kmsKeyId, String ddbTableName, int sortReadValue) {
        // 1. Continue to configure your keyring, table schema, legacy 
        //    attribute actions, allowedUnsignedAttributes, and 
        //    DynamoDBEncryptor as you did in Step 1.
        final MaterialProviders matProv = MaterialProviders.builder()
                .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
                .build();
        final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
                .generator(kmsKeyId)
                .build();
        final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);

        final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);

        final List<String> allowedUnsignedAttributes = Arrays.asList("attribute3");

        final Map<String, CryptoAction> legacyActions = new HashMap<>();
        legacyActions.put("partition_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("sort_key", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN);
        legacyActions.put("attribute2", CryptoAction.SIGN_ONLY);
        legacyActions.put("attribute3", CryptoAction.DO_NOTHING);

        final AWSKMS kmsClient = AWSKMSClientBuilder.defaultClient();
        final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kmsClient, kmsKeyId);
        final DynamoDBEncryptor oldEncryptor = DynamoDBEncryptor.getInstance(cmp);

        // 2. Update your legacy behavior to only write new items using the new
        //    format. 
        //    For Legacy Policy, use 'FORBID_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT'. This policy
        //    continues to read items in both formats, but will only write items
        //    using the new format.
        final LegacyOverride legacyOverride = LegacyOverride
                .builder()
                .encryptor(oldEncryptor)
                .policy(LegacyPolicy.FORBID_LEGACY_ENCRYPT_ALLOW_LEGACY_DECRYPT)
                .attributeActionsOnEncrypt(legacyActions)
                .build();

        // 3. Create a DynamoDbEncryptionInterceptor with the above configuration.
        final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
        tableConfigs.put(ddbTableName,
                DynamoDbEnhancedTableEncryptionConfig.builder()
                        .logicalTableName(ddbTableName)
                        .keyring(kmsKeyring)
                        .allowedUnsignedAttributes(allowedUnsignedAttributes)
                        .schemaOnEncrypt(tableSchema)
                        .legacyOverride(legacyOverride)
                        .build());
        final DynamoDbEncryptionInterceptor interceptor =
                DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
                        CreateDynamoDbEncryptionInterceptorInput.builder()
                                .tableEncryptionConfigs(tableConfigs)
                                .build()
                );

        // 4. Create a new AWS SDK DynamoDb client using the 
        //    interceptor from Step 3.
        final DynamoDbClient ddb = DynamoDbClient.builder()
                .overrideConfiguration(
                        ClientOverrideConfiguration.builder()
                                .addExecutionInterceptor(interceptor)
                                .build())
                .build();

        // 5. Create the DynamoDbEnhancedClient using the AWS SDK DynamoDb Client created
        //    in Step 4, and create a table with your modeled class.
        final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();
        final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
    }
}
```

[Setelah menerapkan perubahan Langkah 2, Anda harus mengenkripsi ulang semua item lama di tabel Anda dengan format baru sebelum Anda dapat melanjutkan ke Langkah 3.](#ddb-java-migrate-step3) Tidak ada metrik atau kueri tunggal yang dapat Anda jalankan untuk mengenkripsi item yang ada dengan cepat. Gunakan proses yang paling masuk akal untuk sistem Anda. Misalnya, Anda dapat menggunakan proses asinkron yang memindai tabel secara perlahan dan menulis ulang item menggunakan tindakan atribut baru dan konfigurasi enkripsi yang Anda tentukan.

### Langkah 3. Hanya membaca dan menulis item dalam format baru
<a name="ddb-java-migrate-step3"></a>

Setelah mengenkripsi ulang semua item dalam tabel Anda dengan format baru, Anda dapat menghapus perilaku lama dari konfigurasi Anda. Selesaikan langkah-langkah berikut untuk mengonfigurasi klien Anda agar hanya membaca dan menulis item dalam format baru.

Prosedur berikut memberikan gambaran tentang langkah-langkah yang ditunjukkan dalam contoh kode di bawah ini.

1. [**Lanjutkan mengkonfigurasi keyring Anda, skema tabel, dan `allowedUnsignedAttributes` seperti yang Anda lakukan di Langkah 1.**](#ddb-java-migrate-step1) Hapus tindakan atribut lama dan `DynamoDBEncryptor` dari konfigurasi Anda.

1. Buat a`DynamoDbEncryptionInterceptor`.

1. Buat klien AWS SDK DynamoDB baru.

1. Buat `DynamoDBEnhancedClient` dan buat tabel dengan kelas model Anda.

   Untuk informasi selengkapnya tentang DynamoDB Enhanced Client, [lihat membuat](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/ddb-en-client-getting-started-dynamodbTable.html#ddb-en-client-getting-started-dynamodbTable-eclient) klien yang disempurnakan.

```
public class MigrationExampleStep3 {

    public static void MigrationStep3(String kmsKeyId, String ddbTableName, int sortReadValue) {
        // 1. Continue to configure your keyring, table schema,
        //    and allowedUnsignedAttributes as you did in Step 1.
        //    Do not include the configurations for the DynamoDBEncryptor or 
        //    the legacy attribute actions.
        final MaterialProviders matProv = MaterialProviders.builder()
                .MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
                .build();
        final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
                .generator(kmsKeyId)
                .build();
        final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);

        final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);

        final List<String> allowedUnsignedAttributes = Arrays.asList("attribute3");


        // 3. Create a DynamoDbEncryptionInterceptor with the above configuration.
        //    Do not configure any legacy behavior.
        final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>();
        tableConfigs.put(ddbTableName,
                DynamoDbEnhancedTableEncryptionConfig.builder()
                        .logicalTableName(ddbTableName)
                        .keyring(kmsKeyring)
                        .allowedUnsignedAttributes(allowedUnsignedAttributes)
                        .schemaOnEncrypt(tableSchema)
                        .build());
        final DynamoDbEncryptionInterceptor interceptor =
                DynamoDbEnhancedClientEncryption.CreateDynamoDbEncryptionInterceptor(
                        CreateDynamoDbEncryptionInterceptorInput.builder()
                                .tableEncryptionConfigs(tableConfigs)
                                .build()
                );

        // 4. Create a new AWS SDK DynamoDb client using the 
        //    interceptor from Step 3.
        final DynamoDbClient ddb = DynamoDbClient.builder()
                .overrideConfiguration(
                        ClientOverrideConfiguration.builder()
                                .addExecutionInterceptor(interceptor)
                                .build())
                .build();

        // 5. Create the DynamoDbEnhancedClient using the AWS SDK Client 
        //    created in Step 4, and create a table with your modeled class.
        final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();
        final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
    }
}
```

# .NET
<a name="ddb-net"></a>

Topik ini menjelaskan cara menginstal dan menggunakan versi 3. *x* dari pustaka enkripsi sisi klien .NET untuk DynamoDB. Untuk detail tentang pemrograman dengan AWS Database Encryption SDK untuk DynamoDB, lihat [contoh.NET di aws-database-encryption-sdk repositori](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/) -dynamodb aktif. GitHub

Pustaka enkripsi sisi klien .NET untuk DynamoDB adalah untuk pengembang yang menulis aplikasi dalam C \$1 dan bahasa pemrograman.NET lainnya. Hal ini didukung di Windows, macOS, dan Linux.

Semua implementasi [bahasa pemrograman](ddb-programming-languages.md) SDK Enkripsi AWS Database untuk DynamoDB dapat dioperasikan. Namun, SDK untuk .NET tidak mendukung nilai kosong untuk tipe data daftar atau peta. Ini berarti bahwa jika Anda menggunakan pustaka enkripsi sisi klien Java untuk DynamoDB untuk menulis item yang berisi nilai kosong untuk daftar atau tipe data peta, Anda tidak dapat mendekripsi dan membaca item tersebut menggunakan pustaka enkripsi sisi klien .NET untuk DynamoDB.

**Topics**
+ [Menginstal](#ddb-net-install)
+ [Debugging](#ddb-net-debugging)
+ [Menggunakan klien.NET](ddb-net-using.md)
+ [.NET contoh](ddb-net-examples.md)
+ [Tambahkan versi 3.x ke tabel yang ada](ddb-net-config-existing-table.md)

## Menginstal pustaka enkripsi sisi klien .NET untuk DynamoDB
<a name="ddb-net-install"></a>

[Pustaka enkripsi sisi klien .NET untuk DynamoDB tersedia sebagai AWS.Cryptography. DbEncryptionSDK. DynamoDb](https://www.nuget.org/packages/AWS.Cryptography.DbEncryptionSDK.DynamoDb/)paket di NuGet. Untuk detail tentang menginstal dan membangun perpustakaan, lihat [file.NET README.md](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/DynamoDbEncryption/runtimes/net/README.md) di repositori -dynamodb. aws-database-encryption-sdk Pustaka enkripsi sisi klien .NET untuk DynamoDB memerlukan SDK untuk .NET bahkan jika Anda tidak menggunakan kunci (). AWS Key Management Service AWS KMS SDK untuk .NET Itu diinstal dengan NuGet paket.

Versi 3. *x* dari pustaka enkripsi sisi klien .NET untuk DynamoDB mendukung .NET 6.0 dan .NET Framework net48 dan yang lebih baru.

## Debugging dengan .NET
<a name="ddb-net-debugging"></a>

Pustaka enkripsi sisi klien .NET untuk DynamoDB tidak menghasilkan log apa pun. Pengecualian di pustaka enkripsi sisi klien .NET untuk DynamoDB menghasilkan pesan pengecualian, tetapi tidak ada jejak tumpukan.

Untuk membantu Anda men-debug, pastikan untuk mengaktifkan login. SDK untuk .NET Log dan pesan kesalahan dari SDK untuk .NET dapat membantu Anda membedakan kesalahan yang timbul SDK untuk .NET dari yang ada di pustaka enkripsi sisi klien .NET untuk DynamoDB. Untuk bantuan terkait SDK untuk .NET logging, lihat [AWSLogging](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-config-other.html#config-setting-awslogging)di *Panduan AWS SDK untuk .NET Pengembang*. (Untuk melihat topiknya, perluas bagian **konten Open to view .NET Framework**.)

# Menggunakan pustaka enkripsi sisi klien .NET untuk DynamoDB
<a name="ddb-net-using"></a>

Topik ini menjelaskan beberapa fungsi dan kelas pembantu di versi 3. *x* dari pustaka enkripsi sisi klien .NET untuk DynamoDB. 

Untuk detail tentang pemrograman dengan pustaka enkripsi sisi klien .NET untuk DynamoDB, lihat [contoh.NET](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/) di repositori -dynamodb aktif. aws-database-encryption-sdk GitHub

**Topics**
+ [Enkriptor item](#ddb-net-item-encryptors)
+ [Tindakan atribut](#ddb-net-attribute-actions)
+ [Konfigurasi enkripsi](#ddb-net-config-encrypt)
+ [Memperbarui item](#ddb-net-update-items)

## Enkriptor item
<a name="ddb-net-item-encryptors"></a>

Pada intinya, AWS Database Encryption SDK untuk DynamoDB adalah enkripsi item. Anda dapat menggunakan versi 3. *x* dari pustaka enkripsi sisi klien .NET untuk DynamoDB untuk mengenkripsi, menandatangani, memverifikasi, dan mendekripsi item tabel DynamoDB Anda dengan cara berikut.

**SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API**  
Anda dapat menggunakan [konfigurasi enkripsi tabel](#ddb-net-config-encrypt) untuk membuat klien DynamoDB yang secara otomatis mengenkripsi dan menandatangani item sisi klien dengan permintaan DynamoDB Anda. `PutItem` Anda dapat menggunakan klien ini secara langsung, atau Anda dapat membuat [model dokumen atau model](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-document) [persistensi objek](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-object-persistence).  
[Anda harus menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API untuk menggunakan enkripsi yang dapat dicari.](searchable-encryption.md)

**Tingkat yang lebih rendah `DynamoDbItemEncryptor`**  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` secara langsung mengenkripsi dan menandatangani atau mendekripsi dan memverifikasi item tabel Anda tanpa memanggil DynamoDB. Itu tidak membuat DynamoDB atau `PutItem` permintaan`GetItem`. Misalnya, Anda dapat menggunakan level yang lebih rendah `DynamoDbItemEncryptor` untuk langsung mendekripsi dan memverifikasi item DynamoDB yang telah Anda ambil. Jika Anda menggunakan tingkat yang lebih rendah`DynamoDbItemEncryptor`, sebaiknya gunakan [model pemrograman tingkat rendah](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-low-level) yang SDK untuk .NET disediakan untuk berkomunikasi dengan DynamoDB.  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` tidak mendukung enkripsi yang dapat [dicari](searchable-encryption.md).

## Tindakan atribut dalam SDK Enkripsi AWS Database untuk DynamoDB
<a name="ddb-net-attribute-actions"></a>

[Tindakan atribut](concepts.md#crypt-actions) menentukan nilai atribut mana yang dienkripsi dan ditandatangani, yang hanya ditandatangani, yang ditandatangani dan disertakan dalam konteks enkripsi, dan mana yang diabaikan.

Untuk menentukan tindakan atribut dengan klien.NET, tentukan tindakan atribut secara manual menggunakan model objek. Tentukan tindakan atribut Anda dengan membuat `Dictionary` objek di mana pasangan nama-nilai mewakili nama atribut dan tindakan yang ditentukan.

Tentukan `ENCRYPT_AND_SIGN` untuk mengenkripsi dan menandatangani atribut. Tentukan `SIGN_ONLY` untuk menandatangani, tetapi tidak mengenkripsi, atribut. Tentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` untuk menandatangani atribut dan sertakan dalam konteks enkripsi. Anda tidak dapat mengenkripsi atribut tanpa menandatanganinya juga. Tentukan `DO_NOTHING` untuk mengabaikan atribut.

Partisi dan atribut sortir harus salah satu `SIGN_ONLY` atau`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**catatan**  
Setelah menentukan tindakan atribut, Anda harus menentukan atribut mana yang dikecualikan dari tanda tangan. Untuk mempermudah menambahkan atribut unsigned baru di masa mendatang, sebaiknya pilih awalan yang berbeda (seperti "`:`“) untuk mengidentifikasi atribut unsigned Anda. Sertakan awalan ini dalam nama atribut untuk semua atribut yang ditandai `DO_NOTHING` saat Anda menentukan skema DynamoDB dan tindakan atribut.

Model objek berikut menunjukkan cara menentukan`ENCRYPT_AND_SIGN`,, `SIGN_ONLY``SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, dan `DO_NOTHING` atribut tindakan dengan klien.NET. Contoh ini menggunakan awalan "`:`" untuk mengidentifikasi `DO_NOTHING` atribut.

**catatan**  
Untuk menggunakan tindakan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` kriptografi, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.3 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum [memperbarui model data Anda](ddb-update-data-model.md) untuk disertakan`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT, // The partition attribute must be signed
    ["sort_key"] = CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT, // The sort attribute must be signed
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    ["attribute3"] = CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,
    [":attribute4"] = CryptoAction.DO_NOTHING
};
```

## Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB
<a name="ddb-net-config-encrypt"></a>

Bila Anda menggunakan AWS Database Encryption SDK, Anda harus secara eksplisit menentukan konfigurasi enkripsi untuk tabel DynamoDB Anda. Nilai yang diperlukan dalam konfigurasi enkripsi Anda bergantung pada apakah Anda mendefinisikan tindakan atribut secara manual atau dengan kelas data beranotasi.

Cuplikan berikut mendefinisikan konfigurasi enkripsi tabel DynamoDB menggunakan SDK AWS Enkripsi Database tingkat rendah untuk DynamoDB API dan mengizinkan atribut unsigned yang ditentukan oleh awalan yang berbeda.

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    // Optional: SearchConfig only required if you use beacons
    Search = new SearchConfig
    {
        WriteVersion = 1, // MUST be 1
        Versions = beaconVersions
    }    
};
tableConfigs.Add(ddbTableName, config);
```

**Nama tabel logis**  
Sebuah nama tabel logis untuk tabel DynamoDB Anda.  
Nama tabel logis terikat secara kriptografis ke semua data yang disimpan dalam tabel untuk menyederhanakan operasi pemulihan DynamoDB. Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Anda harus selalu menentukan nama tabel logis yang sama. Agar dekripsi berhasil, nama tabel logis harus sesuai dengan nama yang ditentukan pada enkripsi. Jika nama tabel DynamoDB Anda berubah setelah [memulihkan tabel DynamoDB Anda dari cadangan, nama tabel](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html) logis memastikan bahwa operasi dekripsi masih mengenali tabel.

**Atribut yang tidak ditandatangani yang diizinkan**  
Atribut yang ditandai `DO_NOTHING` dalam tindakan atribut Anda.  
Atribut unsigned yang diizinkan memberi tahu klien atribut mana yang dikecualikan dari tanda tangan. Klien mengasumsikan bahwa semua atribut lainnya termasuk dalam tanda tangan. Kemudian, saat mendekripsi catatan, klien menentukan atribut mana yang perlu diverifikasi dan mana yang harus diabaikan dari atribut unsigned yang diizinkan yang Anda tentukan. Anda tidak dapat menghapus atribut dari atribut yang tidak ditandatangani yang diizinkan.  
Anda dapat menentukan atribut unsigned yang diizinkan secara eksplisit dengan membuat array yang mencantumkan semua atribut Anda. `DO_NOTHING` Anda juga dapat menentukan awalan yang berbeda saat menamai `DO_NOTHING` atribut Anda dan menggunakan awalan untuk memberi tahu klien atribut mana yang tidak ditandatangani. Kami sangat menyarankan untuk menentukan awalan yang berbeda karena menyederhanakan proses penambahan `DO_NOTHING` atribut baru di masa depan. Untuk informasi selengkapnya, lihat [Memperbarui model data Anda](ddb-update-data-model.md).  
Jika Anda tidak menentukan awalan untuk semua `DO_NOTHING` atribut, Anda dapat mengonfigurasi `allowedUnsignedAttributes` array yang secara eksplisit mencantumkan semua atribut yang diharapkan klien tidak ditandatangani saat bertemu dengan mereka pada dekripsi. Anda hanya harus secara eksplisit mendefinisikan atribut unsigned yang diizinkan jika benar-benar diperlukan.

**Konfigurasi Pencarian (Opsional)**  
`SearchConfig`Mendefinisikan versi [beacon](using-beacons.md#beacon-version).  
`SearchConfig`Harus ditentukan untuk menggunakan [enkripsi yang dapat dicari](searchable-encryption.md) atau suar yang [ditandatangani](configure.md#signed-beacons).

**Suite Algoritma (Opsional)**  
`algorithmSuiteId`Mendefinisikan algoritma mana yang sesuai dengan AWS Database Encryption SDK yang digunakan.  
Kecuali Anda secara eksplisit menentukan rangkaian algoritme alternatif, SDK Enkripsi AWS Database menggunakan rangkaian algoritme [default](supported-algorithms.md#recommended-algorithms). [Rangkaian algoritme default menggunakan algoritma AES-GCM dengan derivasi kunci, [tanda tangan digital](concepts.md#digital-sigs), dan komitmen kunci.](concepts.md#key-commitment) Meskipun rangkaian algoritme default kemungkinan cocok untuk sebagian besar aplikasi, Anda dapat memilih rangkaian algoritme alternatif. Misalnya, beberapa model kepercayaan akan dipenuhi oleh rangkaian algoritma tanpa tanda tangan digital. Untuk informasi tentang rangkaian algoritme yang didukung SDK Enkripsi AWS Database, lihat[Rangkaian algoritme yang didukung di SDK Enkripsi AWS Database](supported-algorithms.md).  
Untuk memilih [rangkaian algoritma AES-GCM tanpa tanda tangan digital ECDSA](supported-algorithms.md#other-algorithms), sertakan cuplikan berikut dalam konfigurasi enkripsi tabel Anda.  

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

## Memperbarui item dengan AWS Database Encryption SDK
<a name="ddb-net-update-items"></a>

SDK Enkripsi AWS Database tidak mendukung [ddb: UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) untuk item yang menyertakan atribut terenkripsi atau ditandatangani. Untuk memperbarui atribut terenkripsi atau ditandatangani, Anda harus menggunakan [ddb](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html):. PutItem Saat Anda menentukan kunci utama yang sama dengan item yang ada dalam `PutItem` permintaan Anda, item baru sepenuhnya menggantikan item yang ada. Anda juga dapat menggunakan [CLOBBER](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html#CLOBBER) untuk menghapus dan mengganti semua atribut yang disimpan setelah memperbarui item Anda.

# .NET contoh
<a name="ddb-net-examples"></a>

Contoh berikut menunjukkan cara menggunakan pustaka enkripsi sisi klien .NET untuk DynamoDB untuk melindungi item tabel dalam aplikasi Anda. Untuk menemukan lebih banyak contoh (dan berkontribusi sendiri), lihat [contoh.NET di repositori](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/net/src) aws-database-encryption-sdk -dynamodb di. GitHub

Contoh berikut menunjukkan cara mengonfigurasi pustaka enkripsi sisi klien .NET untuk DynamoDB dalam tabel Amazon DynamoDB baru yang tidak terisi. Jika Anda ingin mengonfigurasi tabel Amazon DynamoDB yang ada untuk enkripsi sisi klien, lihat. [Tambahkan versi 3.x ke tabel yang ada](ddb-net-config-existing-table.md)

**Topics**
+ [Menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API](#ddb-net-lowlevel-API-example)
+ [Menggunakan level yang lebih rendah `DynamoDbItemEncryptor`](#ddb-net-itemencryptor)

## Menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API
<a name="ddb-net-lowlevel-API-example"></a>

Contoh berikut menunjukkan cara menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API dengan [AWS KMS keyring](use-kms-keyring.md) untuk secara otomatis mengenkripsi dan menandatangani item sisi klien dengan permintaan DynamoDB Anda. `PutItem`

Anda dapat menggunakan [keyring](keyrings.md) apa pun yang didukung, tetapi kami sarankan menggunakan salah satu AWS KMS gantungan kunci jika memungkinkan.

**Lihat contoh kode lengkapnya**: [BasicPutGetExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/BasicPutGetExample.cs)

**Langkah 1: Buat AWS KMS keyring**  
Contoh berikut digunakan `CreateAwsKmsMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Langkah 2: Konfigurasikan tindakan atribut Anda**  
Contoh berikut mendefinisikan `attributeActionsOnEncrypt` Kamus yang mewakili [tindakan atribut](concepts.md#crypt-actions) sampel untuk item tabel.  
Contoh berikut tidak mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":attribute3"] = CryptoAction.DO_NOTHING
};
```

**Langkah 3: Tentukan atribut mana yang dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien mengasumsikan bahwa nama atribut apa pun dengan awalan "`:`" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

```
const String unsignAttrPrefix = ":";
```

**Langkah 4: Tentukan konfigurasi enkripsi tabel DynamoDB**  
Contoh berikut mendefinisikan `tableConfigs` Peta yang mewakili konfigurasi enkripsi untuk tabel DynamoDB ini.  
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-net-using.md#net-logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Untuk informasi selengkapnya, lihat [Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-net-using.md#ddb-net-config-encrypt).  
Untuk menggunakan [enkripsi yang dapat dicari](searchable-encryption.md) atau [suar yang ditandatangani](configure.md#signed-beacons), Anda juga harus menyertakan [`SearchConfig`](ddb-java-using.md#ddb-search-config)dalam konfigurasi enkripsi Anda.

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix
};
tableConfigs.Add(ddbTableName, config);
```

**Langkah 5: Buat klien AWS SDK DynamoDB baru**  
**Contoh berikut membuat klien AWS SDK DynamoDB baru menggunakan `TableEncryptionConfigs` dari Langkah 4.**  

```
var ddb = new Client.DynamoDbClient(
    new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });
```

**Langkah 6: Enkripsi dan tandatangani item tabel DynamoDB**  
Contoh berikut mendefinisikan `item` Kamus yang mewakili item tabel sampel dan menempatkan item dalam tabel DynamoDB. Item dienkripsi dan ditandatangani sisi klien sebelum dikirim ke DynamoDB.  

```
var item = new Dictionary<String, AttributeValue>
{
    ["partition_key"] = new AttributeValue("BasicPutGetExample"),
    ["sort_key"] = new AttributeValue { N = "0" },
    ["attribute1"] = new AttributeValue("encrypt and sign me!"),
    ["attribute2"] = new AttributeValue("sign me!"),
    [":attribute3"] = new AttributeValue("ignore me!")
};

PutItemRequest putRequest = new PutItemRequest
{
    TableName = ddbTableName,
    Item = item
};

PutItemResponse putResponse = await ddb.PutItemAsync(putRequest);
```

## Menggunakan level yang lebih rendah `DynamoDbItemEncryptor`
<a name="ddb-net-itemencryptor"></a>

Contoh berikut menunjukkan cara menggunakan level yang lebih rendah `DynamoDbItemEncryptor` dengan [AWS KMS keyring](use-kms-keyring.md) untuk langsung mengenkripsi dan menandatangani item tabel. `DynamoDbItemEncryptor`Itu tidak menempatkan item di tabel DynamoDB Anda.

Anda dapat menggunakan [keyring](keyrings.md) apa pun yang didukung dengan DynamoDB Enhanced Client, tetapi sebaiknya gunakan salah AWS KMS satu gantungan kunci bila memungkinkan.

**catatan**  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` tidak mendukung enkripsi yang dapat [dicari](searchable-encryption.md). Gunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API untuk menggunakan enkripsi yang dapat dicari.

**Lihat contoh kode lengkapnya**: [ItemEncryptDecryptExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/itemencryptor/ItemEncryptDecryptExample.cs)

**Langkah 1: Buat AWS KMS keyring**  
Contoh berikut digunakan `CreateAwsKmsMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**Langkah 2: Konfigurasikan tindakan atribut Anda**  
Contoh berikut mendefinisikan `attributeActionsOnEncrypt` Kamus yang mewakili [tindakan atribut](concepts.md#crypt-actions) sampel untuk item tabel.  
Contoh berikut tidak mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
var attributeActionsOnEncrypt = new Dictionary<String, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":attribute3"] = CryptoAction.DO_NOTHING
};
```

**Langkah 3: Tentukan atribut mana yang dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien mengasumsikan bahwa nama atribut apa pun dengan awalan "`:`" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

```
String unsignAttrPrefix = ":";
```

**Langkah 4: Tentukan `DynamoDbItemEncryptor` konfigurasi**  
Contoh berikut mendefinisikan konfigurasi untuk. `DynamoDbItemEncryptor`  
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-net-using.md#net-logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Untuk informasi selengkapnya, lihat [Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-net-using.md#ddb-net-config-encrypt).  

```
var config = new DynamoDbItemEncryptorConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix
};
```

**Langkah 5: Buat `DynamoDbItemEncryptor`**  
Contoh berikut membuat baru `DynamoDbItemEncryptor` menggunakan `config` dari **Langkah 4**.  

```
var itemEncryptor = new DynamoDbItemEncryptor(config);
```

**Langkah 6: Langsung mengenkripsi dan menandatangani item tabel**  
Contoh berikut langsung mengenkripsi dan menandatangani item menggunakan. `DynamoDbItemEncryptor` `DynamoDbItemEncryptor`Itu tidak menempatkan item di tabel DynamoDB Anda.  

```
var originalItem = new Dictionary<String, AttributeValue>
{
    ["partition_key"] = new AttributeValue("ItemEncryptDecryptExample"),
    ["sort_key"] = new AttributeValue { N = "0" },
    ["attribute1"] = new AttributeValue("encrypt and sign me!"),
    ["attribute2"] = new AttributeValue("sign me!"),
    [":attribute3"] = new AttributeValue("ignore me!")
};

var encryptedItem = itemEncryptor.EncryptItem(
    new EncryptItemInput { PlaintextItem = originalItem }
).EncryptedItem;
```

# Konfigurasikan tabel DynamoDB yang ada untuk menggunakan SDK Enkripsi Database untuk AWS DynamoDB
<a name="ddb-net-config-existing-table"></a>

Dengan versi 3. *x* dari pustaka enkripsi sisi klien .NET untuk DynamoDB, Anda dapat mengonfigurasi tabel Amazon DynamoDB yang ada untuk enkripsi sisi klien. Topik ini memberikan panduan tentang tiga langkah yang harus Anda ambil untuk menambahkan versi 3. *x* ke tabel DynamoDB yang sudah ada dan terisi.

## Langkah 1: Bersiaplah untuk membaca dan menulis item terenkripsi
<a name="ddb-net-add-step1"></a>

Selesaikan langkah-langkah berikut untuk mempersiapkan klien SDK Enkripsi AWS Database Anda untuk membaca dan menulis item terenkripsi. Setelah Anda menerapkan perubahan berikut, klien Anda akan terus membaca dan menulis item teks biasa. Ini tidak akan mengenkripsi atau menandatangani item baru yang ditulis ke tabel, tetapi akan dapat mendekripsi item terenkripsi segera setelah muncul. Perubahan ini mempersiapkan klien untuk mulai [mengenkripsi item baru](#ddb-net-add-step2). Perubahan berikut harus diterapkan ke setiap pembaca sebelum Anda melanjutkan ke langkah berikutnya.

**1. Tentukan [tindakan atribut](concepts.md#crypt-actions) Anda**  
Buat model objek untuk menentukan nilai atribut mana yang akan dienkripsi dan ditandatangani, yang hanya akan ditandatangani, dan mana yang akan diabaikan.  
Secara default, atribut kunci primer ditandatangani tetapi tidak dienkripsi (`SIGN_ONLY`) dan semua atribut lainnya dienkripsi dan ditandatangani (). `ENCRYPT_AND_SIGN`  
Tentukan `ENCRYPT_AND_SIGN` untuk mengenkripsi dan menandatangani atribut. Tentukan `SIGN_ONLY` untuk menandatangani, tetapi tidak mengenkripsi, atribut. Tentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` untuk menandatangani dan atribut dan sertakan dalam konteks enkripsi. Anda tidak dapat mengenkripsi atribut tanpa menandatanganinya juga. Tentukan `DO_NOTHING` untuk mengabaikan atribut. Untuk informasi selengkapnya, lihat [Tindakan atribut dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-net-using.md#ddb-net-attribute-actions).  
Jika Anda menentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` atribut apa pun, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

```
var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction>
{
    ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY
    ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY
    ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN,
    ["attribute2"] = CryptoAction.SIGN_ONLY,
    [":attribute3"] = CryptoAction.DO_NOTHING
};
```

**2. Tentukan atribut mana yang akan dikecualikan dari tanda tangan**  
Contoh berikut mengasumsikan bahwa semua `DO_NOTHING` atribut berbagi awalan yang berbeda "`:`“, dan menggunakan awalan untuk menentukan atribut unsigned yang diizinkan. Klien akan menganggap bahwa nama atribut apa pun dengan awalan `:` "" dikecualikan dari tanda tangan. Untuk informasi selengkapnya, lihat [Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth).  

```
const String unsignAttrPrefix = ":";
```

**3. Buat [keyring](keyrings.md)**  
Contoh berikut membuat [AWS KMS keyring](use-kms-keyring.md). AWS KMS Keyring menggunakan enkripsi simetris atau RSA asimetris AWS KMS keys untuk menghasilkan, mengenkripsi, dan mendekripsi kunci data.  
Contoh ini digunakan `CreateMrkMultiKeyring` untuk membuat AWS KMS keyring dengan kunci KMS enkripsi simetris. `CreateAwsKmsMrkMultiKeyring`Metode ini memastikan bahwa keyring akan menangani tombol Single-region dan Multi-region dengan benar.  

```
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId };
var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
```

**4. Tentukan konfigurasi enkripsi tabel DynamoDB **  
Contoh berikut mendefinisikan `tableConfigs` Peta yang mewakili konfigurasi enkripsi untuk tabel DynamoDB ini.  
[Contoh ini menentukan nama tabel DynamoDB sebagai nama tabel logis.](ddb-net-using.md#net-logical-table-name) Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda.  
Anda harus menentukan `FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` sebagai penggantian plaintext. Kebijakan ini terus membaca dan menulis item teks biasa, membaca item terenkripsi, dan mempersiapkan klien untuk menulis item terenkripsi.  
Untuk informasi selengkapnya tentang nilai yang disertakan dalam konfigurasi enkripsi tabel, lihat[Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB](ddb-java-using.md#ddb-config-encrypt).  

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    PlaintextOverride = FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT
};
tableConfigs.Add(ddbTableName, config);
```

**5. Buat klien AWS SDK DynamoDB baru**  
**contoh berikut membuat klien AWS SDK DynamoDB baru menggunakan `TableEncryptionConfigs` dari Langkah 4.**  

```
var ddb = new Client.DynamoDbClient(
    new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });
```

## Langkah 2: Tulis item terenkripsi dan ditandatangani
<a name="ddb-net-add-step2"></a>

Perbarui kebijakan plaintext dalam konfigurasi enkripsi tabel Anda untuk memungkinkan klien menulis item terenkripsi dan ditandatangani. Setelah Anda menerapkan perubahan berikut, klien akan mengenkripsi dan menandatangani item baru berdasarkan tindakan atribut yang Anda konfigurasikan di **Langkah** 1. Klien akan dapat membaca item teks biasa dan item terenkripsi dan ditandatangani.

Sebelum Anda melanjutkan ke [Langkah 3](#ddb-net-add-step3), Anda harus mengenkripsi dan menandatangani semua item plaintext yang ada di tabel Anda. Tidak ada metrik atau kueri tunggal yang dapat Anda jalankan untuk mengenkripsi item plaintext yang ada dengan cepat. Gunakan proses yang paling masuk akal untuk sistem Anda. Misalnya, Anda dapat menggunakan proses asinkron yang memindai tabel secara perlahan dan menulis ulang item menggunakan tindakan atribut dan konfigurasi enkripsi yang Anda tentukan. Untuk mengidentifikasi item plaintext dalam tabel Anda, kami sarankan memindai semua item yang tidak berisi `aws_dbe_head` dan `aws_dbe_foot` atribut yang ditambahkan SDK Enkripsi AWS Database ke item saat dienkripsi dan ditandatangani.

Contoh berikut memperbarui konfigurasi enkripsi tabel dari **Langkah 1**. Anda harus memperbarui penggantian plaintext dengan. `FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` Kebijakan ini terus membaca item teks biasa, tetapi juga membaca dan menulis item terenkripsi. Buat klien AWS SDK DynamoDB baru menggunakan yang diperbarui. `TableEncryptionConfigs`

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    PlaintextOverride = FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT
};
tableConfigs.Add(ddbTableName, config);
```

## Langkah 3: Hanya baca item terenkripsi dan ditandatangani
<a name="ddb-net-add-step3"></a>

Setelah Anda mengenkripsi dan menandatangani semua item Anda, perbarui penggantian plaintext dalam konfigurasi enkripsi tabel Anda untuk hanya mengizinkan klien membaca dan menulis item terenkripsi dan ditandatangani. Setelah Anda menerapkan perubahan berikut, klien akan mengenkripsi dan menandatangani item baru berdasarkan tindakan atribut yang Anda konfigurasikan di **Langkah** 1. Klien hanya akan dapat membaca item terenkripsi dan ditandatangani.

Contoh berikut memperbarui konfigurasi enkripsi tabel dari **Langkah 2**. Anda dapat memperbarui penggantian plaintext dengan `FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT` atau menghapus kebijakan plaintext dari konfigurasi Anda. Klien hanya membaca dan menulis item terenkripsi dan ditandatangani secara default. Buat klien AWS SDK DynamoDB baru menggunakan yang diperbarui. `TableEncryptionConfigs`

```
Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs =
    new Dictionary<String, DynamoDbTableEncryptionConfig>();
DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig
{
    LogicalTableName = ddbTableName,
    PartitionKeyName = "partition_key",
    SortKeyName = "sort_key",
    AttributeActionsOnEncrypt = attributeActionsOnEncrypt,
    Keyring = kmsKeyring,
    AllowedUnsignedAttributePrefix = unsignAttrPrefix,
    // Optional: you can also remove the plaintext policy from your configuration
    PlaintextOverride = FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT
};
tableConfigs.Add(ddbTableName, config);
```

# Karat
<a name="ddb-rust"></a>

Topik ini menjelaskan cara menginstal dan menggunakan versi 1. *x* dari pustaka enkripsi sisi klien Rust untuk DynamoDB. Untuk detail tentang pemrograman dengan AWS Database Encryption SDK untuk DynamoDB, lihat contoh [Rust di aws-database-encryption-sdk repositori -dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/) aktif. GitHub

Semua implementasi bahasa pemrograman SDK Enkripsi AWS Database untuk DynamoDB dapat dioperasikan.

**Topics**
+ [Prasyarat](#ddb-rust-prerequisites)
+ [Penginstalan](#ddb-rust-install)
+ [Menggunakan klien Rust](ddb-rust-using.md)

## Prasyarat
<a name="ddb-rust-prerequisites"></a>

Sebelum Anda menginstal pustaka enkripsi sisi klien Rust untuk DynamoDB, pastikan Anda memiliki prasyarat berikut.

**Instal Rust dan Cargo**  
Instal rilis stabil [Rust](https://www.rust-lang.org/) saat ini menggunakan [rustup](https://rustup.rs/).  
Untuk informasi lebih lanjut tentang mengunduh dan menginstal rustup, lihat [prosedur instalasi](https://doc.rust-lang.org/cargo/getting-started/installation.html) di The Cargo Book.

## Penginstalan
<a name="ddb-rust-install"></a>

Pustaka enkripsi sisi klien Rust untuk DynamoDB tersedia sebagai peti di Crates.io. [aws-db-esdk](https://crates.io/crates/aws-db-esdk) Untuk detail tentang menginstal dan membangun perpustakaan, lihat file [README.md](https://github.com/aws/aws-database-encryption-sdk-dynamodb/) di repositori -dynamodb. aws-database-encryption-sdk GitHub 

**Secara manual**  
[Untuk menginstal pustaka enkripsi sisi klien Rust untuk DynamoDB, kloning atau unduh repositori -dynamodb. aws-database-encryption-sdk](https://github.com/aws/aws-database-encryption-sdk-dynamodb/) GitHub 

**Pasang versi terbaru**  
Jalankan perintah Cargo berikut di direktori proyek Anda:  

```
cargo add aws-db-esdk
```
Atau tambahkan baris berikut ke Cargo.toml Anda:  

```
aws-db-esdk = "<version>"
```

# Menggunakan pustaka enkripsi sisi klien Rust untuk DynamoDB
<a name="ddb-rust-using"></a>

Topik ini menjelaskan beberapa fungsi dan kelas pembantu di versi 1. *x* dari pustaka enkripsi sisi klien Rust untuk DynamoDB. 

Untuk detail tentang pemrograman dengan pustaka enkripsi sisi klien Rust untuk DynamoDB, lihat [contoh Rust](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/) di repositori -dynamodb aktif. aws-database-encryption-sdk GitHub

**Topics**
+ [Enkriptor item](#ddb-rust-item-encryptors)
+ [Tindakan atribut](#ddb-rust-attribute-actions)
+ [Konfigurasi enkripsi](#ddb-rust-config-encrypt)
+ [Memperbarui item](#ddb-rust-update-items)

## Enkriptor item
<a name="ddb-rust-item-encryptors"></a>

Pada intinya, AWS Database Encryption SDK untuk DynamoDB adalah enkripsi item. Anda dapat menggunakan versi 1. *x* dari pustaka enkripsi sisi klien Rust untuk DynamoDB untuk mengenkripsi, menandatangani, memverifikasi, dan mendekripsi item tabel DynamoDB Anda dengan cara berikut.

**SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API**  
Anda dapat menggunakan [konfigurasi enkripsi tabel](#ddb-rust-config-encrypt) untuk membuat klien DynamoDB yang secara otomatis mengenkripsi dan menandatangani item sisi klien dengan permintaan DynamoDB Anda. `PutItem`  
[Anda harus menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API untuk menggunakan enkripsi yang dapat dicari.](searchable-encryption.md)  
[Untuk contoh yang mendemonstrasikan cara menggunakan SDK Enkripsi AWS Database tingkat rendah untuk DynamoDB API, lihat basic\$1get\$1put\$1example.rs di repositori -dynamodb pada.](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/basic_get_put_example.rs) aws-database-encryption-sdk GitHub

**Tingkat yang lebih rendah `DynamoDbItemEncryptor`**  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` secara langsung mengenkripsi dan menandatangani atau mendekripsi dan memverifikasi item tabel Anda tanpa memanggil DynamoDB. Itu tidak membuat DynamoDB atau `PutItem` permintaan`GetItem`. Misalnya, Anda dapat menggunakan level yang lebih rendah `DynamoDbItemEncryptor` untuk langsung mendekripsi dan memverifikasi item DynamoDB yang telah Anda ambil.  
Tingkat yang lebih rendah `DynamoDbItemEncryptor` tidak mendukung enkripsi yang dapat [dicari](searchable-encryption.md).  
Untuk contoh yang menunjukkan cara menggunakan level yang lebih rendah, lihat `DynamoDbItemEncryptor` [item\$1encrypt\$1decrypt.rs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/itemencryptor/item_encrypt_decrypt.rs) di repositori -dynamodb pada. aws-database-encryption-sdk GitHub

## Tindakan atribut dalam SDK Enkripsi AWS Database untuk DynamoDB
<a name="ddb-rust-attribute-actions"></a>

[Tindakan atribut](concepts.md#crypt-actions) menentukan nilai atribut mana yang dienkripsi dan ditandatangani, yang hanya ditandatangani, yang ditandatangani dan disertakan dalam konteks enkripsi, dan mana yang diabaikan.

Untuk menentukan tindakan atribut dengan klien Rust, tentukan tindakan atribut secara manual menggunakan model objek. Tentukan tindakan atribut Anda dengan membuat `HashMap` objek di mana pasangan nama-nilai mewakili nama atribut dan tindakan yang ditentukan.

Tentukan `ENCRYPT_AND_SIGN` untuk mengenkripsi dan menandatangani atribut. Tentukan `SIGN_ONLY` untuk menandatangani, tetapi tidak mengenkripsi, atribut. Tentukan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` untuk menandatangani atribut dan sertakan dalam konteks enkripsi. Anda tidak dapat mengenkripsi atribut tanpa menandatanganinya juga. Tentukan `DO_NOTHING` untuk mengabaikan atribut.

Partisi dan atribut sortir harus salah satu `SIGN_ONLY` atau`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`. Jika Anda mendefinisikan atribut apa pun sebagai`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, maka atribut partisi dan sortir juga harus`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`.

**catatan**  
Setelah menentukan tindakan atribut, Anda harus menentukan atribut mana yang dikecualikan dari tanda tangan. Untuk mempermudah menambahkan atribut baru yang tidak ditandatangani di masa mendatang, sebaiknya pilih awalan yang berbeda (seperti "`:`“) untuk mengidentifikasi atribut unsigned Anda. Sertakan awalan ini dalam nama atribut untuk semua atribut yang ditandai `DO_NOTHING` saat Anda menentukan skema DynamoDB dan tindakan atribut.

Model objek berikut menunjukkan cara menentukan`ENCRYPT_AND_SIGN`,, `SIGN_ONLY``SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`, dan `DO_NOTHING` atribut tindakan dengan klien Rust. Contoh ini menggunakan awalan "`:`" untuk mengidentifikasi `DO_NOTHING` atribut.

```
let attribute_actions_on_encrypt = HashMap::from([
    ("partition_key".to_string(), CryptoAction::SignOnly),
    ("sort_key".to_string(), CryptoAction::SignOnly),
    ("attribute1".to_string(), CryptoAction::EncryptAndSign),
    ("attribute2".to_string(), CryptoAction::SignOnly),
    (":attribute3".to_string(), CryptoAction::DoNothing),
]);
```

## Konfigurasi enkripsi dalam SDK Enkripsi AWS Database untuk DynamoDB
<a name="ddb-rust-config-encrypt"></a>

Bila Anda menggunakan AWS Database Encryption SDK, Anda harus secara eksplisit menentukan konfigurasi enkripsi untuk tabel DynamoDB Anda. Nilai yang diperlukan dalam konfigurasi enkripsi Anda bergantung pada apakah Anda mendefinisikan tindakan atribut secara manual atau dengan kelas data beranotasi.

Cuplikan berikut mendefinisikan konfigurasi enkripsi tabel DynamoDB menggunakan SDK AWS Enkripsi Database tingkat rendah untuk DynamoDB API dan mengizinkan atribut unsigned yang ditentukan oleh awalan yang berbeda.

```
let table_config = DynamoDbTableEncryptionConfig::builder()
    .logical_table_name(ddb_table_name)
    .partition_key_name("partition_key")
    .sort_key_name("sort_key")
    .attribute_actions_on_encrypt(attribute_actions_on_encrypt)
    .keyring(kms_keyring)
    .allowed_unsigned_attribute_prefix(UNSIGNED_ATTR_PREFIX)
    // Specifying an algorithm suite is optional
    .algorithm_suite_id(
        DbeAlgorithmSuiteId::AlgAes256GcmHkdfSha512CommitKeyEcdsaP384SymsigHmacSha384,
    )
    .build()?;

let table_configs = DynamoDbTablesEncryptionConfig::builder()
    .table_encryption_configs(HashMap::from([(ddb_table_name.to_string(), table_config)]))
    .build()?;
```

**Nama tabel logis**  
Sebuah nama tabel logis untuk tabel DynamoDB Anda.  
Nama tabel logis terikat secara kriptografis ke semua data yang disimpan dalam tabel untuk menyederhanakan operasi pemulihan DynamoDB. Kami sangat menyarankan untuk menentukan nama tabel DynamoDB Anda sebagai nama tabel logis saat Anda pertama kali menentukan konfigurasi enkripsi Anda. Anda harus selalu menentukan nama tabel logis yang sama. Agar dekripsi berhasil, nama tabel logis harus sesuai dengan nama yang ditentukan pada enkripsi. Jika nama tabel DynamoDB Anda berubah setelah [memulihkan tabel DynamoDB Anda dari cadangan, nama tabel](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html) logis memastikan bahwa operasi dekripsi masih mengenali tabel.

**Atribut yang tidak ditandatangani yang diizinkan**  
Atribut yang ditandai `DO_NOTHING` dalam tindakan atribut Anda.  
Atribut unsigned yang diizinkan memberi tahu klien atribut mana yang dikecualikan dari tanda tangan. Klien mengasumsikan bahwa semua atribut lainnya termasuk dalam tanda tangan. Kemudian, saat mendekripsi catatan, klien menentukan atribut mana yang perlu diverifikasi dan mana yang harus diabaikan dari atribut unsigned yang diizinkan yang Anda tentukan. Anda tidak dapat menghapus atribut dari atribut yang tidak ditandatangani yang diizinkan.  
Anda dapat menentukan atribut unsigned yang diizinkan secara eksplisit dengan membuat array yang mencantumkan semua atribut Anda. `DO_NOTHING` Anda juga dapat menentukan awalan yang berbeda saat menamai `DO_NOTHING` atribut Anda dan menggunakan awalan untuk memberi tahu klien atribut mana yang tidak ditandatangani. Kami sangat menyarankan untuk menentukan awalan yang berbeda karena menyederhanakan proses penambahan `DO_NOTHING` atribut baru di masa depan. Untuk informasi selengkapnya, lihat [Memperbarui model data Anda](ddb-update-data-model.md).  
Jika Anda tidak menentukan awalan untuk semua `DO_NOTHING` atribut, Anda dapat mengonfigurasi `allowedUnsignedAttributes` array yang secara eksplisit mencantumkan semua atribut yang diharapkan klien tidak ditandatangani saat bertemu dengan mereka pada dekripsi. Anda hanya harus secara eksplisit mendefinisikan atribut unsigned yang diizinkan jika benar-benar diperlukan.

**Konfigurasi Pencarian (Opsional)**  
`SearchConfig`Mendefinisikan versi [beacon](using-beacons.md#beacon-version).  
`SearchConfig`Harus ditentukan untuk menggunakan [enkripsi yang dapat dicari](searchable-encryption.md) atau suar yang [ditandatangani](configure.md#signed-beacons).

**Suite Algoritma (Opsional)**  
`algorithmSuiteId`Mendefinisikan algoritma mana yang sesuai dengan AWS Database Encryption SDK yang digunakan.  
Kecuali Anda secara eksplisit menentukan rangkaian algoritme alternatif, SDK Enkripsi AWS Database menggunakan rangkaian algoritme [default](supported-algorithms.md#recommended-algorithms). [Rangkaian algoritme default menggunakan algoritma AES-GCM dengan derivasi kunci, [tanda tangan digital](concepts.md#digital-sigs), dan komitmen kunci.](concepts.md#key-commitment) Meskipun rangkaian algoritme default kemungkinan cocok untuk sebagian besar aplikasi, Anda dapat memilih rangkaian algoritme alternatif. Misalnya, beberapa model kepercayaan akan dipenuhi oleh rangkaian algoritma tanpa tanda tangan digital. Untuk informasi tentang rangkaian algoritme yang didukung SDK Enkripsi AWS Database, lihat[Rangkaian algoritme yang didukung di SDK Enkripsi AWS Database](supported-algorithms.md).  
Untuk memilih [rangkaian algoritma AES-GCM tanpa tanda tangan digital ECDSA](supported-algorithms.md#other-algorithms), sertakan cuplikan berikut dalam konfigurasi enkripsi tabel Anda.  

```
.algorithm_suite_id(
    DbeAlgorithmSuiteId::AlgAes256GcmHkdfSha512CommitKeyEcdsaP384SymsigHmacSha384,
)
```

## Memperbarui item dengan SDK Enkripsi AWS Database
<a name="ddb-rust-update-items"></a>

SDK Enkripsi AWS Database tidak mendukung [ddb: UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) untuk item yang menyertakan atribut terenkripsi atau ditandatangani. Untuk memperbarui atribut terenkripsi atau ditandatangani, Anda harus menggunakan [ddb](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html):. PutItem Saat Anda menentukan kunci utama yang sama dengan item yang ada dalam `PutItem` permintaan Anda, item baru sepenuhnya menggantikan item yang ada.

# Klien Enkripsi DynamoDB Legacy
<a name="legacy-dynamodb-encryption-client"></a>

Pada tanggal 9 Juni 2023, pustaka enkripsi sisi klien kami diubah namanya menjadi Database Encryption SDK. AWS AWS Database Encryption SDK terus mendukung versi Klien Enkripsi DynamoDB lama. Untuk informasi selengkapnya tentang berbagai bagian pustaka enkripsi sisi klien yang berubah dengan penggantian nama, lihat. [Ganti nama Klien Enkripsi Amazon DynamoDB](DDBEC-rename.md)

Untuk bermigrasi ke versi terbaru pustaka enkripsi sisi klien Java untuk DynamoDB, lihat. [Migrasi ke versi 3.x](ddb-java-migrate.md)

**Topics**
+ [AWS SDK Enkripsi Database untuk dukungan versi DynamoDB](#legacy-support)
+ [Cara kerja DynamoDB Encryption Client](DDBEC-legacy-how-it-works.md)
+ [Konsep Amazon DynamoDB Encryption Client](DDBEC-legacy-concepts.md)
+ [Penyedia bahan kriptografi](crypto-materials-providers.md)
+ [Bahasa pemrograman Amazon DynamoDB Encryption Client yang tersedia](programming-languages.md)
+ [Mengubah model data Anda](data-model.md)
+ [Memecahkan masalah dalam aplikasi DynamoDB Encryption Client Anda](troubleshooting.md)

## AWS SDK Enkripsi Database untuk dukungan versi DynamoDB
<a name="legacy-support"></a>

Topik di Bab Legacy memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python.

Tabel berikut mencantumkan bahasa dan versi yang mendukung enkripsi sisi klien di Amazon DynamoDB.


| Bahasa pemrograman | Versi | Fase siklus hidup versi utama SDK | 
| --- | --- | --- | 
|  Java  |  Versi 1. *x*  |  [End-of-Support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), efektif Juli 2022  | 
|  Java  |  Versi 2. *x*  |  [Ketersediaan Umum](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 
|  Java  |  Versi 3. *x*  |  [Ketersediaan Umum](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 
|  Python  |  Versi 1. *x*  |  [End-of-Support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), efektif Juli 2022  | 
|  Python  |  Versi 2. *x*  |  [End-of-Support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), efektif Juli 2022  | 
|  Python  |  Versi 3. *x*  |  [Ketersediaan Umum](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle) (GA)  | 

# Cara kerja DynamoDB Encryption Client
<a name="DDBEC-legacy-how-it-works"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

DynamoDB Encryption Client dirancang khusus untuk melindungi data yang Anda simpan di DynamoDB. Pustakanya meliputi implementasi aman yang dapat Anda perluas atau gunakan tanpa perubahan. Dan, sebagian besar elemennya diwakili oleh elemen abstrak sehingga Anda dapat membuat dan menggunakan komponen kustom yang kompatibel.

**Mengenkripsi dan menandatangani item tabel**

Mesin utama dari DynamoDB Encryption Client adalah *enkriptor item* yang mengenkripsi, menandatangani, memverifikasi, dan mendekripsi item tabel. Ia menerima informasi tentang item tabel Anda dan memberi perintah tentang item mana yang perlu dienkripsi dan ditandatangani. Ia menerima materi enkripsi, dan memberi perintah tentang cara menggunakannya, dari [penyedia materi kriptografis](DDBEC-legacy-concepts.md#concept-material-provider) yang Anda pilih dan konfigurasikan. 

Diagram berikut menunjukkan garis besar proses ini.

![\[Mengenkripsi dan menandatangani item di DynamoDB Encryption Client\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/arch-encrypt.png)


Untuk mengenkripsi dan menandatangani item tabel, DynamoDB Encryption Client memerlukan:
+ **Informasi tentang tabel.** Ia mendapatkan informasi tentang tabel dari [konteks enkripsi DynamoDB](concepts.md#encryption-context) yang Anda berikan. Beberapa pembantu mendapatkan informasi yang diperlukan dari DynamoDB dan membuat konteks enkripsi DynamoDB untuk Anda. 
**catatan**  
Konteks enkripsi *DynamoDB dalam Klien Enkripsi* DynamoDB tidak terkait dengan konteks enkripsi *di* () dan. AWS Key Management Service AWS KMS AWS Encryption SDK
+ **Atribut mana yang akan dienkripsi dan ditandatangani.** Ia mendapatkan informasi ini dari [tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) yang Anda berikan.
+ **Materi enkripsi, termasuk enkripsi dan kunci penandatanganan.** Ia mendapatkannya dari [penyedia materi kriptografis](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang Anda pilih dan konfigurasikan. 
+ **Instruksi untuk mengenkripsi dan menandatangani item**. CMP menambahkan instruksi untuk menggunakan materi enkripsi, termasuk algoritma enkripsi dan penandatanganan, ke [deskripsi material aktual](DDBEC-legacy-concepts.md#legacy-material-description).

[Enkriptor item](DDBEC-legacy-concepts.md#item-encryptor) menggunakan semua elemen ini untuk mengenkripsi dan menandatangani item. Enkriptor item juga menambahkan dua atribut untuk item: [atribut deskripsi materi](DDBEC-legacy-concepts.md#legacy-material-description) yang berisi instruksi enkripsi dan penandatanganan (deskripsi materi aktual), dan atribut yang berisi tanda tangan. Anda dapat berinteraksi dengan enkriptor item secara langsung, atau menggunakan fitur pembantu yang berinteraksi dengan enkriptor item untuk Anda untuk menerapkan perilaku default yang aman.

Hasilnya adalah item DynamoDB yang mengandung data yang dienkripsi dan ditandatangani.

**Memverifikasi dan mendekripsi item tabel**

Komponen ini juga bekerja sama untuk memverifikasi dan mendekripsi item Anda, seperti yang ditunjukkan dalam diagram berikut.

![\[Memverifikasi dan mendekripsi item di DynamoDB Encryption Client\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/arch-decrypt.png)


Untuk memverifikasi dan mendekripsi item, DynamoDB Encryption Client membutuhkan komponen yang sama, komponen dengan konfigurasi yang sama, atau komponen yang dirancang khusus untuk mendekripsi item, sebagai berikut:
+ **Informasi tentang tabel** dari [konteks enkripsi DynamoDB](concepts.md#encryption-context).
+ **Atribut mana yang harus diverifikasi dan didekripsi.** Ia mendapatkannya dari [tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions).
+ **Materi dekripsi, termasuk kunci verifikasi dan dekripsi**, dari [penyedia materi kriptografis](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang Anda pilih dan konfigurasikan.

  Item terenkripsi tidak termasuk catatan CMP yang digunakan untuk mengenkripsinya. Anda harus menyediakan CMP yang sama, CMP dengan konfigurasi yang sama, atau CMP yang dirancang untuk mendekripsi item.
+ **Informasi tentang cara item dienkripsi dan ditandatangani**, termasuk algoritma enkripsi dan penandatanganan. Klien mendapatkannya dari [atribut deskripsi materi](DDBEC-legacy-concepts.md#legacy-material-description) dalam item.

[Enkriptor item](DDBEC-legacy-concepts.md#item-encryptor) menggunakan semua elemen ini untuk memverifikasi dan mendekripsi item. Ia juga menghapus deskripsi materi dan atribut tanda tangan. Hasilnya adalah item DynamoDB plaintext.

# Konsep Amazon DynamoDB Encryption Client
<a name="DDBEC-legacy-concepts"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Topik ini menjelaskan konsep dan terminologi yang digunakan dalam Amazon DynamoDB Encryption Client. 

Untuk mempelajari bagaimana komponen DynamoDB Encryption Client berinteraksi, lihat [Cara kerja DynamoDB Encryption Client](DDBEC-legacy-how-it-works.md).

**Topics**
+ [Penyedia materi kriptografis (CMP)](#concept-material-provider)
+ [Enkriptor item](#item-encryptor)
+ [Tindakan atribut](#legacy-attribute-actions)
+ [Deskripsi materi](#legacy-material-description)
+ [Konteks enkripsi DynamoDB](#legacy-encryption-context)
+ [Penyimpanan penyedia](#provider-store)

## Penyedia materi kriptografis (CMP)
<a name="concept-material-provider"></a>

Saat mengimplementasikan DynamoDB Encryption Client, salah satu tugas pertama Anda adalah [memilih penyedia materi kriptografis](crypto-materials-providers.md) (CMP) (juga dikenal sebagai *penyedia materi enkripsi*). Pilihan Anda menentukan sebagian besar aspek lain dalam implementasinya. 

*Penyedia materi kriptografis* (CMP) mengumpulkan, menyusun, dan mengembalikan materi kriptografis yang digunakan [enkriptor item](#item-encryptor) untuk mengenkripsi dan menandatangani item tabel Anda. CMP menentukan algoritma enkripsi yang digunakan serta cara menghasilkan dan melindungi kunci enkripsi dan penandatanganan.

CMP berinteraksi dengan enkriptor item. Enkriptor item meminta materi enkripsi atau dekripsi dari CMP, dan CMP mengembalikannya ke enkriptor item. Kemudian, enkriptor item menggunakan materi kriptografis untuk mengenkripsi dan menandatangani, atau memverifikasi dan mendekripsi, item.

Anda menentukan CMP saat Anda mengonfigurasi klien. Anda dapat membuat CMP kustom yang kompatibel, atau menggunakan salah satu dari banyak CMPs di perpustakaan. Sebagian besar CMPs tersedia untuk beberapa bahasa pemrograman. 

## Enkriptor item
<a name="item-encryptor"></a>

*Enkriptor item* adalah komponen dengan tingkat yang lebih rendah yang melakukan operasi kriptografis untuk DynamoDB Encryption Client. Ia meminta materi kriptografis dari [penyedia materi kriptografis](#concept-material-provider) (CMP), kemudian menggunakan materi yang dikembalikan CMP untuk mengenkripsi dan menandatangani, atau memverifikasi dan mendekripsi, item tabel Anda.

Anda dapat berinteraksi dengan enkriptor item secara langsung atau menggunakan bantuan yang disediakan pustaka Anda. Sebagai contoh, DynamoDB Encryption Client untuk Java mencakup kelas bantuan `AttributeEncryptor` yang dapat Anda gunakan dengan `DynamoDBMapper`, alih-alih berinteraksi secara langsung dengan enkriptor item `DynamoDBEncryptor`. Pustaka Python mencakup kelas bantuan `EncryptedTable`, `EncryptedClient`, dan `EncryptedResource` yang berinteraksi dengan enkriptor item untuk Anda.

## Tindakan atribut
<a name="legacy-attribute-actions"></a>

*Tindakan atribut* memberitahukan kepada enkriptor item tentang tindakan mana yang perlu dilakukan pada setiap atribut item. 

Nilai tindakan atribut dapat menjadi berupa salah satu dari yang berikut:
+ **Enkripsi dan tanda tangan** – Enkripsi nilai atribut. Sertakan atribut (nama dan nilai) dalam tanda tangan item.
+ **Hanya tanda tangan** – Sertakan atribut dalam tanda tangan item.
+ **Jangan lakukan apa pun** – Jangan enkripsi atau tanda tangani atribut.

Untuk semua atribut yang dapat menyimpan data sensitif, gunakan **Enkripsi dan tanda tangan**. Untuk atribut kunci utama (kunci partisi dan kunci penyortiran), gunakan **Hanya tanda tangan**. [Atribut deskripsi materi](#legacy-material-description) dan atribut tanda tangan tidak ditandatangani atau dienkripsi. Anda tidak perlu menentukan tindakan atribut untuk atribut ini.

Pilih tindakan atribut Anda dengan hati-hati. Bila ragu, gunakan **Enkripsi dan tanda tangan**. Begitu Anda menggunakan DynamoDB Encryption Client untuk melindungi item tabel Anda, Anda tidak dapat mengubah tindakan untuk atribut tanpa menimbulkan risiko kesalahan validasi tanda tangan. Untuk detailnya, lihat [Mengubah model data Anda](data-model.md).

**Awas**  
Jangan mengenkripsi atribut kunci utama. Atribut tersebut harus tetap dalam plaintext sehingga DynamoDB dapat menemukan item tanpa memindai keseluruhan tabel.

Jika [konteks enkripsi DynamoDB](concepts.md#encryption-context) mengidentifikasi atribut kunci utama Anda, klien akan menyebabkan kesalahan jika Anda mencoba mengenkripsinya.

Teknik yang Anda gunakan untuk menentukan tindakan atribut berbeda untuk setiap bahasa pemrograman. Ini mungkin juga spesifik untuk kelas bantuan yang Anda gunakan.

Untuk informasi lebih lanjut, lihat dokumentasi untuk bahasa pemrograman Anda.
+ [Python](python-using.md#python-attribute-actions)
+ [Java](java-using.md#attribute-actions-java)

## Deskripsi materi
<a name="legacy-material-description"></a>

*Deskripsi materi* untuk item tabel terenkripsi terdiri atas informasi, seperti algoritma enkripsi, tentang bagaimana item tabel dienkripsi dan ditandatangani. [Penyedia materi kriptografis](#concept-material-provider) (CMP) mencatat deskripsi materi saat menyusun materi kriptografis untuk enkripsi dan penandatanganan. Kemudian, ketika perlu menyusun materi kriptografis untuk memverifikasi dan mendekripsi item, ia menggunakan deskripsi materi sebagai panduan. 

Pada DynamoDB Encryption Client, deskripsi materi mengacu pada tiga elemen terkait:

**Deskripsi materi yang diminta**  
Beberapa [penyedia materi kriptografi](#concept-material-provider) (CMPs) memungkinkan Anda menentukan opsi lanjutan, seperti algoritma enkripsi. Untuk menunjukkan pilihan Anda, Anda menambahkan pasangan nama-nilai ke properti deskripsi materi dari [konteks enkripsi DynamoDB](concepts.md#encryption-context) dalam permintaan Anda untuk mengenkripsi item tabel. Elemen ini dikenal sebagai *deskripsi materi yang diminta*. Nilai yang valid dalam deskripsi materi yang diminta didefinisikan oleh CMP yang Anda pilih.   
Karena deskripsi materi dapat menimpa nilai default yang aman, kami sarankan Anda menghilangkan deskripsi materi yang diminta kecuali jika Anda memiliki alasan kuat untuk menggunakannya.

**Deskripsi materi aktual**  
Deskripsi materi yang dikembalikan oleh [penyedia bahan kriptografi](#concept-material-provider) (CMPs) dikenal sebagai *deskripsi materi yang sebenarnya*. Ini menggambarkan nilai-nilai aktual yang digunakan CMP ketika menyusun materi kriptografis. Biasanya terdiri atas deskripsi materi yang diminta, jika ada, dengan penambahan dan perubahan.

**Atribut deskripsi materi**  
Klien menyimpan deskripsi materi aktual dalam *atribut deskripsi materi* item yang dienkripsi. Nama atribut deskripsi materi adalah `amzn-ddb-map-desc` dan nilainya adalah deskripsi materi aktual. Klien menggunakan nilai dalam atribut deskripsi materi untuk memverifikasi dan mendekripsi item.

## Konteks enkripsi DynamoDB
<a name="legacy-encryption-context"></a>

*Konteks enkripsi DynamoDB* menyediakan informasi tentang tabel dan item untuk [penyedia materi kriptografis](#concept-material-provider) (CMP). Dalam implementasi lanjutan, konteks enkripsi DynamoDB dapat mencakup [deskripsi materi yang diminta](#legacy-material-description).

Ketika Anda mengenkripsi item tabel, konteks enkripsi DynamoDB secara kriptografis terikat dengan nilai-nilai atribut terenkripsi. Ketika Anda mendekripsi, jika konteks enkripsi DynamoDB tidak sama persis dalam hal penulisan huruf besar-kecil dengan konteks enkripsi DynamoDB yang digunakan untuk mengenkripsi, operasi dekripsi gagal. Jika Anda berinteraksi dengan [enkriptor item](#item-encryptor) secara langsung, Anda harus menyediakan konteks enkripsi DynamoDB ketika Anda memanggil metode enkripsi atau dekripsi. Kebanyakan bantuan membuat konteks enkripsi DynamoDB untuk Anda.

**catatan**  
Konteks enkripsi *DynamoDB dalam Klien Enkripsi* DynamoDB tidak terkait dengan konteks enkripsi *di* () dan. AWS Key Management Service AWS KMS AWS Encryption SDK

Konteks enkripsi DynamoDB dapat mencakup bidang berikut. Semua bidang dan nilai bersifat opsional.
+ Nama tabel
+ Nama kunci partisi
+ Nama kunci penyortiran
+ Atribut pasangan nama-nilai
+ [Deskripsi materi yang diminta](#legacy-material-description)

## Penyimpanan penyedia
<a name="provider-store"></a>

*Toko penyedia* adalah komponen yang mengembalikan [penyedia bahan kriptografi](#concept-material-provider) (CMPs). Toko penyedia dapat membuat CMPs atau mendapatkannya dari sumber lain, seperti toko penyedia lain. Toko penyedia menyimpan versi CMPs yang dibuatnya dalam penyimpanan persisten di mana setiap CMP yang disimpan diidentifikasi dengan nama material pemohon dan nomor versi. 

[Penyedia Terbaru](most-recent-provider.md) di Klien Enkripsi DynamoDB mendapatkannya CMPs dari toko penyedia, tetapi Anda dapat menggunakan toko penyedia untuk CMPs memasok ke komponen apa pun. Setiap Penyedia Terbaru dikaitkan dengan satu toko penyedia, tetapi toko penyedia dapat memasok CMPs ke banyak pemohon di beberapa host.

Toko penyedia membuat versi baru sesuai permintaan, dan mengembalikan versi baru dan yang sudah ada. CMPs Penyimpanan penyedia ini juga mengembalikan nomor versi terbaru untuk nama materi tertentu. Hal ini memungkinkan peminta tahu kapan penyimpanan penyedia memiliki versi baru dari CMP yang dapat diminta.

Klien Enkripsi DynamoDB mencakup [ MetaStore](most-recent-provider.md#about-metastore), yang merupakan toko penyedia yang membuat CMPs Dibungkus dengan kunci yang disimpan di DynamoDB dan dienkripsi dengan menggunakan Klien Enkripsi DynamoDB internal. 

**Pelajari lebih lanjut:**
+ Penyimpanan penyedia: [Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/ProviderStore.html), [Python](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/src/dynamodb_encryption_sdk/material_providers/store/__init__.py)
+ MetaStore: [Jawa](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/MetaStore.html), [Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/materials_providers/metastore.html#module-dynamodb_encryption_sdk.material_providers.store.meta)

# Penyedia bahan kriptografi
<a name="crypto-materials-providers"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Salah satu keputusan terpenting yang Anda buat saat menggunakan DynamoDB Encryption Client adalah memilih [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP). CMP merakit dan mengembalikan bahan kriptografi untuk enkriptor item. Hal ini juga menentukan bagaimana kunci enkripsi dan penandatanganan dihasilkan, apakah bahan kunci baru dihasilkan untuk setiap item atau digunakan kembali, serta algoritma enkripsi dan penandatanganan yang digunakan. 

Anda dapat memilih CMP dari implementasi yang disediakan di pustaka DynamoDB Encryption Client atau membangun CMP kustom yang kompatibel. Pilihan CMP Anda mungkin juga tergantung pada [bahasa pemrograman](programming-languages.md) yang Anda gunakan.

Topik ini menjelaskan yang paling umum CMPs dan menawarkan beberapa saran untuk membantu Anda memilih yang terbaik untuk aplikasi Anda.

**Penyedia Bahan KMS Langsung**  
Penyedia Bahan KMS Langsung melindungi item tabel Anda di bawah item [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)yang tidak pernah meninggalkan [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) tidak terenkripsi. Aplikasi Anda tidak harus menghasilkan atau mengelola bahan kriptografi apa pun. Karena menggunakan AWS KMS key untuk menghasilkan enkripsi unik dan kunci penandatanganan untuk setiap item, penyedia ini memanggil AWS KMS setiap kali mengenkripsi atau mendekripsi item.   
Jika Anda menggunakan AWS KMS dan satu AWS KMS panggilan per transaksi praktis untuk aplikasi Anda, penyedia ini adalah pilihan yang baik.  
Lihat perinciannya di [Penyedia Bahan KMS Langsung](direct-kms-provider.md).

**Penyedia Bahan Terbungkus (CMP Terbungkus)**  
Penyedia Bahan Terbungkus (CMP Terbungkus) memungkinkan Anda menghasilkan dan mengelola kunci pembungkus dan penandatanganan di luar DynamoDB Encryption Client.   
CMP Terbungkus menghasilkan kunci enkripsi yang unik untuk setiap item. Kemudian itu menggunakan kunci pembungkus (atau pembuka bungkus) dan penandatanganan yang Anda berikan. Dengan demikian, Anda menentukan bagaimana kunci pembungkus dan penandatanganan dihasilkan dan apakah mereka itu unik untuk setiap item atau digunakan kembali. Wrapped CMP adalah alternatif yang aman untuk [Direct KMS Provider](direct-kms-provider.md) untuk aplikasi yang tidak menggunakan AWS KMS dan dapat mengelola materi kriptografi dengan aman.  
Lihat perinciannya di [Penyedia Materi Terbungkus](wrapped-provider.md).

**Penyedia Terbaru**  
*Penyedia Terbaru* adalah [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang dirancang untuk bekerja dengan [toko penyedia](DDBEC-legacy-concepts.md#provider-store). Itu didapat CMPs dari toko penyedia, dan mendapatkan materi kriptografi yang dikembalikan dari toko. CMPs Penyedia Terbaru biasanya menggunakan setiap CMP untuk memenuhi beberapa permintaan untuk bahan kriptografi, tetapi Anda dapat menggunakan fitur dari toko penyedia untuk mengendalikan sejauh mana bahan akan digunakan kembali, menentukan seberapa sering CMP dirotasi, dan bahkan mengubah jenis CMP yang digunakan tanpa mengubah Penyedia Terbaru.  
Anda dapat menggunakan Penyedia Terbaru dengan toko penyedia yang kompatibel. Klien Enkripsi DynamoDB mencakup, MetaStore yang merupakan toko penyedia yang mengembalikan Wrapped. CMPs  
Penyedia Terbaru adalah pilihan yang baik untuk aplikasi yang perlu meminimalkan panggilan ke sumber kriptografi mereka, dan aplikasi yang dapat menggunakan kembali beberapa bahan kriptografi tanpa melanggar persyaratan keamanan mereka. Misalnya, ini memungkinkan Anda untuk melindungi materi kriptografi Anda di bawah [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) tanpa menelepon AWS KMS setiap kali Anda mengenkripsi atau mendekripsi item.  
Lihat perinciannya di [Penyedia Terbaru](most-recent-provider.md).

**Penyedia Bahan Statis**  
Penyedia Bahan Statis dirancang untuk pengujian, proof-of-concept demonstrasi, dan kompatibilitas lama. Penyedia ini tidak menghasilkan bahan kriptografi yang unik untuk setiap item. Ia mengembalikan enkripsi dan kunci penandatanganan yang sama yang Anda berikan, dan kunci-kunci tersebut digunakan langsung untuk mengenkripsi, mendekripsi, dan menandatangani item tabel Anda.   
[Penyedia Statis Asimetris](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html) di pustaka Java bukan penyedia statis. Penyedia ini hanya memasok konstruktor alternatif untuk [CMP Terbungkus](wrapped-provider.md). Hal ini aman untuk penggunaan produksi, tetapi Anda harus menggunakan CMP Terbungkus langsung bila memungkinkan.

**Topics**
+ [Penyedia Bahan KMS Langsung](direct-kms-provider.md)
+ [Penyedia Materi Terbungkus](wrapped-provider.md)
+ [Penyedia Terbaru](most-recent-provider.md)
+ [Penyedia Materi Statis](static-provider.md)

# Penyedia Bahan KMS Langsung
<a name="direct-kms-provider"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

*Penyedia Bahan KMS Langsung (Penyedia* KMS Langsung) melindungi item tabel Anda di bawah item [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)yang tidak pernah meninggalkan [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) tidak terenkripsi. [Penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) ini mengembalikan kunci enkripsi yang unik dan kunci penandatanganan untuk setiap item tabel. Untuk melakukannya, ia memanggil AWS KMS setiap kali Anda mengenkripsi atau mendekripsi item.

Jika Anda memproses item DynamoDB pada frekuensi tinggi dan skala besar, Anda mungkin melebihi batas, menyebabkan AWS KMS [requests-per-secondpenundaan](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second) pemrosesan. Jika Anda perlu melebihi batas, buat kasing di [AWS Dukungan Pusat](https://console.aws.amazon.com/support/home). Anda juga dapat mempertimbangkan untuk menggunakan penyedia bahan kriptografi dengan penggunaan kembali kunci secara terbatas, seperti [Penyedia Terbaru](most-recent-provider.md).

Untuk menggunakan Penyedia KMS Langsung, penelepon harus [memiliki Akun AWS](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/), setidaknya satu AWS KMS key, dan izin untuk memanggil [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)dan [mendekripsi operasi](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) pada. AWS KMS key AWS KMS key Harus berupa kunci enkripsi simetris; Klien Enkripsi DynamoDB tidak mendukung enkripsi asimetris. Jika Anda menggunakan [tabel global DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), Anda mungkin ingin menentukan [kunci multi-Wilayah AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html). Lihat perinciannya di [Cara menggunakannya](#provider-kms-how-to-use).

**catatan**  
Saat Anda menggunakan Penyedia KMS Langsung, nama dan nilai atribut kunci utama Anda muncul dalam teks biasa dalam [konteks AWS KMS enkripsi](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) dan AWS CloudTrail log operasi terkait. AWS KMS Namun, DynamoDB Encryption Client tidak pernah mengekspos plaintext dari nilai-nilai atribut terenkripsi.

Direct KMS Provider adalah salah satu dari beberapa [penyedia materi kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) yang didukung oleh Klien Enkripsi DynamoDB. Untuk informasi tentang yang lain CMPs, lihat[Penyedia bahan kriptografi](crypto-materials-providers.md).

**Misalnya kode, lihat:**
+ Java: [AwsKmsEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)
+ Python:, [aws-kms-encrypted-table[aws-kms-encrypted-item](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py)

**Topics**
+ [Cara menggunakannya](#provider-kms-how-to-use)
+ [Cara kerjanya](#provider-kms-how-it-works)

## Cara menggunakannya
<a name="provider-kms-how-to-use"></a>

Untuk membuat Penyedia KMS Langsung, gunakan parameter ID kunci untuk menentukan [kunci KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) enkripsi simetris di akun Anda. Nilai parameter ID kunci dapat berupa ID kunci, ARN kunci, nama alias, atau alias ARN dari. AWS KMS key Untuk detail tentang pengidentifikasi kunci, lihat [Pengidentifikasi kunci](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) dalam *Panduan Developer AWS Key Management Service *.

Penyedia KMS Langsung memerlukan kunci KMS enkripsi simetris. Anda tidak dapat menggunakan kunci KMS asimetris. Namun, Anda dapat menggunakan kunci KMS Multi-wilayah, kunci KMS dengan bahan kunci yang diimpor, atau kunci KMS di toko kunci khusus. Anda harus memiliki izin [kms: GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) dan [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) pada kunci KMS. Dengan demikian, Anda harus menggunakan kunci yang dikelola pelanggan, bukan kunci KMS yang AWS dikelola atau AWS dimiliki.

Klien Enkripsi DynamoDB untuk Python menentukan Wilayah untuk AWS KMS memanggil dari Wilayah dalam nilai parameter ID kunci, jika termasuk satu. Jika tidak, ia menggunakan Wilayah di AWS KMS klien, jika Anda menentukan satu, atau Wilayah yang Anda konfigurasikan di AWS SDK untuk Python (Boto3). Untuk informasi tentang pemilihan Wilayah dengan Python, lihat [Konfigurasi](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) di AWS SDK for Python (Boto3) API Referensi.

Klien Enkripsi DynamoDB untuk Java menentukan Wilayah untuk AWS KMS memanggil dari Wilayah di AWS KMS klien, jika klien yang Anda tentukan menyertakan Wilayah. Jika tidak, ia akan menggunakan Wilayah yang Anda konfigurasi di AWS SDK untuk Java. Untuk informasi tentang pemilihan Wilayah di AWS SDK untuk Java, lihat [Wilayah AWS seleksi](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html) di Panduan AWS SDK untuk Java Pengembang.

------
#### [ Java ]

```
// Replace the example key ARN and Region with valid values for your application
final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
final String region = 'us-west-2'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

------
#### [ Python ]

Contoh berikut menggunakan kunci ARN untuk menentukan. AWS KMS key Jika pengenal kunci Anda tidak menyertakan Wilayah AWS, Klien Enkripsi DynamoDB mendapatkan Wilayah dari sesi Botocore yang dikonfigurasi, jika ada, atau dari default Boto.

```
# Replace the example key ID with a valid value
kms_key = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key)
```

------

Jika Anda menggunakan tabel [global Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html), sebaiknya enkripsi data Anda di bawah kunci Multi-wilayah. AWS KMS Kunci Multi-Region berbeda Wilayah AWS yang dapat digunakan secara bergantian karena memiliki ID kunci dan bahan kunci yang sama. AWS KMS keys Untuk detailnya, lihat [Menggunakan kunci multi-Wilayah](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) dalam *Panduan Developer AWS Key Management Service *.

**catatan**  
Jika Anda menggunakan tabel global [versi 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html), Anda harus menetapkan tindakan atribut agar bidang replikasi yang dicadangkan tidak dienkripsi atau ditandatangani. Lihat perinciannya di [Masalah dengan tabel global versi lama](troubleshooting.md#fix-global-tables).

Untuk menggunakan kunci multi-Wilayah dengan DynamoDB Encryption Client, buat kunci multi-Wilayah dan replikasi ke Wilayah di mana aplikasi Anda berjalan. Kemudian konfigurasi Penyedia Langsung KMS untuk menggunakan kunci multi-Wilayah di wilayah di mana klien DynamoDB Encryption Client memanggil AWS KMS.

Contoh berikut mengonfigurasi DynamoDB Encryption Client untuk mengenkripsi data di Wilayah AS Timur (N. Virginia) (us-east-1) dan mendekripsi di Wilayah AS Barat (Oregon) (us-west-2) menggunakan kunci multi-Wilayah.

------
#### [ Java ]

Dalam contoh ini, Klien Enkripsi DynamoDB mendapatkan Wilayah untuk AWS KMS memanggil dari Wilayah di klien. AWS KMS Nilai `keyArn` mengidentifikasi kunci multi-Wilayah dalam Wilayah yang sama.

```
// Encrypt in us-east-1

// Replace the example key ARN and Region with valid values for your application
final String usEastKey = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
final String region = 'us-east-1'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usEastKey);
```

```
// Decrypt in us-west-2

// Replace the example key ARN and Region with valid values for your application
final String usWestKey = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
final String region = 'us-west-2'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usWestKey);
```

------
#### [ Python ]

Dalam contoh ini, Klien Enkripsi DynamoDB mendapatkan Wilayah untuk AWS KMS memanggil dari Wilayah di ARN kunci.

```
# Encrypt in us-east-1

# Replace the example key ID with a valid value
us_east_key = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_east_key)
```

```
# Decrypt in us-west-2

# Replace the example key ID with a valid value
us_west_key = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_west_key)
```

------

## Cara kerjanya
<a name="provider-kms-how-it-works"></a>

Penyedia KMS Langsung mengembalikan kunci enkripsi dan penandatanganan yang dilindungi oleh AWS KMS key yang Anda tentukan, seperti yang ditunjukkan pada diagram berikut.

![\[Input, pemrosesan, dan output dari Penyedia KMS Langsung di DynamoDB Encryption Client\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/directKMS.png)

+ Untuk menghasilkan materi enkripsi, Penyedia KMS Langsung meminta AWS KMS untuk [membuat kunci data unik](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) untuk setiap item menggunakan AWS KMS key yang Anda tentukan. Penyedia ini mendapatkan kunci enkripsi dan penandatanganan untuk item dari salinan plaintext dari [kunci data](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys), kemudian mengembalikan kunci enkripsi dan penandatanganan, bersama dengan kunci data terenkripsi, yang disimpan dalam [atribut deskripsi bahan](DDBEC-legacy-concepts.md#legacy-material-description) item tersebut. 

  Enkriptor item menggunakan kunci enkripsi dan penandatanganan serta membuangnya dari memori secepat mungkin. Hanya salinan terenkripsi dari kunci data dari lokasi mereka diambil yang disimpan dalam item yang dienkripsi.
+ Untuk menghasilkan materi dekripsi, Penyedia KMS Langsung meminta AWS KMS untuk mendekripsi kunci data terenkripsi. Kemudian, ia mendapatkan verifikasi dan kunci penandatanganan dari kunci data plaintext, dan mengembalikan mereka ke enkriptor item.

  Enkriptor item memverifikasi item dan, jika verifikasi berhasil, mendekripsi nilai terenkripsi. Kemudian, ia menghapus kunci dari memori sesegera mungkin.

### Dapatkan bahan enkripsi
<a name="direct-kms-get-encryption-materials"></a>

Bagian ini menjelaskan secara detail input, output, dan pemrosesan Penyedia KMS Langsung ketika menerima permintaan bahan enkripsi dari [enkriptor item](DDBEC-legacy-concepts.md#item-encryptor).

**Input ** (dari aplikasi)
+ ID kunci dari sebuah AWS KMS key. 

**Input** (dari enkriptor item)
+ [Konteks enkripsi DynamoDB](concepts.md#encryption-context)

**Output** (untuk enkriptor item)
+ Kunci enkripsi (plaintext)
+ Kunci penandatanganan
+ Dalam [deskripsi bahan aktual](DDBEC-legacy-concepts.md#legacy-material-description): Nilai-nilai ini disimpan dalam atribut deskripsi bahan yang ditambahkan klien ke item.
  + amzn-ddb-env-key: Kunci data yang dikodekan Base64 dienkripsi oleh AWS KMS key
  + amzn-ddb-env-alg: Algoritma enkripsi, secara default [AES/256](https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/archived-crypto-projects/aes-development)
  + amzn-ddb-sig-alg: Algoritma penandatanganan, secara default, [Hmac /256 SHA256](https://en.wikipedia.org/wiki/HMAC)
  + amzn-ddb-wrap-alg: km

**Pengolahan**

1. Penyedia KMS Langsung mengirimkan AWS KMS permintaan untuk menggunakan yang ditentukan AWS KMS key untuk [menghasilkan kunci data unik](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) untuk item tersebut. Operasi mengembalikan kunci plaintext dan salinan yang dienkripsi di bawah file. AWS KMS key Hal ini dikenal sebagai *bahan kunci awal*.

   Permintaan tersebut mencakup nilai-nilai berikut dalam plaintext pada [konteks enkripsi AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context). Nilai-nilai non-rahasia ini secara kriptografi terikat pada objek terenkripsi, sehingga konteks enkripsi yang sama diperlukan pada dekripsi. Anda dapat menggunakan nilai-nilai ini untuk mengidentifikasi panggilan ke AWS KMS dalam [AWS CloudTrail log](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-overview.html).
   + amzn-ddb-env-alg — Algoritma enkripsi, secara default AES/256
   + amzn-ddb-sig-alg — Algoritma penandatanganan, secara default Hmac /256 SHA256
   + (Opsional) aws-kms-table - *table name*
   + (Opsional) *partition key name* - *partition key value* (nilai biner adalah Base64-dikodekan)
   + (Opsional) *sort key name* - *sort key value* (nilai biner adalah Base64-dikodekan)

   Direct KMS Provider mendapatkan nilai untuk konteks AWS KMS enkripsi dari konteks enkripsi [DynamoDB](concepts.md#encryption-context) untuk item tersebut. Jika konteks enkripsi DynamoDB tidak menyertakan nilai, seperti nama tabel, pasangan nama-nilai itu dihilangkan dari konteks enkripsi. AWS KMS 

1. Penyedia KMS Langsung mendapat kunci enkripsi simetris dan kunci penandatanganan dari kunci data. Secara default, ia menggunakan [Secure Hash Algorithm (SHA) 256](https://en.wikipedia.org/wiki/SHA-2) dan [Fungsi Derivasi Kunci RFC5869 berbasis HMAC untuk mendapatkan kunci](https://tools.ietf.org/html/rfc5869) enkripsi simetris AES 256-bit dan kunci penandatanganan HMAC-SHA-256 256-bit. 

1. Penyedia KMS Langsung mengembalikan output ke enkriptor item.

1. Enkriptor item menggunakan kunci enkripsi untuk mengenkripsi atribut yang ditentukan dan kunci penandatanganan untuk menandatanganinya, menggunakan algoritma yang ditentukan dalam deskripsi bahan yang aktual. Ia akan menghapus kunci plaintext dari memori sesegera mungkin.

### Dapatkan materi dekripsi
<a name="direct-kms-get-decryption-materials"></a>

Bagian ini menjelaskan secara detail input, output, dan pemrosesan Penyedia KMS Langsung ketika menerima permintaan bahan dekripsi dari [enkriptor item](DDBEC-legacy-concepts.md#item-encryptor).

**Input ** (dari aplikasi)
+ ID kunci dari sebuah AWS KMS key. 

  Nilai ID kunci dapat berupa ID kunci, kunci ARN, nama alias atau alias ARN dari. AWS KMS key Nilai apa pun yang tidak disertakan dalam ID kunci, seperti Wilayah, harus tersedia di [profil AWS bernama](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles). Kunci ARN menyediakan semua nilai yang AWS KMS dibutuhkan.

**Input** (dari enkriptor item)
+ Salinan [konteks enkripsi DynamoDB](concepts.md#encryption-context) yang berisi konten atribut deskripsi materi.

**Output** (untuk enkriptor item)
+ Kunci enkripsi (plaintext)
+ Kunci penandatanganan

**Pengolahan**

1. Penyedia KMS Langsung mendapatkan kunci data terenkripsi dari atribut deskripsi material dalam item yang dienkripsi. 

1. Ia meminta AWS KMS untuk menggunakan yang ditentukan AWS KMS key untuk [mendekripsi kunci](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) data terenkripsi. Operasi mengembalikan kunci plaintext.

   Permintaan ini harus menggunakan [konteks enkripsi AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) yang digunakan untuk membuat dan mengenkripsi kunci data.
   + aws-kms-table – *table name*
   + *partition key name*— *partition key value* (nilai biner adalah Base64-dikodekan)
   + (Opsional) *sort key name* - *sort key value* (nilai biner adalah Base64-dikodekan)
   + amzn-ddb-env-alg — Algoritma enkripsi, secara default AES/256
   + amzn-ddb-sig-alg — Algoritma penandatanganan, secara default Hmac /256 SHA256

1. Penyedia KMS Langsung menggunakan [Secure Hash Algorithm (SHA) 256](https://en.wikipedia.org/wiki/SHA-2) dan [Fungsi Derivasi Kunci RFC5869 berbasis HMAC untuk mendapatkan kunci](https://tools.ietf.org/html/rfc5869) enkripsi simetris AES 256-bit dan kunci penandatanganan HMAC-SHA-256 256-bit dari kunci data. 

1. Penyedia KMS Langsung mengembalikan output ke enkriptor item.

1. Enkriptor item menggunakan kunci penandatanganan untuk memverifikasi item. Jika berhasil, ia menggunakan kunci enkripsi simetris untuk mendekripsi nilai atribut terenkripsi. Operasi ini menggunakan algoritma enkripsi dan penandatanganan yang ditentukan dalam deskripsi bahan aktual. Enkriptor item akan menghapus kunci plaintext dari memori sesegera mungkin.

# Penyedia Materi Terbungkus
<a name="wrapped-provider"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

*Penyedia Bahan Terbungkus* (Wrapped CMP) memungkinkan Anda menggunakan kunci pembungkus dan penandatanganan dari sumber mana pun dengan DynamoDB Encryption Client. CMP yang Dibungkus tidak bergantung pada AWS layanan apa pun. Namun, Anda harus menghasilkan dan mengelola kunci pembungkus dan penandatanganan di luar klien, termasuk menyediakan kunci yang benar untuk memverifikasi dan mendekripsi item. 

Wrapped CMP menghasilkan kunci enkripsi item yang unik untuk setiap item. CMP ini membungkus kunci enkripsi item dengan kunci pembungkus yang Anda masukkan dan menyimpan kunci enkripsi item terbungkus dalam [atribut deskripsi materi](DDBEC-legacy-concepts.md#legacy-material-description) item. Karena Anda memasukkan kunci pembungkus dan penandatangan, Anda menentukan bagaimana kunci pembungkus dan penandatanganan dihasilkan dan apakah kunci itu unik untuk setiap item atau digunakan kembali. 

Wrapped CMP adalah implementasi yang aman dan pilihan yang baik untuk aplikasi yang dapat mengelola materi kriptografis.

Wrapped CMP adalah salah satu dari beberapa [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) yang didukung oleh Klien Enkripsi DynamoDB. Untuk informasi tentang yang lain CMPs, lihat[Penyedia bahan kriptografi](crypto-materials-providers.md).

**Misalnya kode, lihat:**
+ Java: [AsymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java)
+ Python:, [wrapped-rsa-encrypted-table[wrapped-symmetric-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_symmetric_encrypted_table.py)](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_rsa_encrypted_table.py)

**Topics**
+ [Cara menggunakannya](#wrapped-cmp-how-to-use)
+ [Cara kerjanya](#wrapped-cmp-how-it-works)

## Cara menggunakannya
<a name="wrapped-cmp-how-to-use"></a>

Untuk membuat Wrapped CMP, tentukan kunci pembungkus (diperlukan saat enkripsi), kunci pembuka pembungkus (diperlukan saat dekripsi), dan kunci penandatanganan. Anda harus menyediakan kunci ketika Anda mengenkripsi dan mendekripsi item.

Kunci pembungkus, pembuka pembungkus, dan penandatanganan dapat berupa kunci simetris atau pasangan kunci asimetris. 

------
#### [ Java ]

```
// This example uses asymmetric wrapping and signing key pairs
final KeyPair wrappingKeys = ...
final KeyPair signingKeys = ...

final WrappedMaterialsProvider cmp = 
    new WrappedMaterialsProvider(wrappingKeys.getPublic(),
                                 wrappingKeys.getPrivate(),
                                 signingKeys);
```

------
#### [ Python ]

```
# This example uses symmetric wrapping and signing keys
wrapping_key = ...
signing_key  = ...

wrapped_cmp = WrappedCryptographicMaterialsProvider(
    wrapping_key=wrapping_key,
    unwrapping_key=wrapping_key,
    signing_key=signing_key
)
```

------

## Cara kerjanya
<a name="wrapped-cmp-how-it-works"></a>

Wrapped CMP menghasilkan kunci enkripsi item baru untuk setiap item. CMP ini menggunakan kunci pembungkus, pembuka pembungkus, dan penandatanganan yang Anda berikan, seperti yang ditunjukkan dalam diagram berikut.

![\[Input, pengolahan, dan output dari Penyedia Materi Terbungkus di DynamoDB Encryption Client\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/wrappedCMP.png)


### Dapatkan materi enkripsi
<a name="wrapped-cmp-get-encryption-materials"></a>

Bagian ini menjelaskan secara terperinci input, output, dan pengolahan Penyedia Materi Terbungkus (Wrapped CMP) ketika menerima permintaan materi enkripsi. 

**Input** (dari aplikasi)
+ Kunci pembungkus: Sebuah kunci simetris [Standar Enkripsi Lanjutan](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES), atau kunci publik [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)). Diperlukan jika ada nilai atribut yang dienkripsi. Jika tidak, itu bersifat opsional dan diabaikan.
+ Kunci pembuka pembungkus: Opsional dan diabaikan. 
+ Kunci penandatanganan

**Input** (dari enkriptor item)
+ [Konteks enkripsi DynamoDB](concepts.md#encryption-context)

**Output** (untuk enkriptor item):
+ Kunci enkripsi item plaintext
+ Kunci penandatanganan (tidak berubah)
+ [Deskripsi materi aktual](DDBEC-legacy-concepts.md#legacy-material-description): Nilai-nilai ini disimpan dalam [atribut deskripsi materi](DDBEC-legacy-concepts.md#legacy-material-description) yang ditambahkan klien ke item. 
  + `amzn-ddb-env-key`: Kunci enkripsi item terbungkus yang didekodekan Base64
  + `amzn-ddb-env-alg`: Algoritma enkripsi yang digunakan untuk mengenkripsi item. Defaultnya adalah AES-256-CBC.
  + `amzn-ddb-wrap-alg`: Algoritma pembungkus yang digunakan Wrapped CMP untuk membungkus kunci enkripsi item. Jika kunci pembungkus adalah kunci AES, kuncinya dibungkus menggunakan `AES-Keywrap` tanpa pad sebagaimana didefinisikan dalam [RFC 3394](https://tools.ietf.org/html/rfc3394.html). Jika kunci pembungkus adalah kunci RSA, kunci dienkripsi dengan menggunakan RSA OAEP dengan padding. MGF1 

**Pengolahan**

Saat mengenkripsi item, Anda memasukkan kunci pembungkus dan kunci penandatanganan. Kunci pembuka pembungkus bersifat opsional dan diabaikan.

1. Wrapped CMP menghasilkan kunci enkripsi item simetris yang unik untuk setiap item tabel.

1. CMP ini menggunakan kunci pembungkus yang Anda tentukan untuk membungkus kunci enkripsi item. Kemudian, ia menghapusnya dari memori sesegera mungkin.

1. Ia mengembalikan kunci enkripsi item plaintext, kunci penandatanganan yang Anda berikan, dan [deskripsi materi aktual](DDBEC-legacy-concepts.md#legacy-material-description) yang mencakup kunci enkripsi item terbungkus, serta algoritma enkripsi dan pembungkus.

1. Enkriptor item menggunakan kunci enkripsi plaintext untuk mengenkripsi item. Ia menggunakan kunci penandatanganan yang Anda masukkan untuk menandatangani item. Kemudian, ia menghapus kunci plaintext dari memori sesegera mungkin. Ia menyalin bidang dalam deskripsi materi aktual, termasuk kunci enkripsi terbungkus (`amzn-ddb-env-key`), ke atribut deskripsi materi item.

### Dapatkan materi dekripsi
<a name="wrapped-cmp-get-decryption-materials"></a>

Bagian ini menjelaskan secara terperinci input, output, dan pengolahan Penyedia Materi Terbungkus (Wrapped CMP) ketika menerima permintaan materi dekripsi. 

**Input** (dari aplikasi)
+ Kunci pembungkus: Opsional dan diabaikan.
+ Kunci pembuka pembungkus: Kunci simetris [Standar Enkripsi Lanjutan](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) yang sama atau kunci privat [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) yang sesuai dengan kunci publik RSA yang digunakan untuk mengenkripsi. Diperlukan jika ada nilai atribut yang dienkripsi. Jika tidak, itu bersifat opsional dan diabaikan.
+ Kunci penandatanganan

**Input** (dari enkriptor item)
+ Salinan [konteks enkripsi DynamoDB](concepts.md#encryption-context) yang berisi konten atribut deskripsi materi.

**Output** (untuk enkriptor item)
+ Kunci enkripsi item plaintext
+ Kunci penandatanganan (tidak berubah)

**Pengolahan**

Ketika Anda mendekripsi item, Anda memasukkan kunci pembuka pembungkus dan kunci penandatanganan. Kunci pembuka pembungkus bersifat opsional dan diabaikan.

1. Wrapped CMP mendapatkan kunci enkripsi item terbungkus dari atribut deskripsi materi dari item.

1. Ia menggunakan kunci pembuka pembungkus dan algoritma untuk membuka bungkus kunci enkripsi item. 

1. Ia mengembalikan kunci enkripsi item plaintext, kunci penandatanganan, serta algoritma enkripsi dan penandatanganan ke enkriptor item.

1. Enkriptor item menggunakan kunci penandatanganan untuk memverifikasi item. Jika berhasil, ia menggunakan kunci enkripsi item untuk mendekripsi item. Kemudian, ia menghapus kunci plaintext dari memori sesegera mungkin.

# Penyedia Terbaru
<a name="most-recent-provider"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

*Penyedia Terbaru* adalah [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang dirancang untuk bekerja dengan [toko penyedia](DDBEC-legacy-concepts.md#provider-store). Itu didapat CMPs dari toko penyedia, dan mendapatkan materi kriptografi yang dikembalikan dari toko. CMPs Ia biasanya menggunakan setiap CMP untuk memenuhi beberapa permintaan untuk bahan kriptografi. Namun, Anda dapat menggunakan fitur dari toko penyedia untuk mengendalikan sejauh mana bahan akan digunakan kembali, menentukan seberapa sering CMP dirotasi, dan bahkan mengubah jenis CMP yang digunakan tanpa mengubah Penyedia Terbaru.

**catatan**  
Kode yang terkait dengan simbol `MostRecentProvider` untuk Penyedia Terbaru mungkin menyimpan bahan kriptografi dalam memori untuk seumur hidup proses. Kode ini mungkin membuat pemanggil dapat menggunakan tombol yang tidak lagi diotorisasi untuk digunakan.   
Simbol `MostRecentProvider` tidak lagi digunakan di versi terdukung yang lebih lama dari DynamoDB Encryption Client dan dihapus dari versi 2.0.0. Simbol ini digantikan oleh simbol `CachingMostRecentProvider`. Untuk detail selengkapnya, lihat [Pembaruan untuk Penyedia Terbaru](#mrp-versions).

Penyedia Terbaru adalah pilihan yang baik untuk aplikasi yang perlu meminimalkan panggilan ke toko penyedia dan sumber kriptografi mereka, serta aplikasi yang dapat menggunakan kembali beberapa bahan kriptografi tanpa melanggar persyaratan keamanan mereka. Misalnya, ini memungkinkan Anda untuk melindungi materi kriptografi Anda di bawah [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) tanpa menelepon AWS KMS setiap kali Anda mengenkripsi atau mendekripsi item.

Toko penyedia yang Anda pilih menentukan jenis CMPs yang digunakan Penyedia Terbaru dan seberapa sering mendapatkan CMP baru. Anda dapat menggunakan toko penyedia yang kompatibel dengan Penyedia Terbaru, termasuk toko penyedia kustom yang Anda desain. 

Klien Enkripsi DynamoDB menyertakan *MetaStore*yang membuat dan [mengembalikan Penyedia Bahan Terbungkus (Dibungkus](wrapped-provider.md)). CMPs MetaStore Menyimpan beberapa versi Wrapped CMPs yang dihasilkannya dalam tabel DynamoDB internal dan melindunginya dengan enkripsi sisi klien oleh instance internal Klien Enkripsi DynamoDB. 

Anda dapat mengonfigurasi MetaStore untuk menggunakan semua jenis CMP internal untuk melindungi materi dalam tabel, termasuk [Penyedia KMS Langsung](direct-kms-provider.md) yang menghasilkan materi kriptografi yang dilindungi oleh Anda AWS KMS key, CMP Wrapped yang menggunakan kunci pembungkus dan penandatanganan yang Anda berikan, atau CMP kustom yang kompatibel yang Anda desain.

**Misalnya kode, lihat:**
+ Java: [MostRecentEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java)
+ Python: [most\$1recent\$1provider\$1encrypted\$1table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/most_recent_provider_encrypted_table.py)

**Topics**
+ [Cara menggunakannya](#mrp-how-to-use-it)
+ [Cara kerjanya](#mrp-how-it-works)
+ [Pembaruan untuk Penyedia Terbaru](#mrp-versions)

## Cara menggunakannya
<a name="mrp-how-to-use-it"></a>

Untuk membuat Penyedia Terbaru, Anda perlu membuat dan mengonfigurasi toko penyedia, kemudian membuat Penyedia Terbaru yang menggunakan toko penyedia. 

[Contoh berikut menunjukkan cara membuat Penyedia Terbaru yang menggunakan MetaStore dan melindungi versi dalam tabel DynamoDB internalnya dengan materi kriptografi dari Penyedia KMS Langsung.](direct-kms-provider.md) Contoh-contoh ini menggunakan simbol [`CachingMostRecentProvider`](#mrp-versions). 

Setiap Penyedia Terbaru memiliki nama yang mengidentifikasinya CMPs dalam MetaStore tabel, pengaturan [time-to-live](#most-recent-provider-ttl)(TTL), dan pengaturan ukuran cache yang menentukan berapa banyak entri yang dapat disimpan cache. Contoh ini mengatur ukuran cache hingga 1000 entri dan TTL selama 60 detik.

------
#### [ Java ]

```
// Set the name for MetaStore's internal table
final String keyTableName = 'metaStoreTable'

// Set the Region and AWS KMS key
final String region = 'us-west-2'
final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

// Set the TTL and cache size
final long ttlInMillis = 60000;
final long cacheSize = 1000;

// Name that identifies the MetaStore's CMPs in the provider store
final String materialName = 'testMRP'

// Create an internal DynamoDB client for the MetaStore
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build();

// Create an internal Direct KMS Provider for the MetaStore
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kms, keyArn);

// Create an item encryptor for the MetaStore,
// including the Direct KMS Provider
final DynamoDBEncryptor keyEncryptor = DynamoDBEncryptor.getInstance(kmsProv);

// Create the MetaStore
final MetaStore metaStore = new MetaStore(ddb, keyTableName, keyEncryptor);

//Create the Most Recent Provider
final CachingMostRecentProvider cmp = new CachingMostRecentProvider(metaStore, materialName, ttlInMillis, cacheSize);
```

------
#### [ Python ]

```
# Designate an AWS KMS key
kms_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

# Set the name for MetaStore's internal table
meta_table_name = 'metaStoreTable'

# Name that identifies the MetaStore's CMPs in the provider store
material_name = 'testMRP'

# Create an internal DynamoDB table resource for the MetaStore
meta_table = boto3.resource('dynamodb').Table(meta_table_name)

# Create an internal Direct KMS Provider for the MetaStore
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
    
# Create the MetaStore with the Direct KMS Provider
meta_store = MetaStore(
    table=meta_table,
    materials_provider=kms_cmp
)

# Create a Most Recent Provider using the MetaStore
#    Sets the TTL (in seconds) and cache size (# entries)
most_recent_cmp = MostRecentProvider(
    provider_store=meta_store,
    material_name=material_name,
    version_ttl=60.0,
    cache_size=1000
)
```

------

## Cara kerjanya
<a name="mrp-how-it-works"></a>

Penyedia Terbaru didapat CMPs dari toko penyedia. Kemudian, penyedia ini menggunakan CMP untuk menghasilkan bahan kriptografi yang dikembalikan ke enkriptor item.

### Tentang Penyedia Terbaru
<a name="about-mrp"></a>

Penyedia Terbaru mendapatkan [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) dari [penyimpanan penyedia](DDBEC-legacy-concepts.md#provider-store). Kemudian, penyedia ini menggunakan CMP untuk menghasilkan bahan kriptografi yang akan dikembalikan. Setiap Penyedia Terbaru dikaitkan dengan satu toko penyedia, tetapi toko penyedia dapat memasok CMPs ke beberapa penyedia di beberapa host.

Penyedia Terbaru dapat digunakan dengan CMP yang kompatibel dari toko penyedia. Ia meminta bahan enkripsi atau dekripsi dari CMP dan mengembalikan output ke enkriptor item. Ia tidak melakukan operasi kriptografis apa pun.

Untuk meminta CMP dari toko penyedia, Penyedia Terbaru memasok nama bahan dan versi CMP yang ada yang hendak digunakan. Untuk bahan enkripsi, Penyedia Terbaru selalu meminta versi maksimum (“terbaru”). Untuk bahan dekripsi, ia meminta versi CMP yang digunakan untuk membuat bahan enkripsi, seperti yang ditunjukkan dalam diagram berikut.

![\[Penyedia Terbaru\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/most-recent-provider-1.png)


Penyedia Terbaru menyimpan versi CMPs yang dikembalikan oleh toko penyedia dalam cache Last Recent Used (LRU) lokal di memori. Cache memungkinkan Penyedia Terbaru untuk mendapatkan CMPs yang dibutuhkan tanpa memanggil toko penyedia untuk setiap item. Anda dapat menghapus cache sesuai permintaan.

Penyedia Terbaru menggunakan [time-to-livenilai](#most-recent-provider-ttl) yang dapat dikonfigurasi yang dapat Anda sesuaikan berdasarkan karakteristik aplikasi Anda.

### Tentang MetaStore
<a name="about-metastore"></a>

Anda dapat menggunakan Penyedia Terbaru dengan toko penyedia apa pun, termasuk toko penyedia kustom yang kompatibel. Klien Enkripsi DynamoDB mencakup MetaStore, implementasi aman yang dapat Anda konfigurasi dan sesuaikan.

A *MetaStore*adalah [toko penyedia](DDBEC-legacy-concepts.md#provider-store) yang membuat dan mengembalikan [Wrapped CMPs](wrapped-provider.md) yang dikonfigurasi dengan kunci pembungkus, membuka kunci, dan kunci penandatanganan yang diperlukan Wrapped. CMPs A MetaStore adalah opsi aman untuk Penyedia Terbaru karena Wrapped CMPs selalu menghasilkan kunci enkripsi item unik untuk setiap item. Hanya kunci pembungkus yang melindungi kunci enkripsi item dan tombol penandatanganan digunakan kembali.

Diagram berikut menunjukkan komponen MetaStore dan bagaimana berinteraksi dengan Penyedia Terbaru.

![\[A MetaStore\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/most-recent-provider-2.png)


 MetaStore Menghasilkan Wrapped CMPs, dan kemudian menyimpannya (dalam bentuk terenkripsi) dalam tabel DynamoDB internal. Kunci partisi adalah nama dari bahan Penyedia Terbaru; kunci pengurutan nomor versinya. Bahan-bahan dalam tabel dilindungi oleh DynamoDB Encryption Client internal, termasuk enkriptor item dan [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) internal.

Anda dapat menggunakan semua jenis CMP internal di Anda MetaStore, termasuk [Penyedia KMS Langsung](wrapped-provider.md), CMP Terbungkus dengan materi kriptografi yang Anda berikan, atau CMP kustom yang kompatibel. Jika CMP internal Anda MetaStore adalah Penyedia KMS Langsung, kunci pembungkus dan penandatanganan yang dapat digunakan kembali dilindungi di bawah in (). [AWS KMS key[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)AWS KMS MetaStore Panggilan AWS KMS setiap kali menambahkan versi CMP baru ke tabel internalnya atau mendapatkan versi CMP dari tabel internalnya.

### Menetapkan time-to-live nilai
<a name="most-recent-provider-ttl"></a>

Anda dapat menetapkan nilai time-to-live (TTL) untuk setiap Penyedia Terbaru yang Anda buat. Secara umum, gunakan nilai TTL terendah yang praktis untuk aplikasi Anda.

Penggunaan nilai TTL berubah dalam simbol `CachingMostRecentProvider` untuk Penyedia Terbaru. 

**catatan**  
Simbol `MostRecentProvider` untuk Penyedia Terbaru tidak lagi digunakan di versi terdukung yang lebih lama dari DynamoDB Encryption Client dan dihapus dari versi 2.0.0. Simbol ini digantikan oleh simbol `CachingMostRecentProvider`. Kami menyarankan agar Anda memperbarui kode sesegera mungkin. Untuk detail selengkapnya, lihat [Pembaruan untuk Penyedia Terbaru](#mrp-versions).

**`CachingMostRecentProvider`**  
Parameter `CachingMostRecentProvider` menggunakan nilai TTL dalam dua cara yang berbeda.   
+ TTL menentukan seberapa sering Penyedia Terbaru memeriksa toko penyedia untuk versi baru CMP. Jika versi baru tersedia, Penyedia Terbaru menggantikan CMP dan menyegarkan bahan kriptografinya. Jika tidak, ia akan terus menggunakan CMP dan bahan kriptografi saat ini.
+ TTL menentukan berapa lama CMPs cache dapat digunakan. Sebelum ia menggunakan CMP cache untuk enkripsi, Penyedia Terbaru mengevaluasi waktu dalam cache. Jika waktu cache CMP melebihi TTL, CMP dikosongkan dari cache dan Penyedia Terbaru mendapat CMP versi paling baru dari toko penyedianya.

**`MostRecentProvider`**  
Di `MostRecentProvider`, TTL menentukan seberapa sering Penyedia Terbaru memeriksa toko penyedia untuk versi baru CMP. Jika versi baru tersedia, Penyedia Terbaru menggantikan CMP dan menyegarkan bahan kriptografinya. Jika tidak, ia akan terus menggunakan CMP dan bahan kriptografi saat ini.

TTL tidak menentukan seberapa sering versi CMP baru dibuat. Anda membuat versi CMP baru dengan [memutar bahan kriptografi](#most-recent-provider-rotate).

Nilai TTL yang ideal bervariasi dengan aplikasi dan tujuan latensi dan ketersediaannya. TTL yang lebih rendah meningkatkan profil keamanan Anda dengan mengurangi waktu untuk menyimpan bahan kriptografi di dalam memori. Selain itu, TTL lebih rendah menyegarkan informasi penting lebih sering. Misalnya, jika CMP internal Anda adalah [Penyedia KMS Langsung](direct-kms-provider.md), itu memverifikasi lebih sering bahwa penelepon masih berwenang untuk menggunakan. AWS KMS key

Jika TTL terlalu singkat, panggilan berulang ke toko penyedia dapat meningkatkan biaya dan menyebabkan toko penyedia Anda untuk membatasi permintaan dari aplikasi Anda dan aplikasi lain yang juga menggunakan akun layanan Anda. Anda juga dapat memperoleh manfaat dari koordinasi TTL dengan tingkat di mana Anda memutar bahan kriptografi. 

Selama pengujian, variasikan ukuran TTL dan cache di bawah beban kerja yang berbeda sampai Anda menemukan konfigurasi yang pas untuk aplikasi Anda serta standar keamanan dan performa Anda.

### Memutar bahan kriptografi
<a name="most-recent-provider-rotate"></a>

Ketika Penyedia Terbaru membutuhkan bahan enkripsi, ia selalu menggunakan versi terbaru dari CMP yang dikenalnya. Frekuensi yang diperiksa untuk versi yang lebih baru ditentukan oleh nilai [time-to-live](#most-recent-provider-ttl)(TTL) yang Anda tetapkan saat Anda mengonfigurasi Penyedia Terbaru. 

Ketika TTL kedaluwarsa, Penyedia Terbaru memeriksa toko penyedia untuk versi CMP lebih baru. Jika ada yang tersedia, Provider Terbaru mendapatkannya dan menggantikan CMP dalam cache-nya. Ia menggunakan CMP ini dan bahan kriptografi sampai menemukan bahwa toko penyedia memiliki versi yang lebih baru.

Untuk memberi tahu toko penyedia untuk membuat versi baru dari CMP untuk Penyedia Terbaru, panggil operasi Buat Penyedia Baru toko penyedia dengan nama bahan Penyedia Terbaru. Toko penyedia membuat CMP baru dan menyimpan salinan terenkripsi dalam penyimpanan internal dengan nomor versi yang lebih besar. (Hal ini juga mengembalikan CMP, tetapi Anda dapat membuangnya.) Akibatnya, lain kali Penyedia Terbaru menanyakan toko penyedia untuk nomor versi maksimumnya CMPs, ia mendapatkan nomor versi baru yang lebih besar, dan menggunakannya dalam permintaan berikutnya ke toko untuk melihat apakah versi baru CMP telah dibuat.

Anda dapat menjadwalkan panggilan Buat Penyedia Baru berdasarkan waktu, jumlah item atau atribut yang diproses, atau metrik lain yang masuk akal untuk aplikasi Anda.

### Dapatkan bahan enkripsi
<a name="most-recent-provider-encrypt"></a>

Penyedia Terbaru menggunakan proses berikut, ditunjukkan dalam diagram ini, untuk mendapatkan bahan enkripsi yang kembali ke enkriptor item. Output bergantung pada jenis CMP yang dikembalikan toko penyedia. Penyedia Terbaru dapat menggunakan toko penyedia yang kompatibel, termasuk MetaStore yang disertakan dalam Klien Enkripsi DynamoDB.

![\[Input, pemrosesan, dan output dari Penyedia Terbaru di DynamoDB Encryption Client\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/most-recent-provider-provider-store.png)


Saat Anda membuat Penyedia Terbaru menggunakan [`CachingMostRecentProvider`simbol](#mrp-versions), Anda menentukan toko penyedia, nama untuk Penyedia Terbaru, dan nilai [time-to-live](#most-recent-provider-ttl)(TTL). Anda juga dapat secara opsional menentukan ukuran cache, yang menentukan jumlah maksimum bahan kriptografi yang dapat ditempatkan di cache.

Ketika enkriptor item meminta Penyedia Terbaru untuk bahan enkripsi, Penyedia Terbaru dimulai dengan mencari cache untuk versi terbaru dari CMP.
+ Jika ia menemukan versi terbaru CMP dalam cache dan CMP tidak melebihi nilai TTL, Penyedia Terbaru menggunakan CMP untuk menghasilkan bahan enkripsi. Kemudian, ia mengembalikan bahan enkripsi ke enkriptor item. Operasi ini tidak memerlukan panggilan ke toko penyedia.
+ Jika versi terbaru dari CMP tidak berada dalam cache, atau jika berada dalam cache tetapi telah melebihi nilai TTL, Penyedia Terbaru meminta CMP dari toko penyedia. Permintaan tersebut mencakup nama bahan Penyedia Terbaru dan nomor versi maksimum yang diketahui.

  1. Toko penyedia mengembalikan CMP dari penyimpanan tetap. Jika toko penyedia adalah a MetaStore, ia mendapatkan CMP Wrapped terenkripsi dari tabel DynamoDB internalnya dengan menggunakan nama materi Penyedia Terbaru sebagai kunci partisi dan nomor versi sebagai kunci pengurutan. MetaStore Menggunakan enkripsi item internal dan CMP internal untuk mendekripsi CMP Wrapped. Kemudian, ia mengembalikan CMP plaintext ke Penyedia Terbaru. Jika CMP internal adalah [Penyedia KMS Langsung](direct-kms-provider.md), langkah ini mencakup panggilan ke [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

  1. CMP menambahkan bidang `amzn-ddb-meta-id` ke [deskripsi bahan aktual](DDBEC-legacy-concepts.md#legacy-material-description). Nilainya adalah nama bahan dan versi CMP dalam tabel internalnya. Toko penyedia mengembalikan CMP ke Penyedia Terbaru.

  1. Penyedia Terbaru menyimpan cache CMP dalam memori.

  1. Penyedia Terbaru menggunakan CMP untuk menghasilkan bahan enkripsi. Kemudian, ia mengembalikan bahan enkripsi ke enkriptor item.

### Dapatkan bahan dekripsi
<a name="most-recent-provider-decrypt"></a>

Ketika enkriptor item meminta Penyedia Terbaru untuk bahan dekripsi, Penyedia Terbaru menggunakan proses berikut untuk mendapatkan dan mengembalikannya.

1. Penyedia Terbaru meminta toko penyedia untuk nomor versi bahan kriptografi yang digunakan untuk mengenkripsi item. Ia meneruskan deskripsi bahan aktual dari [atribut deskripsi bahan](DDBEC-legacy-concepts.md#legacy-material-description) dari item. 

1. Toko penyedia mendapatkan nomor versi CMP pengenkripsi dari bidang `amzn-ddb-meta-id` di deskripsi bahan aktual dan mengembalikannya ke Penyedia Terbaru.

1. Penyedia Terbaru mencari cache untuk versi CMP yang digunakan untuk mengenkripsi dan menandatangani item.
+ Jika menemukan versi CMP yang cocok ada di cache dan CMP belum melebihi [nilai time-to-live (TTL)](#most-recent-provider-ttl), Penyedia Terbaru menggunakan CMP untuk menghasilkan bahan dekripsi. Kemudian, ia mengembalikan bahan dekripsi ke enkriptor item. Operasi ini tidak memerlukan panggilan ke toko penyedia atau CMP lainnya.
+ Jika versi CMP yang cocok tidak ada dalam cache-nya, atau jika cache AWS KMS key telah melebihi nilai TTL-nya, Penyedia Terbaru meminta CMP dari toko penyedianya. Ia mengirimkan nama bahan dan nomor versi CMP pengenkripsi dalam permintaan.

  1. Toko penyedia mencari penyimpanan tetap untuk CMP dengan menggunakan nama Penyedia Terbaru sebagai kunci partisi dan nomor versi sebagai kunci pengurutan.
     + Jika nama dan nomor versi tidak berada dalam penyimpanan tetap, toko penyedia akan memunculkan pengecualian. Jika toko penyedia digunakan untuk menghasilkan CMP, CMP harus disimpan dalam penyimpanan tetap, kecuali jika itu sengaja dihapus.
     + Jika CMP dengan nama yang cocok dan nomor versi berada dalam penyimpanan tetap toko penyedia, toko penyedia mengembalikan CMP yang ditentukan untuk Penyedia Terbaru. 

       Jika toko penyedia adalah a MetaStore, ia mendapatkan CMP terenkripsi dari tabel DynamoDB-nya. Kemudian, ia menggunakan bahan kriptografi dari CMP internal untuk mendekripsi CMP terenkripsi sebelum mengembalikan CMP ke Penyedia Terbaru. Jika CMP internal adalah [Penyedia KMS Langsung](direct-kms-provider.md), langkah ini mencakup panggilan ke [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS).

  1. Penyedia Terbaru menyimpan cache CMP dalam memori.

  1. Penyedia Terbaru menggunakan CMP untuk menghasilkan bahan dekripsi. Kemudian, ia mengembalikan bahan dekripsi ke enkriptor item.

## Pembaruan untuk Penyedia Terbaru
<a name="mrp-versions"></a>

Simbol untuk Penyedia Terbaru diubah dari `MostRecentProvider` ke `CachingMostRecentProvider`. 

**catatan**  
Simbol `MostRecentProvider`, yang mewakili Penyedia Terbaru, tidak lagi digunakan dalam versi 1.15 DynamoDB Encryption Client untuk Java dan versi 1.3 DynamoDB DynamoDB Encryption Client untuk Python dan dihapus dari versi 2.0.0 DynamoDB Encryption Client di kedua implementasi bahasa. Sebagai gantinya, gunakan `CachingMostRecentProvider`.

`CachingMostRecentProvider` menerapkan perubahan berikut:
+ `CachingMostRecentProvider`Secara berkala menghapus materi kriptografi dari memori ketika waktu mereka dalam memori melebihi nilai yang dikonfigurasi [time-to-live (TTL)](#most-recent-provider-ttl). 

  `MostRecentProvider` mungkin menyimpan bahan kriptografi dalam memori selama masa proses. Akibatnya, Penyedia Terbaru mungkin tidak menyadari perubahan otorisasi. Ia mungkin menggunakan kunci enkripsi setelah izin pemanggil untuk menggunakannya dicabut. 

  Jika Anda tidak dapat memperbarui ke versi baru ini, Anda bisa mendapatkan efek yang sama dengan secara berkala memanggil metode `clear()` pada cache. Metode ini secara manual membuang isi cache dan membutuhkan Penyedia Terbaru untuk meminta CMP baru dan bahan kriptografi baru. 
+ `CachingMostRecentProvider` juga mencakup pengaturan ukuran cache yang memberi Anda lebih banyak kontrol atas cache.

Untuk memperbarui ke `CachingMostRecentProvider`, Anda harus mengubah nama simbol dalam kode Anda. Dalam semua hal lainnya, `CachingMostRecentProvider` kompatibel mundur sepenuhnya dengan `MostRecentProvider`. Anda tidak perlu mengenkripsi ulang item tabel.

Namun, `CachingMostRecentProvider` menghasilkan lebih banyak panggilan ke infrastruktur kunci yang mendasarinya. Ini memanggil toko penyedia setidaknya sekali dalam setiap interval time-to-live (TTL). Aplikasi dengan banyak aktif CMPs (karena rotasi yang sering) atau aplikasi dengan armada besar kemungkinan besar sensitif terhadap perubahan ini. 

Sebelum merilis kode yang diperbarui, uji secara menyeluruh untuk memastikan bahwa panggilan yang lebih sering tidak mengganggu aplikasi Anda atau menyebabkan pembatasan oleh layanan tempat penyedia Anda bergantung, seperti AWS Key Management Service () atau AWS KMS Amazon DynamoDB. Untuk mengurangi masalah kinerja, sesuaikan ukuran cache dan time-to-live dari `CachingMostRecentProvider` berdasarkan karakteristik kinerja yang Anda amati. Untuk panduan, lihat [Menetapkan time-to-live nilai](#most-recent-provider-ttl).

# Penyedia Materi Statis
<a name="static-provider"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

*Penyedia Bahan Statis* (CMP Statis) adalah [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang sangat sederhana yang ditujukan untuk pengujian, proof-of-concept demonstrasi, dan kompatibilitas warisan.

Untuk menggunakan Static CMP guna mengenkripsi item tabel, Anda menyediakan kunci enkripsi simetris [Standar Enkripsi Lanjutan](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) dan kunci penandatanganan atau pasangan kunci. Anda harus menyediakan kunci yang sama untuk mendekripsi item yang dienkripsi. Static CMP tidak melakukan operasi kriptografis apa pun. Sebaliknya, Static CMP meneruskan kunci enkripsi yang Anda sediakan ke enkriptor item tanpa perubahan. Enkriptor item mengenkripsi item secara langsung dengan kunci enkripsi. Kemudian, ia menggunakan kunci penandatanganan secara langsung untuk menandatanganinya. 

Karena Static CMP tidak menghasilkan materi kriptografis yang unik, semua item tabel yang Anda proses dienkripsi dengan kunci enkripsi yang sama dan ditandatangani dengan kunci penandatanganan yang sama. Ketika Anda menggunakan kunci yang sama untuk mengenkripsi nilai atribut pada banyak item atau menggunakan kunci yang sama atau pasangan kunci untuk menandatangani semua item, ada risiko Anda melebihi batas kriptografis kunci. 

**catatan**  
[Penyedia Statis Asimetris](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html) di pustaka Java bukan penyedia statis. Itu hanya memasok konstruktor alternatif untuk [Wrapped CMP](wrapped-provider.md). Penyedia ini aman untuk penggunaan produksi, tetapi Anda harus menggunakan Wrapped CMP secara langsung bila memungkinkan.

CMP Statis adalah salah satu dari beberapa [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) yang didukung oleh Klien Enkripsi DynamoDB. Untuk informasi tentang yang lain CMPs, lihat[Penyedia bahan kriptografi](crypto-materials-providers.md).

**Misalnya kode, lihat:**
+ Java: [SymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java)

**Topics**
+ [Cara menggunakannya](#static-cmp-how-to-use)
+ [Cara kerjanya](#static-cmp-how-it-works)

## Cara menggunakannya
<a name="static-cmp-how-to-use"></a>

Untuk membuat penyedia statis, masukkan kunci enkripsi atau pasangan kunci dan kunci penandatanganan atau pasangan kunci. Anda perlu menyediakan materi kunci untuk mengenkripsi dan mendekripsi item tabel.

------
#### [ Java ]

```
// To encrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Signing key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);

// To decrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Verification key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);
```

------
#### [ Python ]

```
# You can provide encryption materials, decryption materials, or both
encrypt_keys = EncryptionMaterials(
    encryption_key = ...,
    signing_key = ...
)

decrypt_keys = DecryptionMaterials(
    decryption_key = ...,
    verification_key = ...
)

static_cmp = StaticCryptographicMaterialsProvider(
    encryption_materials=encrypt_keys
    decryption_materials=decrypt_keys
)
```

------

## Cara kerjanya
<a name="static-cmp-how-it-works"></a>

Provider Statis meneruskan enkripsi dan kunci penandatanganan yang Anda masukkan ke enkriptor item, di mana kunci itu digunakan secara langsung untuk mengenkripsi dan menandatangani item tabel Anda. Kecuali Anda menyediakan kunci yang berbeda untuk setiap item, kunci yang sama digunakan untuk setiap item.

![\[Input, pengolahan, dan output dari Penyedia Materi Statis di DynamoDB Encryption Client\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/staticCMP.png)


### Dapatkan materi enkripsi
<a name="static-cmp-get-encryption-materials"></a>

Bagian ini menjelaskan secara terperinci input, output, dan pengolahan Penyedia Materi Statis (Static CMP) ketika menerima permintaan materi enkripsi.

**Input** (dari aplikasi)
+ Kunci enkripsi – Harus berupa kunci simetris, seperti kunci [Standar Enkripsi Lanjutan](https://tools.ietf.org/html/rfc3394.html) (AES). 
+ Kunci penandatanganan – Bisa berupa kunci simetris atau pasangan kunci asimetris. 

**Input** (dari enkriptor item)
+ [Konteks enkripsi DynamoDB](concepts.md#encryption-context)

**Output** (untuk enkriptor item)
+ Kunci enkripsi diteruskan sebagai input.
+ Kunci penandatanganan diteruskan sebagai input.
+ Deskripsi materi aktual: [Deskripsi materi yang diminta](DDBEC-legacy-concepts.md#legacy-material-description), jika ada, tanpa perubahan.

### Dapatkan materi dekripsi
<a name="static-cmp-get-decryption-materials"></a>

Bagian ini menjelaskan secara terperinci input, output, dan pengolahan Penyedia Materi Statis (Static CMP) ketika menerima permintaan materi dekripsi.

Meskipun mencakup metode berbeda untuk mendapatkan materi enkripsi dan mendapatkan materi dekripsi, perilakunya sama. 

**Input** (dari aplikasi)
+ Kunci enkripsi – Harus berupa kunci simetris, seperti kunci [Standar Enkripsi Lanjutan](https://tools.ietf.org/html/rfc3394.html) (AES). 
+ Kunci penandatanganan – Bisa berupa kunci simetris atau pasangan kunci asimetris. 

**Input** (dari enkriptor item)
+ [Konteks enkripsi DynamoDB](concepts.md#encryption-context) (tidak digunakan)

**Output** (untuk enkriptor item)
+ Kunci enkripsi diteruskan sebagai input.
+ Kunci penandatanganan diteruskan sebagai input.

# Bahasa pemrograman Amazon DynamoDB Encryption Client yang tersedia
<a name="programming-languages"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Amazon DynamoDB Encryption Client tersedia dalam bahasa pemrograman berikut. Pustaka spesifik-bahasa bervariasi, tetapi implementasi yang dihasilkan dapat dioperasikan. Misalnya, Anda dapat mengenkripsi (dan menandatangani) item dengan klien Java dan mendekripsi item dengan klien Python.

Untuk informasi lebih lanjut, lihat topik terkait.

**Topics**
+ [Java](java.md)
+ [Python](python.md)

# Amazon DynamoDB Encryption Client untuk Java
<a name="java"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Topik ini menjelaskan cara menginstal dan menggunakan Amazon DynamoDB Encryption Client untuk Java. Untuk detail tentang pemrograman dengan Klien Enkripsi DynamoDB, lihat contoh [Java](java-examples.md), contoh di repositori [ GitHubaktif](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples), dan aws-dynamodb-encryption-java [Javadoc](https://aws.github.io/aws-dynamodb-encryption-java/) untuk Klien Enkripsi DynamoDB.

**catatan**  
Versi 1. *x*. *x* dari Klien Enkripsi DynamoDB untuk Java sedang [end-of-support dalam](what-is-database-encryption-sdk.md#support) fase efektif Juli 2022. Tingkatkan ke versi yang lebih baru sesegera mungkin.

**Topics**
+ [Prasyarat](#java-prerequisites)
+ [Penginstalan](#java-installation)
+ [Menggunakan Amazon DynamoDB Encryption Client untuk Java](java-using.md)
+ [Contoh Java](java-examples.md)

## Prasyarat
<a name="java-prerequisites"></a>

Sebelum Anda menginstal Amazon DynamoDB Encryption Client untuk Java, pastikan Anda memiliki prasyarat berikut.

**Lingkungan pengembangan Java**  
Anda akan membutuhkan Java 8 atau yang lebih baru. Di situs web Oracle, buka [Unduhan Java SE](https://www.oracle.com/java/technologies/downloads/), kemudian unduh dan instal Java SE Development Kit (JDK).  
Jika Anda menggunakan Oracle JDK, Anda juga harus mengunduh dan menginstal [File Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy](http://www.oracle.com/java/technologies/javase-jce8-downloads.html).

**AWS SDK untuk Java**  
Klien Enkripsi DynamoDB memerlukan modul DynamoDB bahkan jika aplikasi Anda tidak berinteraksi dengan DynamoDB. AWS SDK untuk Java Anda dapat menginstal seluruh SDK atau modul ini saja. Jika Anda menggunakan Maven, tambahkan `aws-java-sdk-dynamodb` ke file `pom.xml` Anda.   
Untuk informasi selengkapnya tentang menginstal dan mengonfigurasi AWS SDK untuk Java, lihat [AWS SDK untuk Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/getting-started.html).

## Penginstalan
<a name="java-installation"></a>

Anda dapat menginstal Amazon DynamoDB Encryption Client untuk Java dengan cara berikut.

**Secara manual**  
Untuk menginstal Klien Enkripsi Amazon DynamoDB untuk Java, kloning atau unduh repositori. [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/) GitHub 

**Menggunakan Apache Maven**  
Amazon DynamoDB Encryption Client untuk Java tersedia melalui [Apache Maven](https://maven.apache.org/) dengan definisi dependensi berikut.  

```
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-dynamodb-encryption-java</artifactId>
  <version>version-number</version>
</dependency>
```

Setelah Anda menginstal SDK, mulailah dengan melihat kode contoh dalam panduan ini dan [DynamoDB](https://aws.github.io/aws-dynamodb-encryption-java/) Encryption Client Javadoc aktif. GitHub

# Menggunakan Amazon DynamoDB Encryption Client untuk Java
<a name="java-using"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Topik ini menjelaskan beberapa fitur DynamoDB Encryption Client di Java yang mungkin tidak ditemukan dalam implementasi bahasa pemrograman lainnya. 

[https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples)



**Topics**
+ [Enkriptor item](#attribute-encryptor)
+ [Mengonfigurasi perilaku penyimpanan](#save-behavior)
+ [Tindakan atribut di Java](#attribute-actions-java)
+ [Menimpa nama tabel](#override-table-name)

## Enkripsi item: AttributeEncryptor dan Dynamo DBEncryptor
<a name="attribute-encryptor"></a>

[Klien Enkripsi DynamoDB di Java memiliki [dua enkripsi item](DDBEC-legacy-concepts.md#item-encryptor): Dynamo tingkat rendah dan. DBEncryptor [AttributeEncryptor](#attribute-encryptor)](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) 

`AttributeEncryptor`Ini adalah kelas pembantu yang membantu Anda menggunakan [Dynamo DBMapper di AWS SDK untuk Java dengan di Klien](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html) Enkripsi DynamoDB. `DynamoDB Encryptor` Saat Anda menggunakan `AttributeEncryptor` dengan `DynamoDBMapper`, item tersebut secara transparan mengenkripsi dan menandatangani item Anda saat Anda menyimpannya. Item ini juga secara transparan memverifikasi dan mendekripsi item Anda ketika Anda memuatnya.

## Mengonfigurasi perilaku penyimpanan
<a name="save-behavior"></a>

Anda dapat menggunakan `AttributeEncryptor` dan `DynamoDBMapper` untuk menambah atau mengganti item tabel dengan atribut yang ditandatangani saja atau dienkripsi dan ditandatangani. Untuk tugas-tugas ini, kami sarankan Anda mengonfigurasinya untuk menggunakan perilaku penyimpanan `PUT`, seperti yang ditunjukkan dalam contoh berikut. Jika tidak, Anda mungkin tidak dapat mendekripsi data. 

```
DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build();
DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
```

Jika Anda menggunakan perilaku penyimpanan default, yang hanya memperbarui atribut yang dimodelkan dalam item tabel, atribut yang tidak dimodelkan tidak disertakan dalam tanda tangan, dan tidak diubah oleh penulisan tabel. Akibatnya, pada pembacaan semua atribut nanti, tanda tangan tidak akan memvalidasi, karena tidak menyertakan atribut yang tidak dimodelkan.

Anda juga dapat menggunakan perilaku penyimpanan `CLOBBER`. Perilaku ini identik dengan perilaku penyimpanan `PUT` kecuali pada bagian perilaku ini menonaktifkan penguncian optimis dan menimpa item dalam tabel.

Untuk mencegah kesalahan tanda tangan, Klien Enkripsi DynamoDB melempar pengecualian runtime jika `AttributeEncryptor` digunakan dengan `DynamoDBMapper` yang tidak dikonfigurasi dengan perilaku penyimpanan atau. `CLOBBER` `PUT`

Untuk melihat kode ini digunakan dalam contoh, lihat [Menggunakan Dynamo DBMapper](java-examples.md#java-example-dynamodb-mapper) dan [AwsKmsEncryptedObjectcontoh.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java) di `aws-dynamodb-encryption-java` repositori di. GitHub

## Tindakan atribut di Java
<a name="attribute-actions-java"></a>

[Tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) menentukan mana nilai atribut yang dienkripsi dan ditandatangani, mana yang hanya ditandatangani, dan mana yang diabaikan. [Metode yang Anda gunakan untuk menentukan tindakan atribut tergantung pada apakah Anda menggunakan `DynamoDBMapper` dan`AttributeEncryptor`, atau Dynamo tingkat yang lebih rendah. DBEncryptor](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html)

**penting**  
Setelah Anda menggunakan tindakan atribut untuk mengenkripsi item tabel Anda, menambahkan atau menghapus atribut dari model data Anda dapat menyebabkan kesalahan validasi tanda tangan yang mencegah Anda mendekripsi data Anda. Untuk penjelasan detail, lihat [Mengubah model data Anda](data-model.md).

### Tindakan atribut untuk Dynamo DBMapper
<a name="attribute-action-java-mapper"></a>

Saat Anda menggunakan `DynamoDBMapper` dan `AttributeEncryptor`, Anda menggunakan anotasi untuk menentukan tindakan atribut. DynamoDB Encryption Client menggunakan [anotasi atribut DynamoDB standar](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Annotations.html) yang menentukan jenis atribut untuk menentukan cara melindungi atribut. Secara default, semua atribut dienkripsi dan ditandatangani kecuali kunci utama, yang ditandatangani tetapi tidak dienkripsi.

**catatan**  
Jangan mengenkripsi nilai atribut dengan [anotasi DBVersion Atribut @Dynamo](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html), meskipun Anda dapat (dan harus) menandatanganinya. Jika dilakukan, syarat yang menggunakan nilai tersebut akan memiliki efek yang tidak diinginkan.

```
// Attributes are encrypted and signed
@DynamoDBAttribute(attributeName="Description")

// Partition keys are signed but not encrypted
@DynamoDBHashKey(attributeName="Title")

// Sort keys are signed but not encrypted
@DynamoDBRangeKey(attributeName="Author")
```

Untuk menentukan pengecualian, gunakan anotasi enkripsi yang didefinisikan dalam DynamoDB Encryption Client untuk Java. Jika Anda menentukannya di tingkat kelas, pengecualian itu menjadi nilai default untuk kelas tersebut.

```
// Sign only
@DoNotEncrypt

// Do nothing; not encrypted or signed
@DoNotTouch
```

Sebagai contoh, anotasi ini menandatangani tetapi tidak mengenkripsi atribut `PublicationYear`, dan tidak mengenkripsi atau menandatangani nilai atribut `ISBN`.

```
// Sign only (override the default)
@DoNotEncrypt
@DynamoDBAttribute(attributeName="PublicationYear")

// Do nothing (override the default)
@DoNotTouch
@DynamoDBAttribute(attributeName="ISBN")
```

### Tindakan atribut untuk Dynamo DBEncryptor
<a name="attribute-action-default"></a>

Untuk menentukan tindakan atribut saat Anda menggunakan [Dynamo DBEncryptor](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) secara langsung, buat `HashMap` objek di mana pasangan nama-nilai mewakili nama atribut dan tindakan yang ditentukan. 

Nilai-nilai yang valid adalah untuk tindakan atribut yang didefinisikan dalam jenis `EncryptionFlags` yang disebutkan. Anda dapat menggunakan `ENCRYPT` dan `SIGN` secara bersamaan, menggunakan `SIGN` saja, atau tidak menggunakan keduanya. Namun, jika Anda menggunakan `ENCRYPT` saja, DynamoDB Encryption Client menyebabkan kesalahan. Anda tidak dapat mengenkripsi atribut yang tidak Anda tanda tangani.

```
ENCRYPT
SIGN
```

**Awas**  
Jangan mengenkripsi atribut kunci utama. Atribut tersebut harus tetap dalam plaintext sehingga DynamoDB dapat menemukan item tanpa memindai keseluruhan tabel.

Jika Anda menentukan kunci utama dalam konteks enkripsi dan kemudian menetapkan `ENCRYPT` dalam tindakan atribut untuk atribut kunci utama, DynamoDB Encryption Client membuat pengecualian.

Misalnya, kode Java berikut membuat sebuah `actions` HashMap yang mengenkripsi dan menandatangani semua atribut dalam item. `record` Pengecualiannya adalah atribut kunci partisi dan kunci penyortiran, yang ditandatangani tetapi tidak dienkripsi, dan atribut `test`, yang tidak ditandatangani atau dienkripsi.

```
final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN);
final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN);
final Map<String, Set<EncryptionFlags>> actions = new HashMap<>();

for (final String attributeName : record.keySet()) {
  switch (attributeName) {
    case partitionKeyName: // no break; falls through to next case
    case sortKeyName:
      // Partition and sort keys must not be encrypted, but should be signed
      actions.put(attributeName, signOnly);
      break;
    case "test":
      // Don't encrypt or sign
      break;
    default:
      // Encrypt and sign everything else
      actions.put(attributeName, encryptAndSign);
      break;
  }
}
```

Kemudian, ketika Anda memanggil metode [encryptRecord](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html#encryptRecord-java.util.Map-java.util.Map-com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext-) `DynamoDBEncryptor`, tentukan peta sebagai nilai parameter `attributeFlags`. Sebagai contoh, panggilan untuk `encryptRecord` ini menggunakan peta `actions`.

```
// Encrypt the plaintext record
final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
```

## Menimpa nama tabel
<a name="override-table-name"></a>

Pada DynamoDB Encryption Client, nama tabel DynamoDB adalah elemen [konteks enkripsi DynamoDB](concepts.md#encryption-context) yang diteruskan ke metode enkripsi dan dekripsi. Ketika Anda mengenkripsi atau menandatangani item tabel, konteks enkripsi DynamoDB, termasuk nama tabel, secara kriptografis terikat pada ciphertext. Jika konteks enkripsi DynamoDB yang diteruskan ke metode dekripsi tidak cocok dengan konteks enkripsi DynamoDB yang diteruskan ke metode enkripsi, operasi dekripsi gagal.

Kadang-kadang, nama tabel berubah, seperti ketika Anda membuat cadangan tabel atau melakukan [point-in-time pemulihan](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery.html). Ketika Anda mendekripsi atau memverifikasi tanda tangan item ini, Anda harus menggunakan konteks enkripsi DynamoDB yang sama yang digunakan untuk mengenkripsi dan menandatangani item, termasuk nama tabel asli. Nama tabel saat ini tidak diperlukan. 

Saat Anda menggunakan `DynamoDBEncryptor`, Anda menyusun konteks enkripsi DynamoDB secara manual. Namun, jika Anda menggunakan `DynamoDBMapper`, `AttributeEncryptor` membuat konteks enkripsi DynamoDB untuk Anda, termasuk nama tabel saat ini. Untuk memerintahkan `AttributeEncryptor` agar membuat konteks enkripsi dengan nama tabel yang berbeda, gunakan `EncryptionContextOverrideOperator`. 

Sebagai contoh, kode berikut menciptakan instans penyedia materi kriptografis (CMP) dan `DynamoDBEncryptor`. Kemudian kode itu memanggil metode `setEncryptionContextOverrideOperator` pada `DynamoDBEncryptor`. Kode itu menggunakan operator `overrideEncryptionContextTableName`, yang menimpa satu nama tabel. Ketika dikonfigurasi dengan cara ini, `AttributeEncryptor` membuat konteks enkripsi DynamoDB yang mencakup `newTableName` menggantikan `oldTableName`. Untuk contoh lengkap, lihat [EncryptionContextOverridesWithDynamoDBMapper.java.](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/EncryptionContextOverridesWithDynamoDBMapper.java)

```
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);

encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName(
                oldTableName, newTableName));
```

Ketika Anda memanggil metode beban pada `DynamoDBMapper`, yang mendekripsi dan memverifikasi item, Anda menentukan nama tabel asli.

```
mapper.load(itemClass, DynamoDBMapperConfig.builder()
                .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName))
                .build());
```

Anda juga dapat menggunakan operator `overrideEncryptionContextTableNameUsingMap`, yang menimpa beberapa nama tabel. 

Operator penimpa nama tabel biasanya digunakan ketika mendekripsi data dan memverifikasi tanda tangan. Namun, Anda dapat menggunakannya untuk menetapkan nama tabel dalam konteks enkripsi DynamoDB dengan nilai yang berbeda saat mengenkripsi dan menandatangani.

Jangan gunakan operator penimpa nama tabel jika Anda menggunakan `DynamoDBEncryptor`. Sebaliknya, buatlah konteks enkripsi dengan nama tabel asli dan kirimkan ke metode dekripsi.

# Contoh kode untuk DynamoDB Encryption Client untuk Java
<a name="java-examples"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Contoh berikut menunjukkan cara menggunakan DynamoDB Encryption Client untuk Java guna melindungi item tabel DynamoDB dalam aplikasi Anda. Anda dapat menemukan lebih banyak contoh (dan berkontribusi sendiri) di direktori [contoh [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/)](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples)repositori di. GitHub

**Topics**
+ [Menggunakan Dynamo DBEncryptor](#java-example-ddb-encryptor)
+ [Menggunakan Dynamo DBMapper](#java-example-dynamodb-mapper)

## Menggunakan Dynamo DBEncryptor
<a name="java-example-ddb-encryptor"></a>

Contoh ini menunjukkan cara menggunakan [Dynamo](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/DynamoDBEncryptor.html) tingkat rendah DBEncryptor dengan [Direct](direct-kms-provider.md) KMS Provider. Penyedia KMS Langsung menghasilkan dan melindungi materi kriptografinya di bawah [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in AWS Key Management Service (AWS KMS) yang Anda tentukan.

Anda dapat menggunakan [penyedia materi kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang kompatibel dengan`DynamoDBEncryptor`, dan Anda dapat menggunakan Penyedia KMS Langsung dengan dan. `DynamoDBMapper` [AttributeEncryptor](java-using.md#attribute-encryptor)

**Lihat contoh kode lengkapnya**: [AwsKmsEncryptedItem.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)

Langkah 1: Buat Penyedia KMS Langsung  
Buat instance AWS KMS klien dengan wilayah yang ditentukan. Kemudian, gunakan instance klien untuk membuat instance Penyedia KMS Langsung dengan pilihan AWS KMS key Anda.   
Contoh ini menggunakan Amazon Resource Name (ARN) untuk mengidentifikasi AWS KMS key, tetapi Anda dapat menggunakan pengidentifikasi [kunci yang valid](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn).   

```
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
final String region = "us-west-2";
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

Langkah 2: Buat item  
Contoh ini mendefinisikan `record` HashMap yang mewakili item tabel sampel.  

```
final String partitionKeyName = "partition_attribute";
final String sortKeyName = "sort_attribute";

final Map<String, AttributeValue> record = new HashMap<>();
record.put(partitionKeyName, new AttributeValue().withS("value1"));
record.put(sortKeyName, new AttributeValue().withN("55"));
record.put("example", new AttributeValue().withS("data"));
record.put("numbers", new AttributeValue().withN("99"));
record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02})));
record.put("test", new AttributeValue().withS("test-value"));
```

Langkah 3: Buat Dynamo DBEncryptor  
Buat instans `DynamoDBEncryptor` dengan Penyedia KMS Langsung.  

```
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
```

Langkah 4: Buat konteks enkripsi DynamoDB  
[Konteks enkripsi DynamoDB](concepts.md#encryption-context) berisi informasi tentang struktur tabel dan bagaimana tabel itu dienkripsi dan ditandatangani. Jika Anda menggunakan `DynamoDBMapper`, `AttributeEncryptor` membuat konteks enkripsi untuk Anda.  

```
final String tableName = "testTable";

final EncryptionContext encryptionContext = new EncryptionContext.Builder()
    .withTableName(tableName)
    .withHashKeyName(partitionKeyName)
    .withRangeKeyName(sortKeyName)
    .build();
```

Langkah 5: Buat objek tindakan atribut  
[Tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) menentukan mana atribut item yang dienkripsi dan ditandatangani, mana yang hanya ditandatangani, dan mana yang tidak dienkripsi dan ditandatangani.  
Di Java, untuk menentukan tindakan atribut, Anda membuat HashMap nama atribut dan pasangan `EncryptionFlags` nilai.   
Misalnya, kode Java berikut membuat `actions` HashMap yang mengenkripsi dan menandatangani semua atribut dalam `record` item, kecuali untuk kunci partisi dan atribut kunci sortir, yang ditandatangani, tetapi tidak dienkripsi, dan `test` atribut, yang tidak ditandatangani atau dienkripsi.  

```
final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN);
final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN);
final Map<String, Set<EncryptionFlags>> actions = new HashMap<>();

for (final String attributeName : record.keySet()) {
  switch (attributeName) {
    case partitionKeyName: // fall through to the next case
    case sortKeyName:
      // Partition and sort keys must not be encrypted, but should be signed
      actions.put(attributeName, signOnly);
      break;
    case "test":
      // Neither encrypted nor signed
      break;
    default:
      // Encrypt and sign all other attributes
      actions.put(attributeName, encryptAndSign);
      break;
  }
}
```

Langkah 6: Enkripsi dan tanda tangani item  
Untuk mengenkripsi dan menandatangani item tabel, panggil metode `encryptRecord` pada instans `DynamoDBEncryptor`. Tentukan item tabel (`record`), tindakan atribut (`actions`), dan konteks enkripsi (`encryptionContext`).  

```
final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
```

Langkah 7: Masukkan item ke dalam tabel DynamoDB  
Akhirnya, letakkan item yang dienkripsi dan ditandatangani ke dalam tabel DynamoDB.  

```
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient();
ddb.putItem(tableName, encrypted_record);
```

## Menggunakan Dynamo DBMapper
<a name="java-example-dynamodb-mapper"></a>

Contoh berikut menunjukkan kepada Anda cara menggunakan kelas bantuan DynamoDB Mapper dengan [Penyedia KMS Langsung](direct-kms-provider.md). Penyedia KMS Langsung menghasilkan dan melindungi materi kriptografinya di bawah [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)in AWS Key Management Service (AWS KMS) yang Anda tentukan.

Anda dapat menggunakan [penyedia materi kriptografis](DDBEC-legacy-concepts.md#concept-material-provider) (CMP) yang kompatibel dengan `DynamoDBMapper`, dan Anda dapat menggunakan Penyedia KMS Langsung dengan `DynamoDBEncryptor` yang tingkatnya lebih rendah.

**Lihat contoh kode lengkapnya**: [AwsKmsEncryptedObject.java](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedObject.java)

Langkah 1: Buat Penyedia KMS Langsung  
Buat instance AWS KMS klien dengan wilayah yang ditentukan. Kemudian, gunakan instance klien untuk membuat instance Penyedia KMS Langsung dengan pilihan AWS KMS key Anda.   
Contoh ini menggunakan Amazon Resource Name (ARN) untuk mengidentifikasi AWS KMS key, tetapi Anda dapat menggunakan pengidentifikasi [kunci yang valid](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id).   

```
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
final String region = "us-west-2";
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
```

Langkah 2: Buat DynamoDB Encryptor dan Dynamo DBMapper  
Gunakan Penyedia KMS Langsung yang Anda buat di langkah sebelumnya untuk membuat instans [DynamoDB Encryptor](java-using.md#attribute-encryptor). Anda perlu membuat instans bagi DynamoDB Encryptor yang tingkatnya lebih rendah untuk menggunakan DynamoDB Mapper.  
Berikutnya, membuat sebuah instans dari database DynamoDB Anda dan konfigurasi mapper, dan menggunakannya untuk membuat sebuah instance dari DynamoDB Mapper.   
Saat menggunakan `DynamoDBMapper` untuk menambah atau mengedit item yang ditandatangani (atau dienkripsi dan ditandatangani), atur konfigurasinya untuk [menggunakan perilaku penympanan](java-using.md#save-behavior), seperti `PUT`, yang mencakup semua atribut, seperti yang ditunjukkan dalam contoh berikut. Jika tidak, Anda mungkin tidak dapat mendekripsi data. 

```
final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp)
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build();

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build();
DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
```

Langkah 3: Tentukan tabel DynamoDB Anda  
Selanjutnya, tentukan tabel DynamoDB Anda. Gunakan anotasi untuk menentukan [tindakan atribut](java-using.md#attribute-actions-java). Contoh ini membuat tabel DynamoDB, `ExampleTable`, dan kelas `DataPoJo` yang mewakili item tabel.   
Dalam tabel contoh ini, atribut kunci utama akan ditandatangani tetapi tidak dienkripsi. Hal ini berlaku untuk `partition_attribute`, yang dianotasikan dengan `@DynamoDBHashKey`, dan `sort_attribute`, yang dianotasikan dengan `@DynamoDBRangeKey`.   
Atribut yang dianotasikan dengan `@DynamoDBAttribute`, seperti `some numbers`, akan dienkripsi dan ditandatangani. Pengecualiannya mencakup atribut yang menggunakan anotasi enkripsi `@DoNotEncrypt` (hanya ditandatangani) atau `@DoNotTouch` (jangan dienkripsi atau ditandatangani) yang didefinisikan oleh DynamoDB Encryption Client. Sebagai contoh, karena atribut `leave me` memiliki anotasi `@DoNotTouch`, atribut ini tidak akan dienkripsi atau ditandatangani.  

```
@DynamoDBTable(tableName = "ExampleTable")
public static final class DataPoJo {
  private String partitionAttribute;
  private int sortAttribute;
  private String example;
  private long someNumbers;
  private byte[] someBinary;
  private String leaveMe;

  @DynamoDBHashKey(attributeName = "partition_attribute")
  public String getPartitionAttribute() {
    return partitionAttribute;
  }

  public void setPartitionAttribute(String partitionAttribute) {
    this.partitionAttribute = partitionAttribute;
  }

  @DynamoDBRangeKey(attributeName = "sort_attribute")
  public int getSortAttribute() {
    return sortAttribute;
  }

  public void setSortAttribute(int sortAttribute) {
    this.sortAttribute = sortAttribute;
  }

  @DynamoDBAttribute(attributeName = "example")
  public String getExample() {
    return example;
  }

  public void setExample(String example) {
    this.example = example;
  }

  @DynamoDBAttribute(attributeName = "some numbers")
  public long getSomeNumbers() {
    return someNumbers;
  }

  public void setSomeNumbers(long someNumbers) {
    this.someNumbers = someNumbers;
  }

  @DynamoDBAttribute(attributeName = "and some binary")
  public byte[] getSomeBinary() {
    return someBinary;
  }

  public void setSomeBinary(byte[] someBinary) {
    this.someBinary = someBinary;
  }

  @DynamoDBAttribute(attributeName = "leave me")
  @DoNotTouch
  public String getLeaveMe() {
    return leaveMe;
  }

  public void setLeaveMe(String leaveMe) {
    this.leaveMe = leaveMe;
  }

  @Override
  public String toString() {
    return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute="
        + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers
        + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]";
  }
}
```

Langkah 4: Enkripsi dan simpan item tabel  
Sekarang, ketika Anda membuat item tabel dan menggunakan DynamoDB Mapper untuk menyimpannya, item secara otomatis dienkripsi dan ditandatangani sebelum ditambahkan ke tabel.  
Contoh ini mendefinisikan item tabel yang disebut `record`. Sebelum disimpan dalam tabel, atributnya dienkripsi dan ditandatangani berdasarkan anotasi di kelas `DataPoJo`. Dalam hal ini, semua atribut kecuali `PartitionAttribute`, `SortAttribute`, dan `LeaveMe` dienkripsi dan ditandatangani. `PartitionAttribute` dan `SortAttributes` hanya ditandatangani. Atribut `LeaveMe` tidak dienkripsi atau ditandatangani.  
Untuk mengenkripsi dan menandatangani item `record`, dan kemudian menambahkannya ke `ExampleTable`, panggil metode `save` kelas `DynamoDBMapper`. Karena DynamoDB Mapper Anda dikonfigurasi untuk menggunakan perilaku penyimpanan `PUT`, item tersebut menggantikan semua item dengan kunci utama yang sama, bukan memperbaruinya. Hal ini memastikan tanda tangan cocok dan Anda dapat mendekripsi item ketika Anda mendapatkannya dari tabel.  

```
DataPoJo record = new DataPoJo();
record.setPartitionAttribute("is this");
record.setSortAttribute(55);
record.setExample("data");
record.setSomeNumbers(99);
record.setSomeBinary(new byte[]{0x00, 0x01, 0x02});
record.setLeaveMe("alone");

mapper.save(record);
```

# DynamoDB Encryption Client untuk Python
<a name="python"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Topik ini menjelaskan cara menginstal dan menggunakan DynamoDB Encryption Client untuk Python. Anda dapat menemukan kode di [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)repositori GitHub, termasuk [kode sampel](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples) lengkap dan teruji untuk membantu Anda memulai.

**catatan**  
Versi 1. *x*. *x* dan 2. *x*. *x* [dari Klien Enkripsi DynamoDB untuk Python sedang end-of-support dalam fase efektif Juli 2022.](what-is-database-encryption-sdk.md#support) Tingkatkan ke versi yang lebih baru sesegera mungkin.

**Topics**
+ [Prasyarat](#python-prerequisites)
+ [Penginstalan](#python-installation)
+ [Menggunakan DynamoDB Encryption Client untuk Python](python-using.md)
+ [Contoh Python](python-examples.md)

## Prasyarat
<a name="python-prerequisites"></a>

Sebelum Anda menginstal Amazon DynamoDB Encryption Client untuk Python, pastikan Anda memiliki prasyarat berikut.

**Versi Python yang didukung**  
Python 3.8 atau yang lebih baru diperlukan oleh Klien Enkripsi Amazon DynamoDB untuk Python versi 3.3.0 dan yang lebih baru. Untuk mengunduh Python, lihat [Unduh Python](https://www.python.org/downloads/).  
Versi sebelumnya dari Amazon DynamoDB Encryption Client untuk Python mendukung Python 2.7 dan Python 3.4 dan yang lebih baru, tetapi kami menyarankan Anda menggunakan versi terbaru dari DynamoDB Encryption Client.

**Alat instalasi pip untuk Python**  
Python 3.6 dan yang lebih baru menyertakan **pip**, meskipun Anda mungkin ingin memutakhirkannya. Untuk informasi selengkapnya tentang meningkatkan atau menginstal pip, lihat [Instalasi](https://pip.pypa.io/en/latest/installation/) dalam dokumentasi **pip**.

## Penginstalan
<a name="python-installation"></a>

Gunakan **pip** untuk menginstal Amazon DynamoDB Encryption Client, seperti yang ditunjukkan dalam contoh berikut.

**Pasang versi terbaru**  

```
pip install dynamodb-encryption-sdk
```

Untuk detail lebih lanjut tentang menggunakan **pip** untuk menginstal dan meng-upgrade paket, lihat [Menginstal Paket](https://packaging.python.org/tutorials/installing-packages/).

DynamoDB Encryption Client memerlukan [pustaka kriptografi](https://cryptography.io/en/latest/) di semua platform. Semua versi **pip** menginstal dan membangun **kriptografi** pada pip. **Windows** 8.1 dan versi lebih baru menginstal dan membangun **kriptografi** di Linux. Jika Anda menggunakan versi sebelumnya dari **pip** dan lingkungan Linux Anda tidak memiliki alat yang diperlukan untuk membangun **pustaka** kriptografi, Anda perlu menginstalnya. Untuk informasi selengkapnya, lihat [Membangun kriptografi di Linux](https://cryptography.io/en/latest/installation/#building-cryptography-on-linux).

Anda bisa mendapatkan versi pengembangan terbaru dari DynamoDB Encryption Client dari [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)repositori. GitHub

Setelah Anda menginstal DynamoDB Encryption Client, mulailah dengan melihat kode contoh Python dalam panduan ini.

# Menggunakan DynamoDB Encryption Client untuk Python
<a name="python-using"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Topik ini menjelaskan beberapa fitur DynamoDB Encryption Client untuk Python yang mungkin tidak ditemukan dalam implementasi bahasa pemrograman lainnya. Fitur-fitur ini dirancang untuk membuatnya lebih mudah untuk menggunakan DynamoDB Encryption Client dengan cara yang paling aman. Jika Anda tidak memiliki kasus penggunaan yang tidak biasa, kami sarankan Anda menggunakannya.

[Untuk detail tentang pemrograman dengan Klien Enkripsi DynamoDB, lihat contoh [Python](python-examples.md) dalam panduan ini, contoh di repositori GitHub aktif, dan dokumentasi [Python aws-dynamodb-encryption-python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/) untuk Klien Enkripsi DynamoDB.](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples)

**Topics**
+ [Kelas pembantu klien](#python-helpers)
+ [TableInfo kelas](#table-info)
+ [Tindakan atribut di Python](#python-attribute-actions)

## Kelas pembantu klien
<a name="python-helpers"></a>

DynamoDB Encryption Client untuk Python termasuk beberapa kelas pembantu klien yang mencerminkan kelas-kelas Boto 3 untuk DynamoDB. Kelas-kelas pembantu ini dirancang untuk membuatnya lebih mudah untuk menambahkan enkripsi dan penandatanganan ke aplikasi DynamoDB yang ada dan menghindari masalah yang paling umum, sebagai berikut:
+ Mencegah Anda mengenkripsi kunci utama dalam item Anda, baik dengan menambahkan tindakan penggantian untuk kunci utama ke [AttributeActions](#python-attribute-actions)objek, atau dengan melempar pengecualian jika `AttributeActions` objek Anda secara eksplisit memberi tahu klien untuk mengenkripsi kunci utama. Jika tindakan default di objek `AttributeActions` Anda adalah `DO_NOTHING`, kelas pembantu klien menggunakan tindakan tersebut untuk kunci primer. Jika tidak, mereka menggunakan `SIGN_ONLY`.
+ Buat [TableInfo objek](#python-helpers) dan isi konteks [enkripsi DynamoDB berdasarkan panggilan ke DynamoDB](concepts.md#encryption-context). Ini membantu untuk memastikan bahwa konteks enkripsi DynamoDB Anda akurat dan klien dapat mengidentifikasi kunci utama.
+ Metode Support, seperti `put_item` dan `get_item`, yang secara transparan mengenkripsi dan mendekripsi tabel item ketika Anda menulis atau membaca dari tabel DynamoDB. Hanya metode `update_item` yang tidak didukung.

Anda dapat menggunakan kelas pembantu klien,alih-alih berinteraksi langsung dengan [enkriptor item](DDBEC-legacy-concepts.md#item-encryptor) yang tingkatnya lebih rendah. Gunakan kelas-kelas ini kecuali Anda perlu mengatur opsi lanjutan dalam enkriptor item.

Kelas pembantu klien meliputi:
+ [EncryptedTable](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/table.html#module-dynamodb_encryption_sdk.encrypted.table)untuk aplikasi yang menggunakan sumber daya [Tabel](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#table) di DynamoDB untuk memproses satu tabel pada satu waktu.
+ [EncryptedResource](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/resource.html)untuk aplikasi yang menggunakan kelas [Service Resource](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#service-resource) di DynamoDB untuk pemrosesan batch.
+ [EncryptedClient](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/client.html)untuk aplikasi yang menggunakan [klien tingkat rendah di DynamoDB](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#client).

Untuk menggunakan kelas pembantu klien, pemanggil harus memiliki izin untuk memanggil operasi DynamoDB pada tabel target [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html).

## TableInfo kelas
<a name="table-info"></a>

[TableInfo](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/tools/structures.html#dynamodb_encryption_sdk.structures.TableInfo)Kelas adalah kelas pembantu yang mewakili tabel DynamoDB, lengkap dengan bidang untuk kunci utama dan indeks sekunder. Ini membantu Anda untuk mendapatkan informasi akurat dan real-time tentang tabel.

Jika Anda menggunakan[kelas pembantu klien](#python-helpers), itu menciptakan dan menggunakan objek `TableInfo` untuk Anda. Jika tidak, Anda dapat membuat satu secara eksplisit. Sebagai contoh, lihat [Gunakan enkriptor item](python-examples.md#python-example-item-encryptor).

Ketika Anda memanggil `refresh_indexed_attributes` metode pada `TableInfo` objek, itu mengisi nilai properti objek dengan memanggil operasi DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). Kueri tabel jauh lebih dapat diandalkan daripada nama indeks hard-coding. Kelas `TableInfo` juga mencakup sebuah properti `encryption_context_values` yang menyediakan nilai-nilai yang diperlukan untuk [konteks enkripsi DynamoDB](concepts.md#encryption-context). 

Untuk menggunakan `refresh_indexed_attributes` metode ini, pemanggil harus memiliki izin untuk memanggil operasi [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)DynamoDB pada tabel target.

## Tindakan atribut di Python
<a name="python-attribute-actions"></a>

[Tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) memberitahukan kepada enkriptor item tentang tindakan yang dilakukan pada setiap atribut item. Untuk menentukan tindakan atribut di Python, buat objek `AttributeActions` dengan tindakan default dan pengecualian untuk atribut tertentu. Nilai-nilai yang valid adalah untuk tindakan atribut yang didefinisikan dalam jenis `CryptoAction` yang disebutkan.

**penting**  
Setelah Anda menggunakan tindakan atribut untuk mengenkripsi item tabel Anda, menambahkan atau menghapus atribut dari model data Anda dapat menyebabkan kesalahan validasi tanda tangan yang mencegah Anda mendekripsi data Anda. Untuk penjelasan detail, lihat [Mengubah model data Anda](data-model.md).

```
DO_NOTHING = 0
SIGN_ONLY = 1
ENCRYPT_AND_SIGN = 2
```

Misalnya, objek `AttributeActions` ini menetapkan `ENCRYPT_AND_SIGN` sebagai default untuk semua atribut, dan menentukan pengecualian untuk atribut `ISBN` dan `PublicationYear`.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={
        'ISBN': CryptoAction.DO_NOTHING,
        'PublicationYear': CryptoAction.SIGN_ONLY
    }
)
```

Jika Anda menggunakan sebuah [kelas pembantu klien](#python-helpers), Anda tidak perlu menentukan tindakan atribut untuk atribut kunci primer. Kelas pembantu klien mencegah Anda mengenkripsi kunci utama Anda.

Jika Anda tidak menggunakan kelas pembantu klien dan tindakan default adalah `ENCRYPT_AND_SIGN`, Anda harus menentukan tindakan untuk kunci primer. Tindakan yang direkomendasikan untuk kunci primer adalah `SIGN_ONLY`. Untuk mempermudahnya, gunakan metode `set_index_keys`, yang menggunakan SIGN\$1ONLY untuk kunci primer, atau DO\$1NOTHING, ketika itu adalah tindakan default.

**Awas**  
Jangan mengenkripsi atribut kunci utama. Atribut tersebut harus tetap dalam plaintext sehingga DynamoDB dapat menemukan item tanpa memindai keseluruhan tabel.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
)
actions.set_index_keys(*table_info.protected_index_keys())
```

# Contoh kode untuk DynamoDB Encryption Client untuk Python
<a name="python-examples"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Contoh berikut menunjukkan cara menggunakan DynamoDB Encryption Client untuk Python guna melindungi data DynamoDB dalam aplikasi Anda. Anda dapat menemukan lebih banyak contoh (dan berkontribusi sendiri) di direktori [contoh [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)](https://github.com/aws/aws-dynamodb-encryption-python/tree/master/examples)repositori di. GitHub

**Topics**
+ [Gunakan kelas pembantu EncryptedTable klien](#python-example-table)
+ [Gunakan enkriptor item](#python-example-item-encryptor)

## Gunakan kelas pembantu EncryptedTable klien
<a name="python-example-table"></a>

Contoh berikut menunjukkan cara menggunakan [Provider KMS Langsung](direct-kms-provider.md)dengan [kelas pembantu klien](python-using.md#python-helpers) `EncryptedTable`. Contoh ini menggunakan [penyedia bahan kriptografi](DDBEC-legacy-concepts.md#concept-material-provider) yang sama seperti contoh [Gunakan enkriptor item](#python-example-item-encryptor) berikut. Namun, contoh tersebut menggunakan kelas `EncryptedTable` alih-alih berinteraksi langsung dengan [enkriptor item](DDBEC-legacy-concepts.md#item-encryptor) yang tingkatnya lebih rendah.

Dengan membandingkan contoh-contoh ini, Anda dapat melihat pekerjaan yang kelas pembantu klien untuk Anda. Hal ini mencakup pembuatan [konteks enkripsi DynamoDB](concepts.md#encryption-context) dan memastikan atribut kunci primer selalu ditandatangani, tetapi tidak pernah dienkripsi. Untuk membuat konteks enkripsi dan menemukan kunci utama, kelas pembantu klien memanggil operasi DynamoDB [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html). Untuk menjalankan kode ini, Anda harus memiliki izin untuk memanggil operasi ini.

**Lihat contoh kode lengkap**: [aws\$1kms\$1encrypted\$1table.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py)

Langkah 1: Buat Tabel  
Mulailah dengan membuat sebuah instans dari tabel DynamoDB standar dengan nama tabel.  

```
table_name='test-table'
table = boto3.resource('dynamodb').Table(table_name)
```

Langkah 2: Buat penyedia bahan kriptografi  
Buat instans [penyedia bahan kriptografi](crypto-materials-providers.md) (CMP) yang Anda pilih.  
Contoh ini menggunakan [Penyedia KMS Langsung](direct-kms-provider.md), tetapi Anda dapat menggunakan CMP mana pun yang kompatibel. Untuk membuat Penyedia KMS Langsung, tentukan. [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) Contoh ini menggunakan Amazon Resource Name (ARN) dari AWS KMS key, tetapi Anda dapat menggunakan pengenal kunci yang valid.  

```
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
```

Langkah 3: Buat objek tindakan atribut  
[Tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) memberitahukan kepada enkriptor item tentang tindakan yang dilakukan pada setiap atribut item. Objek `AttributeActions` dalam contoh ini mengenkripsi dan menandatangani semua item kecuali untuk atribut `test`, yang diabaikan.  
Jangan tentukan tindakan atribut untuk atribut kunci primer saat Anda menggunakan kelas pembantu klien. Kelas `EncryptedTable` menandatangani, tetapi tidak pernah mengenkripsi, atribut kunci utama.  

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={'test': CryptoAction.DO_NOTHING}
)
```

Langkah 4: Buat tabel terenkripsi  
Membuat tabel dienkripsi menggunakan tabel standar, Penyedia KMS Langsung, dan tindakan atribut. Langkah ini melengkapi konfigurasi.   

```
encrypted_table = EncryptedTable(
    table=table,
    materials_provider=kms_cmp,
    attribute_actions=actions
)
```

Langkah 5: Masukkan item plaintext ke dalam tabel  
Ketika Anda memanggil metode `put_item` di `encrypted_table`, item tabel Anda secara transparan dienkripsi, ditandatangani, dan ditambahkan ke tabel DynamoDB Anda.  
Pertama, tentukan item tabel.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
Lalu, taruh di tabel.  

```
encrypted_table.put_item(Item=plaintext_item)
```

Untuk mendapatkan item dari daftar tabel DynamoDB dalam bentuk terenkripsi, panggil metode `get_item` di objek `table`. Untuk mendapatkan item didekripsi, panggil metode `get_item` di objek `encrypted_table`.

## Gunakan enkriptor item
<a name="python-example-item-encryptor"></a>

Contoh ini menunjukkan kepada Anda bagaimana untuk berinteraksi langsung dengan [enkriptor item](DDBEC-legacy-concepts.md#item-encryptor) di DynamoDB Encryption Client ketika mengenkripsi item tabel, alih-alih menggunakan [kelas pembantu klien](python-using.md#python-helpers) yang berinteraksi dengan enkriptor item untuk Anda. 

Bila Anda menggunakan teknik ini, Anda membuat konteks enkripsi DynamoDB dan konfigurasi objek (`CryptoConfig`) secara manual. Anda juga mengenkripsi item dalam satu panggilan dan menempatkannya dalam tabel DynamoDB Anda dalam panggilan terpisah. Hal ini memungkinkan Anda untuk menyesuaikan panggilan `put_item` Anda dan menggunakan DynamoDB Encryption Client untuk mengenkripsi dan menandatangani data terstruktur yang tidak pernah dikirim ke DynamoDB.

Contoh ini menggunakan [Penyedia KMS Langsung](direct-kms-provider.md), tetapi Anda dapat menggunakan CMP kompatibel.

**Lihat contoh kode lengkap**: [aws\$1kms\$1encrypted\$1table.py](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

Langkah 1: Buat Tabel  
Mulailah dengan membuat sebuah instans dari sumber daya tabel DynamoDB standar dengan nama tabel.  

```
table_name='test-table'
table = boto3.resource('dynamodb').Table(table_name)
```

Langkah 2: Buat penyedia bahan kriptografi  
Buat instans [penyedia bahan kriptografi](crypto-materials-providers.md) (CMP) yang Anda pilih.  
Contoh ini menggunakan [Penyedia KMS Langsung](direct-kms-provider.md), tetapi Anda dapat menggunakan CMP mana pun yang kompatibel. Untuk membuat Penyedia KMS Langsung, tentukan. [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) Contoh ini menggunakan Amazon Resource Name (ARN) dari AWS KMS key, tetapi Anda dapat menggunakan pengenal kunci yang valid.  

```
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
```

Langkah 3: Gunakan TableInfo kelas pembantu  
Untuk mendapatkan informasi tentang tabel dari DynamoDB, buat instance dari [TableInfo](python-using.md#python-helpers)kelas helper. Apabila Anda bekerja secara langsung dengan enkriptor item, Anda perlu membuat instans `TableInfo` dan memanggil metodenya. [Kelas pembantu klien](python-using.md#python-helpers) melakukan ini untuk Anda.  
`refresh_indexed_attributes`Metode `TableInfo` menggunakan operasi [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)DynamoDB untuk mendapatkan informasi real-time dan akurat tentang tabel. Ini termasuk kunci primer dan indeks sekunder lokal dan global. Pemanggil perlu memiliki izin untuk memanggil `DescribeTable`.  

```
table_info = TableInfo(name=table_name)
table_info.refresh_indexed_attributes(table.meta.client)
```

Langkah 4: Buat konteks enkripsi DynamoDB  
[Konteks enkripsi DynamoDB](concepts.md#encryption-context) berisi informasi tentang struktur tabel dan bagaimana tabel itu dienkripsi dan ditandatangani. Contoh ini menciptakan konteks enkripsi DynamoDB secara eksplisit, karena berinteraksi dengan enkriptor item. [Kelas pembantu klien](python-using.md#python-helpers) membuat konteks enkripsi DynamoDB untuk Anda.   
Untuk mendapatkan kunci partisi dan kunci sortir, Anda dapat menggunakan properti kelas [TableInfo](python-using.md#python-helpers)pembantu.   

```
index_key = {
    'partition_attribute': 'value1',
    'sort_attribute': 55
}

encryption_context = EncryptionContext(
    table_name=table_name,
    partition_key_name=table_info.primary_index.partition,
    sort_key_name=table_info.primary_index.sort,
    attributes=dict_to_ddb(index_key)
)
```

Langkah 5: Buat objek tindakan atribut  
[Tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) memberitahukan kepada enkriptor item tentang tindakan yang dilakukan pada setiap atribut item. Objek `AttributeActions` dalam contoh ini mengenkripsi dan menandatangani semua item kecuali atribut kunci utama, yang ditandatangani, tetapi tidak dienkripsi, dan atribut `test`, yang diabaikan.  
Ketika Anda berinteraksi langsung dengan item enkripsi dan tindakan default Anda adalah `ENCRYPT_AND_SIGN`, Anda harus menentukan tindakan alternatif untuk kunci primer. Anda dapat menggunakan metode `set_index_keys`, yang menggunakan `SIGN_ONLY` untuk kunci primer, atau menggunakan `DO_NOTHING` jika itu adalah tindakan default.  
Untuk menentukan kunci utama, contoh ini menggunakan kunci indeks dalam [TableInfo](python-using.md#python-helpers)objek, yang diisi oleh panggilan ke DynamoDB. Teknik ini lebih aman daripada nama kunci primer hard-coding.  

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={'test': CryptoAction.DO_NOTHING}
)
actions.set_index_keys(*table_info.protected_index_keys())
```

Langkah 6: Buat konfigurasi untuk item  
Untuk mengonfigurasi Klien Enkripsi DynamoDB, gunakan objek yang baru saja Anda buat dalam [CryptoConfig](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/encrypted/config.html)konfigurasi untuk item tabel. Kelas pembantu klien membuat CryptoConfig untuk Anda.   

```
crypto_config = CryptoConfig(
    materials_provider=kms_cmp,
    encryption_context=encryption_context,
    attribute_actions=actions
)
```

Langkah 7: Enkripsi item  
Langkah ini mengenkripsi dan menandai item, tetapi tidak memasukkannya ke dalam tabel DynamoDB.   
Ketika Anda menggunakan kelas pembantu klien, item Anda secara transparan dienkripsi dan ditandatangani, dan kemudian ditambahkan ke tabel DynamoDB Anda ketika Anda memanggil metode `put_item` kelas pembantu. Ketika Anda menggunakan item enkripsi secara langsung, enkripsi dan tindakan independen.  
Pertama, buat item plaintext.  

```
plaintext_item = {
    'partition_attribute': 'value1',
    'sort_key': 55,
    'example': 'data',
    'numbers': 99,
    'binary': Binary(b'\x00\x01\x02'),
    'test': 'test-value'
}
```
Kemudian, enkripsi dan tanda tangani. Metode `encrypt_python_item` memerlukan objek konfigurasi `CryptoConfig`.  

```
encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
```

Langkah 8: Masukkan item ke dalam tabel DynamoDB  
Akhirnya, letakkan item yang dienkripsi dan ditandatangani ke dalam tabel DynamoDB.  

```
table.put_item(Item=encrypted_item)
```

Untuk melihat item yang dienkripsi, panggil metode `get_item` pada objek `table` asli, bukan dari objek `encrypted_table`. Item didapatkan dari tabel DynamoDB tanpa memverifikasi dan mendekripsinya.

```
encrypted_item = table.get_item(Key=partition_key)['Item']
```

Gambar berikut menunjukkan bagian dari contoh item tabel yang dienkripsi dan ditandatangani.

Nilai atribut terenkripsi adalah data biner. Nama dan nilai atribut kunci primer (`partition_attribute` dan `sort_attribute`) dan atribut `test` tetap dalam plaintext. Output juga menunjukkan atribut yang berisi tanda tangan (`*amzn-ddb-map-sig*`) dan [atribut deskripsi materi](DDBEC-legacy-concepts.md#legacy-material-description) (`*amzn-ddb-map-desc*`).

![\[Kutipan dari item yang dienkripsi dan ditandatangani\]](http://docs.aws.amazon.com/id_id/database-encryption-sdk/latest/devguide/images/encrypted-item-closeup.png)


# Mengubah model data Anda
<a name="data-model"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Setiap kali mengenkripsi atau mendekripsi item, Anda perlu memberikan [tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) yang memberi tahu DynamoDB Encryption Client atribut mana yang perlu dienkripsi dan ditandatangani, atribut mana yang perlu ditanandatangani (tapi tidak dienkripsi), dan mana yang diabaikan. Atribut tindakan tidak disimpan dalam item yang dienkripsi dan DynamoDB Encryption Client tidak memperbarui tindakan atribut Anda secara otomatis.

**penting**  
Klien Enkripsi DynamoDB tidak mendukung enkripsi data tabel DynamoDB yang sudah ada dan tidak terenkripsi.

Setiap kali Anda mengubah model data Anda, yaitu, ketika Anda menambahkan atau menghapus atribut dari item tabel Anda, Anda berisiko mendapatkan masalah. Jika tindakan atribut yang Anda tentukan tidak mencakup semua atribut dalam item, item tersebut mungkin tidak dienkripsi dan ditandatangani sesuai keinginan Anda. Lebih penting lagi, jika tindakan atribut yang Anda berikan saat mendekripsi item berbeda dari tindakan atribut yang Anda berikan saat mengenkripsi item, verifikasi tanda tangan mungkin gagal. 

Sebagai contoh, jika tindakan atribut yang digunakan untuk mengenkripsi item memberitahu untuk menandatangani atribut `test`, tanda tangan dalam item akan mencakup atribut `test`. Namun, jika tindakan atribut yang digunakan untuk mendekripsi item tidak memperhitungkan atribut `test`, verifikasi akan gagal karena klien akan mencoba untuk memverifikasi tanda tangan yang tidak termasuk atribut `test`. 

Ini adalah masalah ketika beberapa aplikasi membaca dan menulis item DynamoDB sama karena DynamoDB Encryption Client harus menghitung tanda tangan yang sama untuk item di semua aplikasi. Ini juga masalah untuk aplikasi terdistribusi karena perubahan dalam tindakan atribut harus menyebar ke semua host. Bahkan jika tabel DynamoDB Anda diakses oleh satu host dalam satu proses, membangun proses praktek terbaik akan membantu mencegah kesalahan jika proyek pernah menjadi lebih kompleks.

Untuk menghindari kesalahan validasi tanda tangan yang mencegah Anda membaca item tabel Anda, gunakan panduan berikut.
+ [Menambahkan atribut](#add-attribute) — Jika atribut baru mengubah tindakan atribut Anda, sepenuhnya men-deploy perubahan tindakan atribut sebelum menyertakan atribut baru dalam item.
+ [Menghapus atribut](#remove-attribute) — Jika Anda berhenti menggunakan atribut dalam item Anda, jangan mengubah tindakan atribut Anda. 
+ Mengubah tindakan - Setelah Anda telah menggunakan konfigurasi tindakan atribut untuk mengenkripsi item tabel Anda, Anda tidak dapat dengan aman mengubah tindakan default atau tindakan untuk atribut yang ada tanpa mereenkripsi setiap item dalam tabel Anda.

Kesalahan validasi tanda tangan bisa sangat sulit diatasi, jadi pendekatan terbaik adalah mencegahnya. 

**Topics**
+ [Menambahkan atribut](#add-attribute)
+ [Menghapus atribut](#remove-attribute)

## Menambahkan atribut
<a name="add-attribute"></a>

Saat menambahkan atribut baru ke item tabel, Anda mungkin perlu mengubah tindakan atribut Anda. Untuk mencegah kesalahan validasi tanda tangan, sebaiknya Anda menerapkan perubahan ini dalam proses dua tahap. Verifikasi bahwa tahap pertama selesai sebelum memulai tahap kedua.

1. Ubah tindakan atribut di semua aplikasi yang membaca atau menulis ke tabel. Deploy perubahan ini dan konfirmasi bahwa pembaruan telah disebarkan ke semua host tujuan. 

1. Tulis nilai ke atribut baru dalam item tabel Anda.

Pendekatan dua tahap ini memastikan bahwa semua aplikasi dan host memiliki tindakan atribut yang sama, dan akan menghitung tanda tangan yang sama, sebelum menemui atribut baru. Hal ini penting bahkan ketika tindakan untuk atribut adalah *Jangan lakukan apa-apa* (jangan mengenkripsi atau menandatangani), karena default untuk beberapa enkriptor adalah mengenkripsi dan menandatangani.

Contoh berikut menunjukkan kode untuk tahap pertama dalam proses ini. Atribut item baru ditambahkan, `link`, yang menyimpan link ke item tabel lain. Karena link ini harus tetap dalam teks biasa, contoh menetapkan itu tindakan tanda-saja. Setelah sepenuhnya men-deploy perubahan ini dan kemudian memverifikasi bahwa semua aplikasi dan host memiliki tindakan atribut baru, Anda dapat mulai menggunakan atribut `link` dalam item tabel Anda.

------
#### [ Java DynamoDB Mapper ]

Saat menggunakan `DynamoDB Mapper` dan `AttributeEncryptor` secara default, semua atribut dienkripsi dan ditandatangani kecuali kunci utama, yang ditandatangani tetapi tidak dienkripsi. Untuk menentukan tindakan tanda-saja, gunakan anotasi `@DoNotEncrypt`. 

Contoh ini menggunakan anotasi `@DoNotEncrypt` untuk atribut `link` baru.

```
@DynamoDBTable(tableName = "ExampleTable")
public static final class DataPoJo {
  private String partitionAttribute;
  private int sortAttribute;
  private String link;

  @DynamoDBHashKey(attributeName = "partition_attribute")
  public String getPartitionAttribute() {
    return partitionAttribute;
  }
    
  public void setPartitionAttribute(String partitionAttribute) {
    this.partitionAttribute = partitionAttribute;
  }

  @DynamoDBRangeKey(attributeName = "sort_attribute")
  public int getSortAttribute() {
    return sortAttribute;
  }

  public void setSortAttribute(int sortAttribute) {
    this.sortAttribute = sortAttribute;
  }

  @DynamoDBAttribute(attributeName = "link")
  @DoNotEncrypt
  public String getLink() {
    return link;
  }

  public void setLink(String link) {
    this.link = link;
  }

  @Override
  public String toString() {
    return "DataPoJo [partitionAttribute=" + partitionAttribute + ",
        sortAttribute=" + sortAttribute + ",
        link=" + link + "]";
  }
}
```

------
#### [ Java DynamoDB encryptor ]

 Dalam enkriptor DynamoDB di level yang lebih rendah, Anda mesti menetapkan tindakan untuk setiap atribut. Contoh ini menggunakan pernyataan switch yang mana default adalah `encryptAndSign` dan pengecualian dispesifikasikan untuk kunci partisi, kunci penyortiran, dan atribut `link` baru. Dalam contoh ini, jika kode atribut tautan tidak sepenuhnya di-deploy sebelum digunakan, atribut tautan akan dienkripsi dan ditandatangani oleh beberapa aplikasi, tetapi hanya ditandatangani oleh orang lain.

```
for (final String attributeName : record.keySet()) {
    switch (attributeName) {
        case partitionKeyName:
            // fall through to the next case
        case sortKeyName:
            // partition and sort keys must be signed, but not encrypted
            actions.put(attributeName, signOnly);
            break;
        case "link":
            // only signed
            actions.put(attributeName, signOnly);
            break;
        default:
            // Encrypt and sign all other attributes
            actions.put(attributeName, encryptAndSign);
            break;
    }
}
```

------
#### [ Python ]

Dalam DynamoDB Encryption Client untuk Python, Anda dapat menentukan tindakan default untuk semua atribut dan kemudian menentukan pengecualian. 

Jika Anda menggunakan sebuah [kelas pembantu klien](python-using.md#python-helpers) Python, Anda tidak perlu menentukan tindakan atribut untuk atribut kunci primer. Kelas pembantu klien mencegah Anda mengenkripsi kunci utama Anda. Namun, jika Anda tidak menggunakan kelas pembantu klien, Anda harus mengatur tindakan SIGN\$1ONLY pada kunci partisi dan kunci sortir Anda. Jika Anda secara tidak sengaja mengenkripsi kunci partisi atau sortir Anda, Anda tidak akan dapat memulihkan data tanpa pemindaian tabel lengkap.

Contoh ini menentukan pengecualian untuk atribut `link` baru, yang mendapat tindakan `SIGN_ONLY`.

```
actions = AttributeActions(
    default_action=CryptoAction.ENCRYPT_AND_SIGN,
    attribute_actions={
      'example': CryptoAction.DO_NOTHING,  
      'link': CryptoAction.SIGN_ONLY
    }
)
```

------

## Menghapus atribut
<a name="remove-attribute"></a>

Jika Anda tidak lagi membutuhkan atribut dalam item yang telah dienkripsi dengan DynamoDB Encryption Client, Anda dapat berhenti menggunakan atribut. Namun, jangan menghapus atau mengubah tindakan untuk atribut tersebut. Jika Anda melakukannya, dan kemudian menemukan item dengan atribut itu, tanda tangan yang dihitung untuk item tidak akan cocok dengan tanda tangan asli, dan validasi tanda tangan akan gagal.

Meskipun Anda mungkin tergoda untuk menghapus semua jejak atribut dari kode Anda, tambahkan komentar bahwa item tidak lagi digunakan, alih-alih menghapusnya. Bahkan jika Anda melakukan pemindaian tabel secara penuh untuk menghapus semua instans atribut, item yang dienkripsi dengan atribut yang mungkin disembunyikan atau dalam proses di suatu tempat di konfigurasi Anda.

# Memecahkan masalah dalam aplikasi DynamoDB Encryption Client Anda
<a name="troubleshooting"></a>

**catatan**  
Pustaka enkripsi sisi klien kami [diubah namanya menjadi AWS Database Encryption SDK](DDBEC-rename.md). Topik berikut memberikan informasi tentang versi 1. *x* —2. *x* dari DynamoDB Encryption Client untuk Java dan versi 1. *x* —3. *x* dari Klien Enkripsi DynamoDB untuk Python. Untuk informasi selengkapnya, lihat [SDK Enkripsi AWS Database untuk dukungan versi DynamoDB](legacy-dynamodb-encryption-client.md#legacy-support).

Bagian ini menjelaskan masalah yang mungkin Anda alami saat menggunakan DynamoDB Encryption Client dan menawarkan saran-saran untuk menyelesaikannya.

Untuk memberikan umpan balik tentang Klien Enkripsi DynamoDB, ajukan masalah di [aws-dynamodb-encryption-java](https://github.com/aws/aws-dynamodb-encryption-java/)atau repositori. [aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/) GitHub 

Untuk memberikan umpan balik tentang dokumentasi ini, gunakan tautan umpan balik pada halaman mana pun.

**Topics**
+ [Akses ditolak](#kms-permissions)
+ [Verifikasi tanda tangan gagal](#change-data-model)
+ [Masalah dengan tabel global versi lama](#fix-global-tables)
+ [Kinerja yang buruk dari Penyedia Terbaru](#mrp-ttl-delay)

## Akses ditolak
<a name="kms-permissions"></a>

**Masalah**: Aplikasi Anda ditolak aksesnya ke sumber daya yang dibutuhkan.

**Saranan**: Pelajari tentang izin yang diperlukan dan tambahkan izin tersebut ke konteks keamanan di mana aplikasi Anda dijalankan.

**Detail**

Untuk menjalankan aplikasi yang menggunakan pustaka DynamoDB Encryption Client, pemanggil harus memiliki izin untuk menggunakan komponennya. Jika tidak, aksesnya ke elemen yang dibutuhkan akan ditolak. 
+ DynamoDB Encryption Client tidak memerlukan akun Amazon Web Services (AWS) atau tergantung pada layanan AWS mana pun. [Namun, jika aplikasi Anda menggunakan AWS, Anda memerlukan Akun AWS dan [pengguna yang memiliki izin](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html) untuk menggunakan akun tersebut.](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)
+ DynamoDB Encryption Client tidak memerlukan Amazon DynamoDB. Namun, Jika aplikasi yang menggunakan klien membuat tabel DynamoDB, menempatkan item ke dalam tabel, atau mendapatkan item dari tabel, pemanggil harus memiliki izin untuk menggunakan operasi DynamoDB yang diperlukan dalam Anda. Akun AWS Untuk detailnya, lihat [topik kontrol akses](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html) di *Panduan Developer Amazon DynamoDB*.
+ Jika aplikasi Anda menggunakan [class client helper](python-using.md#python-helpers) di DynamoDB Encryption Client untuk Python, pemanggil harus memiliki izin untuk memanggil operasi DynamoDB. [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)
+ Klien Enkripsi DynamoDB tidak AWS Key Management Service memerlukan ().AWS KMS Namun, jika aplikasi Anda menggunakan [Penyedia Materi KMS Langsung](direct-kms-provider.md), atau menggunakan [Penyedia Terbaru dengan toko penyedia](most-recent-provider.md) yang menggunakan AWS KMS, penelepon harus memiliki izin untuk menggunakan AWS KMS [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)dan [Mendekripsi](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) operasi.

## Verifikasi tanda tangan gagal
<a name="change-data-model"></a>

**Masalah**: Item tidak dapat didekripsi karena verifikasi tanda tangan gagal. Item juga mungkin tidak dienkripsi dan ditandatangani sesuai keinginan Anda.

**Saranan**: Pastikan bahwa tindakan atribut yang Anda berikan mencakup semua atribut dalam item. Saat mendekripsi item, pastikan untuk memberikan tindakan atribut yang sesuai dengan tindakan yang digunakan untuk mengenkripsi item.

**Detail**

[Tindakan atribut](DDBEC-legacy-concepts.md#legacy-attribute-actions) yang Anda berikan memberi tahu DynamoDB Encryption Client atribut mana yang perlu dienkripsi dan ditandatangani, atribut mana yang perlu ditanandatangani (tapi tidak dienkripsi), dan mana yang diabaikan. 

Jika tindakan atribut yang Anda tentukan tidak mencakup semua atribut dalam item, item mungkin tidak dienkripsi dan ditandatangani sesuai keinginan Anda. Jika tindakan atribut yang Anda berikan saat mendekripsi item berbeda dari tindakan atribut yang Anda berikan saat mengenkripsi item, verifikasi tanda tangan mungkin gagal. Ini adalah masalah khusus untuk aplikasi terdistribusi di mana tindakan atribut baru mungkin tidak disebarkan ke semua host.

Kesalahan validasi tanda tangan sulit untuk diselesaikan. Untuk membantu mencegahnya, lakukan tindakan pencegahan ekstra saat mengubah model data Anda. Lihat perinciannya di [Mengubah model data Anda](data-model.md).

## Masalah dengan tabel global versi lama
<a name="fix-global-tables"></a>

**Masalah**: Item dalam tabel global Amazon DynamoDB versi lama tidak dapat didekripsi karena verifikasi tanda tangan gagal.

**Saran**: Tetapkan tindakan atribut agar bidang replikasi yang dicadangkan tidak dienkripsi atau ditandatangani.

**Detail**

Anda dapat menggunakan Klien Enkripsi DynamoDB dengan tabel global [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html). Kami menyarankan Anda menggunakan tabel global dengan kunci [KMS Multi-wilayah dan mereplikasi kunci](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) KMS ke semua Wilayah AWS tempat tabel global direplikasi.

Dimulai dengan tabel global [versi 2019.11.21](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html), Anda dapat menggunakan tabel global dengan Klien Enkripsi DynamoDB tanpa konfigurasi khusus. Namun, jika Anda menggunakan tabel global [versi 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html), Anda harus memastikan bahwa bidang replikasi yang dicadangkan tidak dienkripsi atau ditandatangani.

[Jika Anda menggunakan tabel global versi 2017.11.29, Anda harus mengatur tindakan atribut untuk atribut berikut `DO_NOTHING` di [`@DoNotTouch`Java](java-using.md#attribute-actions-java) atau Python.](python-using.md#python-attribute-actions)
+ `aws:rep:deleting`
+ `aws:rep:updatetime`
+ `aws:rep:updateregion`

Jika Anda menggunakan versi lain dari tabel global, tidak ada tindakan yang diperlukan.

## Kinerja yang buruk dari Penyedia Terbaru
<a name="mrp-ttl-delay"></a>

**Masalah**: Aplikasi Anda kurang responsif, terutama setelah diperbarui ke versi DynamoDB Encryption Client yang lebih baru.

**Saran**: Sesuaikan time-to-live nilai dan ukuran cache.

**Detail**

Penyedia Terbaru dirancang untuk meningkatkan kinerja aplikasi yang menggunakan DynamoDB Encryption Client dengan mengizinkan penggunaan kembali secara terbatas materi kriptografis. Bila Anda mengonfigurasi Penyedia Terbaru untuk aplikasi Anda, Anda harus menyeimbangkan peningkatan kinerja dengan masalah keamanan yang timbul dari caching dan penggunaan kembali. 

Dalam versi yang lebih baru dari DynamoDB Encryption Client, time-to-live nilai (TTL) menentukan berapa lama penyedia materi kriptografi cache () dapat digunakan. CMPs TTL juga menentukan seberapa sering Penyedia Terbaru memeriksa versi baru dari CMP. 

Jika TTL terlalu lama, aplikasi Anda mungkin melanggar aturan bisnis atau standar keamanan Anda. Jika TTL terlalu singkat, panggilan berulang ke toko penyedia dapat menyebabkan toko penyedia Anda untuk membatasi permintaan dari aplikasi Anda dan aplikasi lain yang juga menggunakan akun layanan Anda. Untuk mengatasi masalah ini, sesuaikan TTL dan ukuran cache ke nilai yang memenuhi sasaran latensi dan ketersediaan Anda serta sesuai dengan standar keamanan Anda. Untuk detailnya, lihat [Menetapkan time-to-live nilai](most-recent-provider.md#most-recent-provider-ttl).