翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Java 用 DynamoDB 暗号化クライアントのサンプルコード
注記
クライアント側の暗号化ライブラリの名前が AWS Database Encryption に変更されましたSDK。次のトピックには、DynamoDB Encryption Client for Java のバージョン 1.x~2.x および DynamoDB Encryption Client for Python のバージョン 1.x~3.x に関する情報が記載されています。詳細については、「AWS Database Encryption SDK for DynamoDB バージョンサポート」を参照してください。
以下の例では、Java 用 DynamoDB 暗号化クライアントを使用して、アプリケーションの DynamoDB テーブル項目を保護する方法について説明します。その他の例 (および独自の例
D の使用ynamoDBEncryptor
この例では、Direct KMS Provider で下位レベルの DynamoDBEncryptor
では互換性のある暗号化マテリアルプロバイダー (CMP) をDynamoDBEncryptor
、 および では Direct KMS Provider DynamoDBMapper
を使用できますAttributeEncryptor。
完全なコードサンプル : .AwsKmsEncryptedItemjava を参照してください。
- ステップ 1: Direct KMS Provider を作成する
-
指定されたリージョンで AWS KMS クライアントのインスタンスを作成します。次に、クライアントインスタンスを使用して、任意の を使用して Direct KMS Provider のインスタンスを作成します AWS KMS key。
この例では、Amazon リソースネーム (ARN) を使用して を識別しますが AWS KMS key、任意の有効なキー識別子 を使用できます。
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(
region
).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms,keyArn
); - ステップ 2: 項目を作成する
-
この例では
record
HashMap 、サンプルテーブル項目を表す を定義します。final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map<String, AttributeValue> record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("value1")); record.put(sortKeyName, new AttributeValue().withN("55")); record.put("example", new AttributeValue().withS("data")); record.put("numbers", new AttributeValue().withN("99")); record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); record.put("test", new AttributeValue().withS("test-value"));
- ステップ 3: D を作成するynamoDBEncryptor
-
Direct KMS Provider
DynamoDBEncryptor
を使用して のインスタンスを作成します。final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
- ステップ 4: DynamoDB 暗号化コンテキストを作成する
-
DynamoDB 暗号化コンテキストには、テーブル構造に関する情報と、暗号化および署名の方法が含まれます。
DynamoDBMapper
を使用する場合は、AttributeEncryptor
で暗号化テキストが作成されます。final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
- ステップ 5: 属性アクションオブジェクトを作成する
-
属性アクションでは、暗号化されて署名された項目の属性値、署名のみされた項目の属性値、暗号化も署名もされていない項目の属性値を指定します。
Java では、属性アクションを指定するには、属性名と
EncryptionFlags
値のペア HashMap の を作成します。例えば、次の Java コードは、署名されているが暗号化されていないパーティションキーとソートキー属性、
actions
HashMap および署名または暗号化されていないtest
属性を除いて、record
項目内のすべての属性を暗号化して署名する を作成します。final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN); final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN); final Map<String, Set<EncryptionFlags>> actions = new HashMap<>(); for (final String attributeName : record.keySet()) { switch (attributeName) { case partitionKeyName: // fall through to the next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Neither encrypted nor signed break; default: // Encrypt and sign all other attributes actions.put(attributeName, encryptAndSign); break; } }
- ステップ 6: 項目を暗号化および署名する
-
テーブル項目を暗号化して署名するには、
encryptRecord
のインスタンスでDynamoDBEncryptor
メソッドを呼び出します。テーブル項目 (record
)、属性アクション (actions
)、暗号化テキスト (encryptionContext
) を指定します。final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
- ステップ 7: DynamoDB テーブルに項目を入力する
-
最後に、暗号化された署名済みの項目を DynamoDB テーブルに入力します。
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); ddb.putItem(tableName, encrypted_record);
D の使用ynamoDBMapper
次の例は、Direct KMS Provider で DynamoDB マッパーヘルパークラスを使用する方法を示しています。Direct KMS Provider は、指定した AWS KMS key in AWS Key Management Service (AWS KMS) で暗号化マテリアルを生成して保護します。
では互換性のある暗号化マテリアルプロバイダー (CMP) を、下位の では Direct KMS Provider DynamoDBMapper
を使用できますDynamoDBEncryptor
。
完全なコードサンプル : AwsKmsEncryptedObject.java
- ステップ 1: Direct KMS Provider を作成する
-
指定されたリージョンで AWS KMS クライアントのインスタンスを作成します。次に、クライアントインスタンスを使用して、任意の を使用して Direct KMS Provider のインスタンスを作成します AWS KMS key。
この例では、Amazon リソースネーム (ARN) を使用して を識別しますが AWS KMS key、任意の有効なキー識別子 を使用できます。
final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
- ステップ 2: DynamoDB Encryptor と D を作成するynamoDBMapper
-
前のステップで作成した Direct KMS Provider を使用して、DynamoDB Encryptor のインスタンスを作成します。DynamoDB マッパーを使用するには、下位レベルの DynamoDB エンクリプタをインスタンス化する必要があります。
次に、DynamoDB データベースのインスタンスとマッパー設定を作成し、それらを使用して DynamoDB マッパーのインスタンスを作成します。
重要
DynamoDBMapper
を使用して、署名された (または暗号化されて署名された) 項目を追加または編集するときは、以下の例に示されているように、PUT
のような保存動作を使用するように設定して、すべての属性が含まれるようにします。そのように設定しない場合、データを復号できないことがあります。final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp) final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
- ステップ 3: DynamoDB テーブルを定義する
-
次に、DynamoDB テーブルを定義します。注釈を使用して、属性アクションを指定します。この例では、DynamoDB テーブルとして
ExampleTable
を作成し、テーブル項目を表すDataPoJo
クラスを作成します。このサンプルテーブルでは、プライマリキーの属性は署名されますが、暗号化されません。これは、
@DynamoDBHashKey
という注釈が付いたpartition_attribute
に適用されます。また、@DynamoDBRangeKey
という注釈が付いたsort_attribute
に適用されます。@DynamoDBAttribute
という注釈が付いた属性 (some numbers
など) は暗号化されて署名されます。例外は、DynamoDB 暗号化クライアントで定義された@DoNotEncrypt
(署名のみ) または@DoNotTouch
(暗号化も署名もなし) 暗号化注釈を使用する属性です。たとえば、leave me
属性には@DoNotTouch
注釈が付いているため、暗号化も署名もされません。@DynamoDBTable(tableName = "ExampleTable") public static final class DataPoJo { private String partitionAttribute; private int sortAttribute; private String example; private long someNumbers; private byte[] someBinary; private String leaveMe; @DynamoDBHashKey(attributeName = "partition_attribute") public String getPartitionAttribute() { return partitionAttribute; } public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } @DynamoDBRangeKey(attributeName = "sort_attribute") public int getSortAttribute() { return sortAttribute; } public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } @DynamoDBAttribute(attributeName = "example") public String getExample() { return example; } public void setExample(String example) { this.example = example; } @DynamoDBAttribute(attributeName = "some numbers") public long getSomeNumbers() { return someNumbers; } public void setSomeNumbers(long someNumbers) { this.someNumbers = someNumbers; } @DynamoDBAttribute(attributeName = "and some binary") public byte[] getSomeBinary() { return someBinary; } public void setSomeBinary(byte[] someBinary) { this.someBinary = someBinary; } @DynamoDBAttribute(attributeName = "leave me") @DoNotTouch public String getLeaveMe() { return leaveMe; } public void setLeaveMe(String leaveMe) { this.leaveMe = leaveMe; } @Override public String toString() { return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute=" + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]"; } }
- ステップ 4: テーブル項目を暗号化して保存する
-
これで、テーブル項目を作成し、DynamoDB マッパーを使用して項目を保存すると、項目はテーブルに追加される前に自動的に暗号化されて署名されます。
この例では、
record
というテーブル項目を定義しています。この項目がテーブルに保存される前に、DataPoJo
クラスの注釈に基づいて、その属性は暗号化されて署名されます。この場合、PartitionAttribute
、SortAttribute
、LeaveMe
を除くすべての属性が暗号化されて署名されます。PartitionAttribute
とSortAttributes
は署名のみされます。LeaveMe
属性は暗号化または署名されていません。record
項目を暗号化して署名し、ExampleTable
に追加するには、DynamoDBMapper
クラスのsave
メソッドを呼び出します。DynamoDB マッパーはPUT
保存動作を使用するように設定されているため、項目は更新されず、代わりに同じプライマリキーを使用する項目に置き換えられます。これにより、確実に署名が一致するようになり、その項目をテーブルからの取得時に復号化できます。DataPoJo record = new DataPoJo(); record.setPartitionAttribute("is this"); record.setSortAttribute(55); record.setExample("data"); record.setSomeNumbers(99); record.setSomeBinary(new byte[]{0x00, 0x01, 0x02}); record.setLeaveMe("alone"); mapper.save(record);