

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

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

このトピックでは、DynamoDB 用の .NET クライアント側の暗号化ライブラリのバージョン 3.*x* をインストールして使用する方法について説明します。 AWS Database Encryption SDK for DynamoDB を使用したプログラミングの詳細については、GitHub の aws-database-encryption-sdk-dynamodb リポジトリの [.NET の例](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/)を参照してください。

DynamoDB 用の .NET クライアント側の暗号化ライブラリは、C\$1 やその他の .NET プログラミング言語でアプリケーションを記述している開発者を対象としています。Windows、macOS、Linux でサポートされています。

 AWS Database Encryption SDK for DynamoDB のすべての[プログラミング言語](ddb-programming-languages.md)実装は相互運用可能です。ただし、 SDK for .NET では、リストデータ型またはマップデータ型の空の値はサポートされていません。つまり、DynamoDB 用の Java クライアント側の暗号化ライブラリを使用して、リストまたはマップデータ型の空の値を含む項目を書き込む場合、DynamoDB 用の .NET クライアント側の暗号化ライブラリを使用してその項目を復号化して読み取ることはできません。

**Topics**
+ [インストール](#ddb-net-install)
+ [デバッグ](#ddb-net-debugging)
+ [.NET クライアントの使用](ddb-net-using.md)
+ [.NET の例](ddb-net-examples.md)
+ [既存のテーブルにバージョン 3.x を追加する](ddb-net-config-existing-table.md)

## DynamoDB 用の .NET クライアント側の暗号化ライブラリのインストール
<a name="ddb-net-install"></a>

DynamoDB 用の .NET クライアント側の暗号化ライブラリは、NuGet の [AWS.Cryptography.DbEncryptionSDK.DynamoDb](https://www.nuget.org/packages/AWS.Cryptography.DbEncryptionSDK.DynamoDb/) パッケージとして利用できます。ライブラリのインストールと構築の詳細については、aws-database-encryption-sdk-dynamodb リポジトリの [.NET README.md](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/DynamoDbEncryption/runtimes/net/README.md) ファイルを参照してください。DynamoDB 用の .NET クライアント側の暗号化ライブラリには、 AWS Key Management Service (AWS KMS) キーを使用していない場合 SDK for .NET でも が必要です。は NuGet SDK for .NET パッケージと共にインストールされます。

DynamoDB 用の .NET クライアント側の暗号化ライブラリのバージョン 3.*x* は、.NET 6.0 および .NET Framework net48 以降をサポートしています。

## .NET を使用したデバッグ
<a name="ddb-net-debugging"></a>

DynamoDB 用の .NET クライアント側の暗号化ライブラリはログを生成しません。DynamoDB 用の .NET クライアント側の暗号化ライブラリの例外は例外メッセージを生成しますが、スタックトレースは生成されません。

デバッグしやすいように、 SDK for .NETへのログ記録を必ず有効にしてください。からのログとエラーメッセージ SDK for .NET は、 で発生するエラーを、DynamoDB 用の .NET クライアント側の暗号化ライブラリのエラー SDK for .NET と区別するのに役立ちます。 SDK for .NET ログ記録については、「 *AWS SDK for .NET デベロッパーガイド*」の[AWSLogging](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-config-other.html#config-setting-awslogging)」を参照してください。(このトピックを確認するには、**[.NET Framework コンテンツを開く]** セクションを展開してください)。

# DynamoDB 用の .NET クライアント側の暗号化ライブラリの使用
<a name="ddb-net-using"></a>

このトピックでは、DynamoDB 用の .NET クライアント側の暗号化ライブラリのバージョン 3.*x* の関数とヘルパークラスの一部について説明します。

DynamoDB 用の .NET クライアント側の暗号化ライブラリを使用したプログラミングの詳細については、GitHub の aws-database-encryption-sdk-dynamodb リポジトリの [.NET の例](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/)を参照してください。

**Topics**
+ [項目エンクリプタ](#ddb-net-item-encryptors)
+ [属性アクション](#ddb-net-attribute-actions)
+ [暗号化設定](#ddb-net-config-encrypt)
+ [項目の更新](#ddb-net-update-items)

## 項目エンクリプタ
<a name="ddb-net-item-encryptors"></a>

その中核となる AWS Database Encryption SDK for DynamoDB は項目エンクリプタです。DynamoDB 用の .NET クライアント側の暗号化ライブラリのバージョン 3.*x* を使用して、DynamoDB テーブル項目を次の方法で暗号化、署名、検証、復号できます。

**DynamoDB API 用の低レベル AWS データベース暗号化 SDK**  
[テーブル暗号化設定](#ddb-net-config-encrypt)を使用して、DynamoDB `PutItem`リクエストでクライアント側で項目を自動的に暗号化して署名する DynamoDB クライアントを構築できます。このクライアントを直接使用するか、[ドキュメントモデル](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-document)または[オブジェクト永続性モデル](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-object-persistence)を構築できます。  
[検索可能な](searchable-encryption.md)暗号化を使用するには、低レベルの AWS Database Encryption SDK for DynamoDB API を使用する必要があります。

**下位レベルの `DynamoDbItemEncryptor`**  
下位レベルの `DynamoDbItemEncryptor` は、DynamoDB を呼び出すことなく、テーブル項目を直接暗号化して署名するか、または復号して検証します。DynamoDB の `PutItem` または `GetItem` リクエストは実行しません。例えば、下位レベルの `DynamoDbItemEncryptor` を使用して、既に取得した DynamoDB 項目を直接復号して検証できます。低レベルの を使用する場合は`DynamoDbItemEncryptor`、 が DynamoDB との通信 SDK for .NET に提供する[低レベルのプログラミングモデル](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-low-level)を使用することをお勧めします。  
下位レベルの `DynamoDbItemEncryptor` は、[検索可能な暗号化](searchable-encryption.md)をサポートしていません。

## AWS Database Encryption SDK for DynamoDB の属性アクション
<a name="ddb-net-attribute-actions"></a>

[属性アクション](concepts.md#crypt-actions)は、暗号化および署名される属性値、署名のみされる属性値、署名および暗号化コンテキストに含まれる属性値、および無視される属性値を決定します。

.NET クライアントで属性アクションを指定するには、オブジェクトモデルを使用して属性アクションを手動で定義します。名前と値のペアが属性名と指定されたアクションを表す`Dictionary`オブジェクトを作成して、属性アクションを指定します。

属性を暗号化して署名するように `ENCRYPT_AND_SIGN` を指定します。属性に署名するが暗号化はしないように `SIGN_ONLY` を指定します。`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` を指定して属性に署名し、暗号化コンテキストに含めます。属性に署名することなく、その属性を暗号化することはできません。属性を無視するように `DO_NOTHING` を指定します。

パーティション属性とソート属性は、 `SIGN_ONLY` または のいずれかである必要があります`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。属性を として定義する場合`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`、パーティション属性とソート属性も である必要があります`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。

**注記**  
属性アクションを定義した後、どの属性を署名から除外するかを定義する必要があります。将来、新しい署名なし属性を簡単に追加できるように、署名なし属性を識別するための個別のプレフィックス (「`:`」など) を選択することをお勧めします。DynamoDB スキーマと属性アクションを定義するときに `DO_NOTHING` とマークされたすべての属性の属性名にこのプレフィックスを含めます。

次のオブジェクトモデルは`ENCRYPT_AND_SIGN`、.NET クライアントで `SIGN_ONLY`、`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`、、および `DO_NOTHING` 属性アクションを指定する方法を示しています。この例では、プレフィックス`:`「」を使用して`DO_NOTHING`属性を識別します。

**注記**  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 暗号化アクションを使用するには、 AWS Database Encryption SDK のバージョン 3.3 以降を使用する必要があります。[データモデルを更新して を含める前に、すべてのリーダー](ddb-update-data-model.md)に新しいバージョンをデプロイします`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
};
```

## AWS Database Encryption SDK for DynamoDB の暗号化設定
<a name="ddb-net-config-encrypt"></a>

 AWS Database Encryption SDK を使用する場合は、DynamoDB テーブルの暗号化設定を明示的に定義する必要があります。暗号化設定に必要な値は、属性アクションを手動で定義したか、またはアノテーション付きデータクラスを使用して定義したかによって異なります。

次のスニペットは、低レベルの AWS Database Encryption SDK for DynamoDB API と、個別のプレフィックスで定義された許可された署名なし属性を使用して、DynamoDB テーブル暗号化設定を定義します。

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

**論理テーブル名**  
DynamoDB テーブルの論理テーブル名。  
論理テーブル名は、DynamoDB の復元オペレーションを簡素化するために、テーブルに格納されているすべてのデータに暗号的にバインドされます。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。常に同じ論理テーブル名を指定する必要があります。復号を成功させるには、論理テーブル名が、暗号化の際に指定された名前と一致する必要があります。[DynamoDB テーブルをバックアップから復元](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Restore.Tutorial.html)した後に DynamoDB テーブル名が変更された場合でも、論理テーブル名を使用することで、復号オペレーションで引き続きテーブルが確実に認識されます。

**許可された署名なし属性**  
属性アクションで `DO_NOTHING` とマークされた属性。  
許可された署名なし属性は、どの属性が署名から除外されるかをクライアントに伝えます。クライアントは、他のすべての属性が署名に含まれていると想定します。その後、レコードを復号する際に、クライアントは、ユーザーが指定する、許可された署名なし属性の中からどの属性を検証する必要があり、どの属性を無視する必要があるかを決定します。許可された署名なし属性から属性を削除することはできません。  
すべての `DO_NOTHING` 属性をリストする配列を作成することで、許可された署名なし属性を明示的に定義できます。また、`DO_NOTHING` 属性に名前を付ける際に個別のプレフィックスを指定し、そのプレフィックスを使用してどの属性が署名されていないかをクライアントに伝えることもできます。将来新しい `DO_NOTHING` 属性を追加するプロセスが簡素化されるため、個別のプレフィックスを指定することを強くお勧めします。詳細については、「[データモデルの更新](ddb-update-data-model.md)」を参照してください。  
すべての `DO_NOTHING` 属性のためにプレフィックスを指定しない場合は、クライアントが復号時に署名されていないことを想定するすべての属性を明示的にリストする `allowedUnsignedAttributes` 配列を設定できます。どうしても必要な場合にのみ、許可された署名なし属性を明示的に定義する必要があります。

**検索設定 (オプション)**  
`SearchConfig` は[ビーコンのバージョン](using-beacons.md#beacon-version)を定義します。  
[検索可能な暗号化](searchable-encryption.md)または[署名付きビーコン](configure.md#signed-beacons)を使用するには、`SearchConfig` を指定する必要があります。

**アルゴリズムスイート (オプション)**  
`algorithmSuiteId` は、 AWS Database Encryption SDK が使用するアルゴリズムスイートを定義します。  
代替アルゴリズムスイートを明示的に指定しない限り、 AWS Database Encryption SDK は[デフォルトのアルゴリズムスイート](supported-algorithms.md#recommended-algorithms)を使用します。デフォルトのアルゴリズムスイートは、キーの導出、[デジタル署名](concepts.md#digital-sigs)、および[キーコミットメント](concepts.md#key-commitment)を備えた AES-GCM アルゴリズムを使用します。デフォルトのアルゴリズムスイートはほとんどのアプリケーションに適している可能性がありますが、代替アルゴリズムスイートを選択できます。例えば、一部の信頼モデルは、デジタル署名を含まないアルゴリズムスイートによって満たされます。 AWS Database Encryption SDK がサポートするアルゴリズムスイートの詳細については、「」を参照してください[AWS Database Encryption SDK でサポートされているアルゴリズムスイート](supported-algorithms.md)。  
[ECDSA デジタル署名を使用しない AES-GCM アルゴリズムスイート](supported-algorithms.md#other-algorithms)を選択するには、テーブル暗号化設定に次のスニペットを含めます。  

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

## AWS Database Encryption SDK を使用した項目の更新
<a name="ddb-net-update-items"></a>

 AWS Database Encryption SDK は、暗号化または署名された属性を含む項目に対して [ddb:UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) をサポートしていません。暗号化または署名された属性を更新するには、[ddb:PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) を使用する必要があります。`PutItem` リクエストで既存の項目と同じプライマリキーを指定すると、新しい項目が既存の項目に完全に置き換わります。[CLOBBER](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html#CLOBBER) を使用して、項目を更新した後、保存する際にすべての属性をクリアして置き換えることもできます。

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

次の例は、DynamoDB 用の .NET クライアント側の暗号化ライブラリを使用して、アプリケーション内のテーブル項目を保護する方法を示しています。その他の例を見つける (および独自の例を提供する) には、GitHub の aws-database-encryption-sdk-dynamodb リポジトリにある [.NET の例](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/net/src)を参照してください。

次の例は、入力されていない新しい Amazon DynamoDB テーブルで DynamoDB 用の .NET クライアント側の暗号化ライブラリを設定する方法を示しています。既存の Amazon DynamoDB テーブルをクライアント側の暗号化のために設定する場合は、「[既存のテーブルにバージョン 3.x を追加する](ddb-net-config-existing-table.md)」を参照してください。

**Topics**
+ [低レベルの AWS Database Encryption SDK for DynamoDB API の使用](#ddb-net-lowlevel-API-example)
+ [下位レベルの使用 `DynamoDbItemEncryptor`](#ddb-net-itemencryptor)

## 低レベルの AWS Database Encryption SDK for DynamoDB API の使用
<a name="ddb-net-lowlevel-API-example"></a>

次の例は、 [AWS KMS キーリング](use-kms-keyring.md)で低レベルの AWS Database Encryption SDK for DynamoDB API を使用して、DynamoDB `PutItem`リクエストでクライアント側で項目を自動的に暗号化して署名する方法を示しています。

サポートされている任意の[キーリング](keyrings.md)を使用できますが、可能な限りいずれかの AWS KMS キーリングを使用することをお勧めします。

**完全なコードサンプルを参照**: [BasicPutGetExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/BasicPutGetExample.cs)

**ステップ 1: AWS KMS キーリングを作成する**  
次の例では、 `CreateAwsKmsMrkMultiKeyring`を使用して対称暗号化 KMS AWS KMS キーを持つ キーリングを作成します。`CreateAwsKmsMrkMultiKeyring` メソッドにより、キーリングは、単一リージョンのキーとマルチリージョンのキーの両方を確実に正しく処理します。  

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

**ステップ 2: 属性アクションを設定する**  
次の例では、テーブル項目のサンプル[属性アクション](concepts.md#crypt-actions)を表す `attributeActionsOnEncrypt` ディクショナリを定義します。  
次の例では、属性を として定義していません`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 属性を指定する場合、パーティション属性とソート属性も である必要があります`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
};
```

**ステップ 3: 署名から除外する属性を定義する**  
次の例では、すべての `DO_NOTHING` 属性が個別のプレフィックス「`:`」を共有し、そのプレフィックスを使用して、許可される署名なし属性を定義すると想定しています。クライアントは、「`:`」というプレフィックスが付いた属性名は署名から除外されると想定します。詳細については、「[Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth)」を参照してください。  

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

**ステップ 4: DynamoDB テーブルの暗号化設定を定義する**  
次の例では、この DynamoDB テーブルの暗号化設定を表す `tableConfigs` マップを定義します。  
この例では、DynamoDB テーブル名を[論理テーブル名](ddb-net-using.md#net-logical-table-name)として指定します。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。詳細については、「[AWS Database Encryption SDK for DynamoDB の暗号化設定](ddb-net-using.md#ddb-net-config-encrypt)」を参照してください。  
[検索可能な暗号化](searchable-encryption.md)または[署名付きビーコン](configure.md#signed-beacons)を使用するには、暗号化設定に [`SearchConfig`](ddb-java-using.md#ddb-search-config) も含める必要があります。

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

**ステップ 5: 新しい AWS SDK DynamoDB クライアントを作成する**  
次の例では、**ステップ 4** `TableEncryptionConfigs`の を使用して新しい AWS SDK DynamoDB クライアントを作成します。  

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

**ステップ 6: DynamoDB テーブル項目を暗号化して署名する**  
次の例では、サンプルテーブル項目を表す`item`ディクショナリを定義し、その項目を DynamoDB テーブルに配置します。項目は、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);
```

## 下位レベルの使用 `DynamoDbItemEncryptor`
<a name="ddb-net-itemencryptor"></a>

次の例は、下位レベルの `DynamoDbItemEncryptor` を [AWS KMS キーリング](use-kms-keyring.md)とともに使用して、テーブル項目を直接暗号化して署名する方法を示しています。`DynamoDbItemEncryptor` は項目を DynamoDB テーブルに配置しません。

DynamoDB 拡張クライアントではサポートされている任意の[キーリング](keyrings.md)を使用できますが、可能な限りいずれかの AWS KMS キーリングを使用することをお勧めします。

**注記**  
下位レベルの `DynamoDbItemEncryptor` は、[検索可能な暗号化](searchable-encryption.md)をサポートしていません。検索可能な暗号化を使用するには、低レベルの AWS Database Encryption SDK for DynamoDB API を使用します。

**完全なコードサンプル**「[ItemEncryptDecryptExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/itemencryptor/ItemEncryptDecryptExample.cs)」を参照してください。

**ステップ 1: AWS KMS キーリングを作成する**  
次の例では、 `CreateAwsKmsMrkMultiKeyring`を使用して対称暗号化 KMS AWS KMS キーを持つ キーリングを作成します。`CreateAwsKmsMrkMultiKeyring` メソッドにより、キーリングは、単一リージョンのキーとマルチリージョンのキーの両方を確実に正しく処理します。  

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

**ステップ 2: 属性アクションを設定する**  
次の例では、テーブル項目のサンプル[属性アクション](concepts.md#crypt-actions)を表す `attributeActionsOnEncrypt` ディクショナリを定義します。  
次の例では、属性を として定義していません`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 属性を指定する場合、パーティション属性とソート属性も である必要があります`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
};
```

**ステップ 3: 署名から除外する属性を定義する**  
次の例では、すべての `DO_NOTHING` 属性が個別のプレフィックス「`:`」を共有し、そのプレフィックスを使用して、許可される署名なし属性を定義すると想定しています。クライアントは、「`:`」というプレフィックスが付いた属性名は署名から除外されると想定します。詳細については、「[Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth)」を参照してください。  

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

**ステップ 4: `DynamoDbItemEncryptor` 設定を定義する**  
次の例では、`DynamoDbItemEncryptor` の設定を定義します。  
この例では、DynamoDB テーブル名を[論理テーブル名](ddb-net-using.md#net-logical-table-name)として指定します。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。詳細については、「[AWS Database Encryption SDK for 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
};
```

**ステップ 5: `DynamoDbItemEncryptor` を作成する**  
次の例では、**ステップ 4** の `config` を使用して新しい `DynamoDbItemEncryptor` を作成します。  

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

**ステップ 6: テーブル項目を直接暗号化して署名する**  
次の例では、`DynamoDbItemEncryptor` を使用して項目を直接暗号化し、署名します。`DynamoDbItemEncryptor` は項目を DynamoDB テーブルに配置しません。  

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

# AWS Database Encryption SDK for DynamoDB を使用するように既存の DynamoDB テーブルを設定する
<a name="ddb-net-config-existing-table"></a>

DynamoDB 用の .NET クライアント側の暗号化ライブラリのバージョン 3.*x* では、クライアント側の暗号化用に既存の Amazon DynamoDB テーブルを設定できます。このトピックでは、データが入力されている既存の DynamoDB テーブルにバージョン 3.x を追加するために必要な 3 つのステップについてのガイダンスを提供します。

## ステップ 1: 暗号化された項目の読み取りと書き込みの準備をする
<a name="ddb-net-add-step1"></a>

Database Encryption SDK AWS クライアントが暗号化された項目を読み書きできるように準備するには、次の手順を実行します。次の変更をデプロイした後も、クライアントは引き続きプレーンテキスト項目の読み取りと書き込みを行います。テーブルに書き込まれる新しい項目の暗号化や署名は行いませんが、暗号化された項目が表示されるとすぐに復号できます。これらの変更により、クライアントが[新しい項目の暗号化](#ddb-net-add-step2)を開始するための準備が整います。次のステップに進む前に、次の変更を各リーダーにデプロイする必要があります。

**1. [属性アクション](concepts.md#crypt-actions)を定義する**  
オブジェクトモデルを作成して、暗号化および署名される属性値、署名のみされる属性値、および無視される属性値を定義します。  
デフォルトでは、プライマリキー属性は署名されてはいるが、暗号化されておらず (`SIGN_ONLY`)、他のすべての属性は暗号化されて署名されています (`ENCRYPT_AND_SIGN`)。  
属性を暗号化して署名するように `ENCRYPT_AND_SIGN` を指定します。属性に署名するが暗号化はしないように `SIGN_ONLY` を指定します。署名と属性`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`を指定し、暗号化コンテキストに含めます。属性に署名することなく、その属性を暗号化することはできません。属性を無視するように `DO_NOTHING` を指定します。詳細については、「[AWS Database Encryption SDK for DynamoDB の属性アクション](ddb-net-using.md#ddb-net-attribute-actions)」を参照してください。  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 属性を指定する場合、パーティション属性とソート属性も である必要があります`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. 署名から除外する属性を定義する**  
次の例では、すべての `DO_NOTHING` 属性が個別のプレフィックス「`:`」を共有し、そのプレフィックスを使用して、許可される署名なし属性を定義すると想定しています。クライアントは、「`:`」というプレフィックスが付いた属性名は署名から除外されると想定します。詳細については、「[Allowed unsigned attributes](ddb-net-using.md#net-allowed-unauth)」を参照してください。  

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

**3. [キーリング](keyrings.md)を作成します。**  
次の例では [AWS KMS キーリング](use-kms-keyring.md)を作成します。 AWS KMS キーリングは、対称暗号化または非対称 RSA AWS KMS keys を使用してデータキーを生成、暗号化、復号します。  
この例では、`CreateMrkMultiKeyring` を使用して、対称暗号化 KMS キーで AWS KMS キーリングを作成します。`CreateAwsKmsMrkMultiKeyring` メソッドにより、キーリングは、単一リージョンのキーとマルチリージョンのキーの両方を確実に正しく処理します。  

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

**4. DynamoDB テーブルの暗号化設定を定義する **  
次の例では、この DynamoDB テーブルの暗号化設定を表す `tableConfigs` マップを定義します。  
この例では、DynamoDB テーブル名を[論理テーブル名](ddb-net-using.md#net-logical-table-name)として指定します。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。  
プレーンテキストのオーバーライドとして `FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` を指定する必要があります。このポリシーは、プレーンテキスト項目の読み取りと書き込みを継続し、暗号化された項目を読み取り、クライアントが暗号化された項目を書き込むための準備を整えます。  
テーブル暗号化設定に含まれる値の詳細については、「」を参照してください[AWS Database Encryption SDK for 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. 新しい AWS SDK DynamoDB クライアントを作成する**  
次の の例では、**ステップ 4** `TableEncryptionConfigs`の を使用して新しい AWS SDK DynamoDB クライアントを作成します。  

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

## ステップ 2: 暗号化および署名された項目を書き込む
<a name="ddb-net-add-step2"></a>

テーブル暗号化設定のプレーンテキストポリシーを更新して、クライアントが暗号化および署名された項目を書き込むことを許可します。次の変更をデプロイすると、クライアントは**ステップ 1** で設定した属性アクションに基づいて新しい項目を暗号化して署名します。クライアントは、プレーンテキストの項目と暗号化および署名された項目を読み取ることができるようになります。

[ステップ 3](#ddb-net-add-step3) に進む前に、テーブル内の既存のすべてのプレーンテキスト項目を暗号化して署名する必要があります。既存のプレーンテキスト項目を迅速に暗号化するために実行できる単一のメトリクスやクエリはありません。システムにとって最も合理的なプロセスを使用してください。例えば、定義した属性アクションと暗号化設定を使用して、時間をかけてテーブルをスキャンし、項目を書き換える非同期プロセスを使用できます。テーブル内のプレーンテキスト項目を識別するには、 AWS Database Encryption SDK が暗号化および署名されたときに項目に追加する `aws_dbe_head`および `aws_dbe_foot` 属性を含まないすべての項目をスキャンすることをお勧めします。

次の の例では、**ステップ 1 **のテーブル暗号化設定を更新します。プレーンテキストのオーバーライドを `FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT` を使用して更新する必要があります。このポリシーはプレーンテキスト項目を引き続き読み取りますが、暗号化された項目の読み取りと書き込みも行います。更新された を使用して新しい AWS SDK DynamoDB クライアントを作成します`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);
```

## ステップ 3: 暗号化および署名された項目のみを読み取る
<a name="ddb-net-add-step3"></a>

すべての項目を暗号化して署名したら、テーブル暗号化設定のプレーンテキストオーバーライドを更新して、クライアントが暗号化および署名された項目の読み取りと書き込みのみを許可します。次の変更をデプロイすると、クライアントは**ステップ 1** で設定した属性アクションに基づいて新しい項目を暗号化して署名します。クライアントは、暗号化および署名された項目のみを読み取ることができます。

次の の例では、**ステップ 2 **のテーブル暗号化設定を更新します。`FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT` を使用してプレーンテキストオーバーライドを更新することも、設定からプレーンテキストポリシーを削除することもできます。クライアントは、デフォルトでは、暗号化および署名された項目の読み取りと書き込みのみを行います。更新された を使用して新しい AWS SDK DynamoDB クライアントを作成します`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);
```