Java 示例 - AWS 数据库加密 SDK

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

Java 示例

我们的客户端加密库已重命名为 AWS 数据库加密SDK。本开发人员指南仍提供有关 DynamoDB 加密客户端的信息。

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

以下示例演示了如何在未填充的全新 Amazon DynamoDB 表中配置适用于 DynamoDB 的 Java 客户端加密库。如果您想配置现有的 Amazon DynamoDB 表以进行客户端加密,请参阅 将版本 3.x 添加到现有表

使用 DynamoDB 增强版客户端

以下示例演示如何使用 DynamoDB 增强型客户端DynamoDbEncryptionInterceptor和密钥环对 DynamoDB 表项目AWS KMS 进行加密,这是 DynamoDB 调用的一部分。 API

您可以在 DynamoDB 增强版客户端中使用任何支持的密钥环,但我们建议尽可能使用其中 AWS KMS 一个密钥环。

注意

DynamoDB 增强版客户端不支持可搜索的加密。将DynamoDbEncryptionInterceptor与低级 D API ynamoDB 配合使用即可使用可搜索的加密。

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

步骤 1:创建 AWS KMS 密钥环

以下示例使用CreateAwsKmsMrkMultiKeyring对称加密 AWS KMS 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 数据库加密SDK不支持对嵌套属性进行标注。

final TableSchema<SimpleClass> schemaOnEncrypt = TableSchema.fromBean(SimpleClass.class);
步骤 3:定义从签名中可以排除哪些属性

以下示例假设所有 DO_NOTHING 属性共享不同的前缀“:”,并使用该前缀定义允许的未签名属性。客户端假设任何带有“:”前缀的属性名称都被排除在签名之外。有关更多信息,请参阅 Allowed unsigned attributes

final String unsignedAttrPrefix = ":";
步骤 4:创建加密配置

以下示例定义了一个 tableConfigs 映射,该映射表示 DynamoDB 表的加密配置。

此示例将 DynamoDB 表名称指定为逻辑表名称。强烈建议您在首次定义加密配置时将 DynamoDB 表名指定为逻辑表名。有关更多信息,请参阅 DynamoD AWS B 数据库加密SDK中的加密配置

注意

要使用可搜索的加密签名信标,您还必须在加密配置中包括 SearchConfig

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 中的创建了一个新 AWS SDK的 DynamoDB 客户端interceptor

final DynamoDbClient ddb = DynamoDbClient.builder() .overrideConfiguration( ClientOverrideConfiguration.builder() .addExecutionInterceptor(interceptor) .build()) .build();
步骤 7:创建 DynamoDB 增强版客户端并创建表

以下示例使用步骤 6 中创建的 DynamoDB 客户端创建 AWS SDK DynamoDB 增强型客户端,并使用带注释的数据类创建表。

final DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(ddb) .build(); final DynamoDbTable<SimpleClass> table = enhancedClient.table(ddbTableName, tableSchema);
步骤 8:对表项目进行加密和签名

以下示例使用 DynamoDB 增强版客户端将项目放入 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 密钥环的低级 D API ynamoDB,通过您的 DynamoDB 请求在客户端自动加密和签名项目。 PutItem

您可以使用任何支持的密钥环,但我们建议尽可能使用其中一个 AWS KMS 密钥环。

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

步骤 1:创建 AWS KMS 密钥环

以下示例使用CreateAwsKmsMrkMultiKeyring对称加密 AWS KMS 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_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

final String unsignedAttrPrefix = ":";
步骤 4:定义 DynamoDB 表的加密配置

以下示例定义了一个 tableConfigs 映射,该映射表示此 DynamoDB 表的加密配置。

此示例将 DynamoDB 表名称指定为逻辑表名称。强烈建议您在首次定义加密配置时将 DynamoDB 表名指定为逻辑表名。有关更多信息,请参阅 DynamoD AWS B 数据库加密SDK中的加密配置

注意

要使用可搜索的加密签名信标,您还必须在加密配置中包括 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

以下示例使用步骤 4 中的 tableConfigs 创建 DynamoDbEncryptionInterceptor

DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder() .config(DynamoDbTablesEncryptionConfig.builder() .tableEncryptionConfigs(tableConfigs) .build()) .build();
步骤 6:创建新的 AWS SDK DynamoDB 客户端

以下示例使用步骤 5 中的创建了一个新 AWS SDK的 DynamoDB 客户端interceptor

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

以下示例说明如何使用带有 AWS KMS 密钥环的较低级别 DynamoDbItemEncryptor 来直接对表项目进行加密和签名。DynamoDbItemEncryptor 不会将项目放入 DynamoDB 表中。

您可以在 DynamoDB 增强版客户端中使用任何支持的密钥环,但我们建议尽可能使用其中 AWS KMS 一个密钥环。

注意

较低级别的 DynamoDbItemEncryptor 不支持可搜索加密。将DynamoDbEncryptionInterceptor与低级 D API ynamoDB 配合使用即可使用可搜索的加密。

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

步骤 1:创建 AWS KMS 密钥环

以下示例使用CreateAwsKmsMrkMultiKeyring对称加密 AWS KMS 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_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

final String unsignedAttrPrefix = ":";
步骤 4:定义 DynamoDbItemEncryptor 配置

以下示例定义 DynamoDbItemEncryptor 的配置。

此示例将 DynamoDB 表名称指定为逻辑表名称。强烈建议您在首次定义加密配置时将 DynamoDB 表名指定为逻辑表名。有关更多信息,请参阅 DynamoD AWS B 数据库加密SDK中的加密配置

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