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 版的資訊。如需詳細資訊,請參閱AWS 資料庫加密 SDK for DynamoDB 版本支援

本主題說明在 Java 中可能無法在其他程式設計語言實作中找到的 DynamoDB 加密用戶端的一些功能。

如需使用 DynamoDB 加密用戶端進行程式設計的詳細資訊,請參閱 Java 範例、GitHub aws-dynamodb-encryption-java repository上 中的範例,以及 DynamoDB 加密用戶端的 Javadoc

項目加密程式:DynamoDBEncryptor

Java 中的 DynamoDB 加密用戶端有一個項目加密程式:較低層級的 DynamoDBEncryptor

Java 中的屬性動作

屬性動作決定哪些屬性值會加密並簽署,哪些屬性值只會簽署,以及哪些屬性值會予忽略。

重要

使用屬性動作加密表格項目後,從資料模型新增或移除屬性可能會導致簽章驗證錯誤,讓您無法解密資料。如需更詳細的說明,請參閱變更您的資料模型

若要在您直接使用 DynamoDBEncryptor 時指定屬性動作,請建立 HashMap 物件,其中的名稱值組代表屬性名稱和指定的動作。

屬性動作的有效值會定義於 EncryptionFlags 列舉類型中。您可以同時使用 ENCRYPTSIGN、單獨使用 SIGN,或省略兩者。不過,如果您ENCRYPT單獨使用 ,DynamoDB 加密用戶端會擲回錯誤。您無法加密您未簽署的屬性。

ENCRYPT SIGN
警告

請勿加密主索引鍵的屬性。它們必須保持純文字,以便 DynamoDB 可以在不執行完整資料表掃描的情況下找到項目。

如果您在加密內容中指定主金鑰,然後在任一主金鑰屬性的屬性動作ENCRYPT中指定 ,則 DynamoDB 加密用戶端會擲回例外狀況。

例如,下列 Java 程式碼會建立 actions HashMap,該 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: // no break; falls through to next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Don't encrypt or sign break; default: // Encrypt and sign everything else actions.put(attributeName, encryptAndSign); break; } }

然後,當您呼叫 的 encryptRecord 方法時DynamoDBEncryptor,請將映射指定為 attributeFlags 參數的值。例如,encryptRecord 的這項呼叫會使用 actions 映射。

// Encrypt the plaintext record final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);

覆寫表格名稱

在 DynamoDB 加密用戶端中,DynamoDB 資料表的名稱是傳遞給加密和解密方法的 DynamoDB 加密內容元素。當您加密或簽署資料表項目時,DynamoDB 加密內容會以密碼編譯方式繫結至加密文字,包括資料表名稱。如果傳遞至解密方法的 DynamoDB 加密內容與傳遞至加密方法的 DynamoDB 加密內容不相符,解密操作會失敗。

有時候,表格的名稱會發生變更,例如當您備份表格或執行時間點復原時。當您解密或驗證這些項目的簽章時,您必須傳入用來加密和簽署項目的相同 DynamoDB 加密內容,包括原始資料表名稱。目前的表格名稱是不需要的。

使用 時DynamoDBEncryptor,您可以手動組合 DynamoDB 加密內容。因此,如果您使用的是 ,請勿使用資料表名稱覆寫運算子DynamoDBEncryptor。請改為使用原始表格名稱建立加密內容,並將其提交至解密方法。