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

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

更新您的資料模型

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

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

請仔細選擇屬性動作。如有疑問,請使用加密並簽署。使用 AWS 資料庫加密 SDK 來保護您的項目之後,您就無法將現有的ENCRYPT_AND_SIGNSIGN_ONLY、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性變更為DO_NOTHING。但是,您可以放心地進行以下更改。

可搜尋加密的考量

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

SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性的考量

依預設,分割區和排序索引鍵是加密內容中包含的唯一屬性。您可以考慮定義其他欄位,以SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT便AWS KMS 階層式金鑰圈的分支金鑰 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_ONLY、和SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性

欲新增ENCRYPT_AND_SIGN、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性SIGN_ONLY,請在屬性動作中定義新屬性。

您無法移除現有DO_NOTHING屬性並將其新增回為ENCRYPT_AND_SIGNSIGN_ONLY、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性。

使用註釋的數據類

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

使用物件模型

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

移除現有屬性

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

欲正式移除現有ENCRYPT_AND_SIGNSIGN_ONLY、或DO_NOTHING屬性SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT,請更新您的屬性動作。

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

使用註釋的數據類

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

使用物件模型

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

將現有ENCRYPT_AND_SIGN屬性變更為SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

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

注意

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

使用註釋的數據類

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

使用物件模型

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

將現有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_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT更新與屬性相關聯的屬性動作。

新增DO_NOTHING屬性

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

您無法從已註解的資料類別中移除現有ENCRYPT_AND_SIGNSIGN_ONLY、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT屬性,然後再將屬性新增回來作為DO_NOTHING屬性。您只能新增全新DO_NOTHING屬性。

您要新增DO_NOTHING屬性所採取的步驟,取決於您是否在清單中明確定義了允許的未簽署屬性,還是使用前置詞定義。

使用允許的未簽名屬性前綴

如果您使用 a 定義了屬性動作TableSchema,請使用註釋將新DO_NOTHING屬性添加到帶@DynamoDBEncryptionDoNothing註釋的數據類中。如果您手動定義屬性動作,請更新屬性動作以包含新屬性。請務必使用屬性動作明確配置新DO_NOTHING屬性。您必須在新屬性的名稱中包含相同的不同前綴。

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

  2. 步驟 1 部署變更。

    在變更已傳播到需要讀取此資料的所有主機之前,您無法移至步驟 3

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

    1. 如果您使用 a 定義了屬性動作TableSchema,請使用註釋將新DO_NOTHING屬性添加到帶@DynamoDBEncryptionDoNothing註釋的數據類中。

    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

使用註釋的數據類

如果您使用 a 定義了屬性動作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 供應商的功能造成什麼影響。

使用註釋的數據類

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

使用物件模型

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