

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

# .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);
```