Java の例 - AWS データベース暗号化 SDK

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

Java の例

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

次の例は、DynamoDB 用の Java クライアント側の暗号化ライブラリを使用して、アプリケーション内のテーブル項目を保護する方法を示しています。の aws-database-encryption-sdk-dynamodb リポジトリの Java の例には、さらに多くの例 (および独自の例を提供) があります GitHub。

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

DynamoDB 拡張クライアントの使用

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

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

注記

DynamoDB Enhanced Client は、検索可能な暗号化をサポートしていません。検索可能な暗号化を使用するには、下位レベルの DynamoDB API とともに DynamoDbEncryptionInterceptor を使用します。

完全なコードサンプル : .EnhancedPutGetExamplejava を参照してください。

ステップ 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 を使用して定義されていることを前提としています。属性アクションにアノテーションを付ける方法のガイダンスについては、「アノテーション付きデータクラスを使用する」を参照してください。

注記

AWS Database Encryption SDK は、ネストされた属性 の注釈をサポートしていません。

final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);
ステップ 3: 署名から除外する属性を定義する

次の例では、すべての DO_NOTHING 属性が個別のプレフィックス「:」を共有し、そのプレフィックスを使用して、許可される署名なし属性を定義すると想定しています。クライアントは、「:」というプレフィックスが付いた属性名は署名から除外されると想定します。詳細については、「許可された署名なし属性」を参照してください。

final String unsignedAttrPrefix = ":";
ステップ 4: 暗号化設定を作成する

次の例では、DynamoDB テーブルの暗号化設定を表す tableConfigs マップを定義します。

この例では、DynamoDB テーブル名を論理テーブル名として指定します。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。詳細については、「AWS Database Encryption SDK for DynamoDB の暗号化設定」を参照してください。

注記

検索可能な暗号化または署名付きビーコンを使用するには、暗号化設定に SearchConfig も含める必要があります。

final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>(); tableConfigs.put(ddbTableName, DynamoDbEnhancedTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .schemaOnEncrypt(tableSchema) .build());
ステップ 5: DynamoDbEncryptionInterceptor を作成する

次の例では、ステップ 4tableConfigs を使用して新しい 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 の使用

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

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

完全なコードサンプル : .BasicPutGetExamplejava を参照してください。

ステップ 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: 属性アクションを設定する

次の例では、テーブル項目のサンプル属性アクションを表す attributeActionsOnEncrypt マップを定義します。

注記

次の例では、属性を として定義していませんSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXTSIGN_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 属性が個別のプレフィックス「:」を共有し、そのプレフィックスを使用して、許可される署名なし属性を定義すると想定しています。クライアントは、「:」というプレフィックスが付いた属性名は署名から除外されると想定します。詳細については、「許可された署名なし属性」を参照してください。

final String unsignedAttrPrefix = ":";
ステップ 4: DynamoDB テーブルの暗号化設定を定義する

次の例では、この DynamoDB テーブルの暗号化設定を表す tableConfigs マップを定義します。

この例では、DynamoDB テーブル名を論理テーブル名として指定します。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。詳細については、「AWS Database Encryption SDK for DynamoDB の暗号化設定」を参照してください。

注記

検索可能な暗号化または署名付きビーコンを使用するには、暗号化設定に SearchConfig も含める必要があります。

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 を作成する

次の例では、ステップ 4tableConfigs を使用して 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

次の例は、下位レベルの DynamoDbItemEncryptorAWS KMS キーリングとともに使用して、テーブル項目を直接暗号化して署名する方法を示しています。DynamoDbItemEncryptor は項目を DynamoDB テーブルに配置しません。

DynamoDB Enhanced Client では、サポートされている任意のキーリングを使用できますが、可能な限りいずれかの AWS KMS キーリングを使用することをお勧めします。

注記

下位レベルの DynamoDbItemEncryptor は、検索可能な暗号化をサポートしていません。検索可能な暗号化を使用するには、下位レベルの DynamoDB API とともに DynamoDbEncryptionInterceptor を使用します。

完全なコードサンプル : .ItemEncryptDecryptExamplejava を参照してください。

ステップ 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: 属性アクションを設定する

次の例では、テーブル項目のサンプル属性アクションを表す attributeActionsOnEncrypt マップを定義します。

注記

次の例では、属性を として定義していませんSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXTSIGN_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 属性が個別のプレフィックス「:」を共有し、そのプレフィックスを使用して、許可される署名なし属性を定義すると想定しています。クライアントは、「:」というプレフィックスが付いた属性名は署名から除外されると想定します。詳細については、「許可された署名なし属性」を参照してください。

final String unsignedAttrPrefix = ":";
ステップ 4: DynamoDbItemEncryptor 設定を定義する

次の例では、DynamoDbItemEncryptor の設定を定義します。

この例では、DynamoDB テーブル名を論理テーブル名として指定します。最初に暗号化設定を定義する際に、DynamoDB テーブル名を論理テーブル名として指定することを強くお勧めします。詳細については、「AWS Database Encryption SDK for DynamoDB の暗号化設定」を参照してください。

final DynamoDbItemEncryptorConfig config = DynamoDbItemEncryptorConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .attributeActionsOnEncrypt(attributeActionsOnEncrypt) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .build();
ステップ 5: DynamoDbItemEncryptor を作成する

次の例では、ステップ 4config を使用して新しい 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();