

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

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