更新您的資料模型 - AWS 資料庫加密 SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

更新您的資料模型

我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍會提供 DynamoDB Encryption Client 的相關資訊。

當您設定 DynamoDB 的 AWS 資料庫加密 SDK 時,您會提供屬性動作。加密時, AWS Database Encryption SDK 會使用屬性動作來識別要加密和簽署的屬性、要簽署的屬性 (但不要加密),以及要忽略的屬性。您也可以定義允許的未簽章屬性,明確告知用戶端哪些屬性會從簽章中排除。在解密時, AWS 資料庫加密 SDK 會使用您定義的允許未簽章屬性,來識別簽章中不包含哪些屬性。屬性動作不會儲存在加密的項目中,資料庫 AWS 加密 SDK 不會自動更新您的屬性動作。

請仔細選擇屬性動作。如有疑問,請使用加密並簽署。使用 AWS Database Encryption SDK 保護您的項目之後,您無法將現有的 ENCRYPT_AND_SIGNSIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 屬性變更為 DO_NOTHING。不過,您可以安全地進行下列變更。

可搜尋加密的考量事項

在更新資料模型之前,請仔細考慮您的更新如何影響您從屬性建構的任何信標。使用信標寫入新記錄之後,您就無法更新信標的組態。您無法更新與您用來建構信標的屬性相關聯的屬性動作。如果您移除現有的屬性及其相關聯的信標,您將無法使用該信標查詢現有的記錄。您可以為新增至記錄的新欄位建立新的信標,但無法更新現有的信標以包含新欄位。

SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 屬性的考量

根據預設,分割區和排序索引鍵是加密內容中包含的唯一屬性。您可以考慮定義其他欄位,SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT以便AWS KMS 階層式 keyring 的分支金鑰 ID 供應商可以識別從加密內容解密所需的分支金鑰。如需詳細資訊,請參閱分支金鑰 ID 供應商。如果您指定任何SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性,則分割區和排序屬性也必須是 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

注意

若要使用SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT密碼編譯動作,您必須使用 3.3 版或更新版本的 AWS 資料庫加密 SDK。將您的資料模型更新為包含 之前,先將新版本部署至所有讀取器SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

新增 ENCRYPT_AND_SIGNSIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 屬性

若要新增 ENCRYPT_AND_SIGNSIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 屬性,請在屬性動作中定義新屬性。

您無法移除現有的DO_NOTHING屬性,並將其新增為 ENCRYPT_AND_SIGNSIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 屬性。

使用註釋的資料類別

如果您使用 定義屬性動作TableSchema,請將新屬性新增至註釋的資料類別。如果您未指定新屬性的屬性動作註釋,用戶端預設會加密和簽署新屬性 (除非屬性是主索引鍵的一部分)。如果您只想要簽署新屬性,則必須使用 @DynamoDBEncryptionSignOnly@DynamoDBEncryptionSignAndIncludeInEncryptionContext註釋新增新屬性。

使用物件模型

如果您手動定義屬性動作,請將新屬性新增至物件模型中的屬性動作SIGN_ONLY,並指定 ENCRYPT_AND_SIGN、 或 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT作為屬性動作。

移除現有屬性

如果您決定不再需要 屬性,您可以停止將資料寫入該屬性,也可以正式將其從屬性動作中移除。當您停止將新資料寫入屬性時,屬性仍會出現在屬性動作中。如果您未來需要再次開始使用 屬性,這會很有幫助。正式移除屬性動作中的屬性不會將其從資料集中移除。您的資料集仍會包含包含該屬性的項目。

若要正式移除現有的 ENCRYPT_AND_SIGNSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXTSIGN_ONLYDO_NOTHING 屬性,請更新您的屬性動作。

如果您移除DO_NOTHING屬性,則不得將該屬性從允許的未簽章屬性中移除。即使您不再將新值寫入該屬性,用戶端仍需要知道該屬性未簽署,以讀取包含該屬性的現有項目。

使用註釋的資料類別

如果您使用 定義屬性動作TableSchema,請從註釋的資料類別中移除 屬性。

使用物件模型

如果您手動定義屬性動作,請從物件模型中的屬性動作中移除屬性。

將現有ENCRYPT_AND_SIGN屬性變更為 SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

若要將現有ENCRYPT_AND_SIGN屬性變更為 SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,您必須更新您的屬性動作。部署更新之後,用戶端將能夠驗證和解密寫入屬性的現有值,但只會簽署寫入屬性的新值。

注意

在將現有ENCRYPT_AND_SIGN屬性變更為 SIGN_ONLY或 之前,請仔細考慮您的安全需求SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT。任何可存放敏感資料的屬性都應該加密。

使用註釋的資料類別

如果您使用 定義屬性動作TableSchema,請更新現有的屬性,將 @DynamoDBEncryptionSignOnly@DynamoDBEncryptionSignAndIncludeInEncryptionContext註釋包含在註釋的資料類別中。

使用物件模型

如果您手動定義屬性動作,請將與現有屬性相關聯的屬性動作從 更新ENCRYPT_AND_SIGN為 物件模型SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT中的 SIGN_ONLY或 。

將現有SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性變更為 ENCRYPT_AND_SIGN

若要將現有SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性變更為 ENCRYPT_AND_SIGN,您必須更新您的屬性動作。部署更新之後,用戶端將能夠驗證寫入屬性的現有值,並將加密和簽署寫入屬性的新值。

使用註釋的資料類別

如果您使用 定義屬性動作TableSchema,請從現有屬性中移除 @DynamoDBEncryptionSignOnly@DynamoDBEncryptionSignAndIncludeInEncryptionContext註釋。

使用物件模型

如果您手動定義屬性動作,請在物件模型ENCRYPT_AND_SIGN中將與屬性相關聯的屬性動作從 SIGN_ONLY或 更新SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT為 。

新增DO_NOTHING屬性

若要降低新增DO_NOTHING屬性時的錯誤風險,建議您在命名DO_NOTHING屬性時指定不同的字首,然後使用該字首來定義允許的未簽署屬性

您無法從註釋的資料類別中移除現有的 ENCRYPT_AND_SIGNSIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 屬性,然後將 屬性新增回DO_NOTHING屬性。您只能新增全新的DO_NOTHING屬性。

您新增DO_NOTHING屬性所採取的步驟,取決於您在清單中明確定義允許的未簽章屬性,還是使用字首。

使用允許的未簽署屬性字首

如果您使用 定義屬性動作TableSchema,請使用 @DynamoDBEncryptionDoNothing註釋將新DO_NOTHING屬性新增至註釋的資料類別。如果您手動定義屬性動作,請更新您的屬性動作以包含新的屬性。請務必使用 屬性DO_NOTHING動作明確設定新屬性。您必須在新屬性的名稱中包含相同的不同字首。

使用允許的未簽署屬性清單
  1. 將新DO_NOTHING屬性新增至允許的未簽章屬性清單,並部署更新的清單。

  2. 步驟 1 部署變更。

    在變更傳播到需要讀取此資料的所有主機之前,您無法繼續進行步驟 3

  3. 將新DO_NOTHING屬性新增至您的屬性動作。

    1. 如果您使用 定義屬性動作TableSchema,請使用 @DynamoDBEncryptionDoNothing註釋將新DO_NOTHING屬性新增至註釋的資料類別。

    2. 如果您手動定義屬性動作,請更新您的屬性動作以包含新的屬性。請務必使用 屬性動作明確設定新DO_NOTHING屬性。

  4. 步驟 3 部署變更。

將現有SIGN_ONLY屬性變更為 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

若要將現有SIGN_ONLY屬性變更為 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,您必須更新您的屬性動作。部署更新之後,用戶端將能夠驗證寫入屬性的現有值,並將繼續簽署寫入屬性的新值。寫入屬性的新值將包含在加密內容中。

如果您指定任何SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性,則分割區和排序屬性也必須是 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

使用註釋的資料類別

如果您使用 定義屬性動作TableSchema,請將與屬性相關聯的屬性動作從 更新@DynamoDBEncryptionSignOnly@DynamoDBEncryptionSignAndIncludeInEncryptionContext

使用物件模型

如果您手動定義屬性動作,請在物件模型SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT中將與屬性相關聯的屬性動作從 更新SIGN_ONLY為 。

將現有SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性變更為 SIGN_ONLY

若要將現有SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性變更為 SIGN_ONLY,您必須更新您的屬性動作。部署更新之後,用戶端將能夠驗證寫入屬性的現有值,並將繼續簽署寫入屬性的新值。寫入屬性的新值不會包含在加密內容中。

在將現有SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性變更為 之前SIGN_ONLY,請仔細考慮您的更新如何影響分支金鑰 ID 供應商的功能。

使用註釋的資料類別

如果您使用 定義屬性動作TableSchema,請將與屬性相關聯的屬性動作從 更新@DynamoDBEncryptionSignAndIncludeInEncryptionContext@DynamoDBEncryptionSignOnly

使用物件模型

如果您手動定義屬性動作,請在物件模型SIGN_ONLY中將與屬性相關聯的屬性動作從 更新SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT為 。