

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

# Java の例
<a name="ddb-java-examples"></a>


****  

|  | 
| --- |
| クライアント側の暗号化ライブラリの名前が AWS Database Encryption SDK に変更されました。このデベロッパーガイドでは、引き続き [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md) に関する情報を提供します。 | 

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

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

**Topics**
+ [DynamoDB 拡張クライアントの使用](#ddb-java-enhanced-client-example)
+ [下位レベルの DynamoDB API の使用](#ddb-java-lowlevel-API-example)
+ [下位レベルの DynamoDbItemEncryptor の使用](#ddb-java-itemencryptor)

## DynamoDB 拡張クライアントの使用
<a name="ddb-java-enhanced-client-example"></a>

次の例は、[AWS KMS キーリング](use-kms-keyring.md)で DynamoDB Enhanced Client と `DynamoDbEncryptionInterceptor` を使用して、DynamoDB API 呼び出しの一部として DynamoDB テーブルの項目を暗号化する方法を示しています。

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

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

**完全なコードサンプルを参照してください**: [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)

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

```
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: アノテーション付きデータクラスからテーブルスキーマを作成する**  
次の例では、アノテーション付きデータクラスを使用して、`TableSchema` を作成します。  
この例では、アノテーション付きのデータクラスと属性アクションが [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) を使用して定義されていることを前提としています。属性アクションにアノテーションを付ける方法のガイダンスについては、「[アノテーション付きデータクラスを使用する](ddb-java-using.md#ddb-attribute-actions-annotated-data-class)」を参照してください。  
 AWS Database Encryption SDK は、[ネストされた属性](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);
```

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

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

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

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

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

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

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

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

**ステップ 7: DynamoDB Enhanced Client を作成し、テーブルを作成する**  
次の例では、**ステップ 6** で作成した AWS SDK DynamoDB クライアントを使用して DynamoDB Enhanced Client を作成し、アノテーション付きデータクラスを使用してテーブルを作成します。  

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

**ステップ 8: テーブル項目を暗号化して署名する**  
次の例では、DynamoDB Enhanced Client を使用して項目を DynamoDB テーブルに配置します。項目は、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);
```

## 下位レベルの DynamoDB API の使用
<a name="ddb-java-lowlevel-API-example"></a>

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

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

**完全なコードサンプルを参照してください**: [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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**完全なコードサンプルを参照してください**: [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)

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

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

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

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

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

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

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

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

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