View a markdown version of this page

适用于 Java 的 DynamoDB 加密客户端的示例代码 - AWS 数据库加密 SDK

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

适用于 Java 的 DynamoDB 加密客户端的示例代码

注意

我们的客户端加密库已重命名为 AWS 数据库加密 SDK。以下主题提供有关适用于 Java 的 DynamoDB 加密客户端版本 1.x—2.x 以及适用于 Python 的 DynamoDB 加密客户端版本 1.x—3.x 的信息。有关更多信息,请参阅适用于 DynamoDB 的AWS 数据库加密 SDK 版本支持

以下示例为您演示如何使用适用于 Java 的 DynamoDB 加密客户端来保护应用程序中的 DynamoDB 表项目。你可以在上的 aws-database-encryption-sdk- dynamodb 存储库的示例目录中找到更多示例(并贡献自己的示例)。 GitHub

使用 DynamoDBEncryptor

此示例介绍了如何结合使用低级别 DynamoDBEncryptorDirect KMS 提供程序。Direct KMS 提供商根据您指定的 AWS KMS keyin AWS Key Management Service (AWS KMS) 生成和保护其加密材料。

您可以将任何兼容的加密材料提供商 (CMP) 与。DynamoDBEncryptor

查看完整的代码示例AwsKmsEncryptedItem.java

步骤 1:创建 Direct KMS 提供程序

创建指定区域的 AWS KMS 客户端实例。然后,使用客户端实例借助您的首选 AWS KMS key创建 Direct KMS 提供程序的实例。

此示例使用 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 KmsClient kms = KmsClient.builder().region(Region.of(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:创建 DynamoDBEncryptor

使用 Direct KMS 提供程序创建 DynamoDBEncryptor 的实例。

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
步骤 4:创建 DynamoDB 加密上下文

DynamoDB 加密上下文包含有关表结构以及其如何加密和签名的信息。

final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
步骤 5:创建属性操作对象

属性操作确定已加密并签名的项目属性、仅签名的属性以及未加密或签名的属性。

在 Java 中,要指定属性操作,需要创建属性名称和EncryptionFlags值对。 HashMap

例如,以下 Java 代码创建了一个actions HashMap 对record项目中的所有属性进行加密和签名,但分区键和排序密钥属性(已签名但未加密)以及未签名或加密的test属性除外。

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 DynamoDbClient ddb = DynamoDbClient.builder().region(Region.of(region)).build(); ddb.putItem(tableName, encrypted_record);