本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Java 範例
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 DynamoDB 加密用戶端的資訊。 |
下列範例示範如何使用適用於 DynamoDB 的 Java 用戶端加密程式庫來保護應用程式中的資料表項目。您可以在 GitHub 的 aws-database-encryption-sdk-dynamodb 儲存庫的 Java 範例中
下列範例示範如何在未填入的新 Amazon DynamoDB 資料表中設定 DynamoDB 的 Java 用戶端加密程式庫。如果您想要設定現有的 Amazon DynamoDB 資料表進行用戶端加密,請參閱 將 3.x 版新增至現有資料表。
使用 DynamoDB 增強型用戶端
下列範例示範如何使用 DynamoDB 增強型用戶端和 DynamoDbEncryptionInterceptor搭配 AWS KMS keyring 來加密 DynamoDB 資料表項目,做為 DynamoDB API 呼叫的一部分。
您可以搭配 DynamoDB 增強型用戶端使用任何支援的 keyring,但我們建議您盡可能使用其中一個 AWS KMS keyring。
注意
DynamoDB 增強型用戶端不支援可搜尋加密。使用 DynamoDbEncryptionInterceptor搭配低階 DynamoDB API,以使用可搜尋的加密。
請參閱完整的程式碼範例:EnhancedPutGetExample.java
- 步驟 1:建立 AWS KMS keyring
-
下列範例使用
CreateAwsKmsMrkMultiKeyring建立具有對稱加密 KMS 金鑰的 AWS KMS keyring。CreateAwsKmsMrkMultiKeyring方法可確保 keyring 可正確處理單一區域和多區域金鑰。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屬性共用不同的字首「:」,並使用字首定義允許的未簽章屬性。用戶端假設任何具有「:」字首的屬性名稱都會從簽章中排除。如需詳細資訊,請參閱Allowed unsigned attributes。final String unsignedAttrPrefix = ":"; - 步驟 4:建立加密組態
-
下列範例定義代表 DynamoDB 資料表加密組態的
tableConfigs映射。此範例指定 DynamoDB 資料表名稱做為邏輯資料表名稱。當您第一次定義加密組態時,強烈建議指定您的 DynamoDB 資料表名稱做為邏輯資料表名稱。如需詳細資訊,請參閱DynamoDB AWS 資料庫加密 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
DynamoDbEncryptionInterceptortableConfigs中的 建立新的 。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 增強型用戶端並建立資料表
-
下列範例使用步驟 6 中建立的 AWS SDK DynamoDB 用戶端建立 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
下列範例示範如何使用低階 DynamoDB API 搭配 AWS KMS keyring,以自動加密和簽署具有 DynamoDB PutItem請求的用戶端項目。
您可以使用任何支援的 keyring,但我們建議您盡可能使用其中一個 AWS KMS keyring。
請參閱完整的程式碼範例:BasicPutGetExample.java
- 步驟 1:建立 AWS KMS keyring
-
下列範例使用
CreateAwsKmsMrkMultiKeyring建立具有對稱加密 KMS 金鑰的 AWS KMS keyring。CreateAwsKmsMrkMultiKeyring方法可確保 keyring 可正確處理單一區域和多區域金鑰。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 資料表加密組態
-
下列範例會定義代表此 DynamoDB 資料表加密組態的
tableConfigs映射。此範例會將 DynamoDB 資料表名稱指定為邏輯資料表名稱。當您第一次定義加密組態時,強烈建議指定您的 DynamoDB 資料表名稱做為邏輯資料表名稱。如需詳細資訊,請參閱DynamoDB AWS 資料庫加密 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 -
下列範例
DynamoDbEncryptionInterceptor使用步驟 4tableConfigs中的 建立 。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
下列範例示範如何使用較低層級DynamoDbItemEncryptor的 AWS KMS keyring 來直接加密和簽署資料表項目。DynamoDbItemEncryptor 不會將項目放在 DynamoDB 資料表中。
您可以搭配 DynamoDB 增強型用戶端使用任何支援的 keyring,但我們建議您盡可能使用其中一個 AWS KMS keyring。
注意
較低層級DynamoDbItemEncryptor不支援可搜尋的加密。使用 DynamoDbEncryptionInterceptor搭配低階 DynamoDB API,以使用可搜尋的加密。
請參閱完整的程式碼範例:I ItemEncryptDecryptExample.java
- 步驟 1:建立 AWS KMS keyring
-
下列範例使用
CreateAwsKmsMrkMultiKeyring建立具有對稱加密 KMS 金鑰的 AWS KMS keyring。CreateAwsKmsMrkMultiKeyring方法可確保 keyring 可正確處理單一區域和多區域金鑰。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 資料表名稱做為邏輯資料表名稱。如需詳細資訊,請參閱DynamoDB AWS 資料庫加密 SDK 中的加密組態。
final DynamoDbItemEncryptorConfig config = DynamoDbItemEncryptorConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .attributeActionsOnEncrypt(attributeActionsOnEncrypt) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .build(); - 步驟 5:建立
DynamoDbItemEncryptor -
下列範例
DynamoDbItemEncryptor使用步驟 4config中的 建立新的 。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();