

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

# 更新資料模型
<a name="ddb-update-data-model"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

當您設定 DynamoDB 的 AWS 資料庫加密 SDK 時，您會提供[屬性動作](concepts.md#crypt-actions)。加密時， AWS 資料庫加密 SDK 會使用屬性動作來識別要加密和簽署的屬性、要簽署的屬性 （但不加密），以及要忽略的屬性。您也可以定義[允許的未簽章屬性](ddb-java-using.md#allowed-unauth)，以明確告知用戶端哪些屬性已從簽章中排除。在解密時， AWS 資料庫加密 SDK 會使用您定義的允許未簽章屬性，來識別簽章中未包含哪些屬性。屬性動作不會儲存在加密的項目中，資料庫 AWS 加密 SDK 不會自動更新您的屬性動作。

請仔細選擇屬性動作。如有疑問，請使用**加密並簽署**。使用 AWS 資料庫加密 SDK 保護您的項目之後，您無法將現有的 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性變更為 `DO_NOTHING`。不過，您可以安全地進行下列變更。
+ [新增 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`和 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性](#ddb-add-auth-attribute)
+ [移除現有的屬性](#ddb-remove-attribute)
+ [將現有`ENCRYPT_AND_SIGN`屬性變更為 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`](#ddb-encrypt-to-sign)
+ [將現有 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性變更為 `ENCRYPT_AND_SIGN`](#ddb-sign-to-encrypt)
+ [新增`DO_NOTHING`屬性](#ddb-add-unauth-attribute)
+ [將現有`SIGN_ONLY`屬性變更為 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`](#ddb-signOnly-to-signInclude)
+ [將現有`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`屬性變更為 `SIGN_ONLY`](#ddb-signInclude-to-signOnly)

**可搜尋加密的考量事項**  
在更新資料模型之前，請仔細考慮您的更新如何影響您從屬性建構的任何[信標](beacons.md)。使用信標撰寫新記錄之後，您就無法更新信標的組態。您無法更新與您用來建構信標的屬性相關聯的屬性動作。如果您移除現有的屬性及其相關聯的信標，您將無法使用該信標查詢現有的記錄。您可以為新增至記錄的新欄位建立新的信標，但無法更新現有的信標以包含新欄位。

**`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性的考量事項**  
根據預設，分割區和排序索引鍵是加密內容中包含的唯一屬性。您可以考慮定義其他欄位，`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`以便[AWS KMS 階層式 keyring](use-hierarchical-keyring.md) 的分支金鑰 ID 供應商可以識別從加密內容解密所需的分支金鑰。如需詳細資訊，請參閱[分支金鑰 ID 供應商](use-hierarchical-keyring.md#branch-key-id-supplier)。如果您指定任何`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`屬性，則分割區和排序屬性也必須是 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。

**注意**  
若要使用`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`密碼編譯動作，您必須使用 3.3 版或更新版本的 AWS 資料庫加密 SDK。將[您的資料模型更新](#ddb-update-data-model)為包含 之前，將新版本部署至所有讀者`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。

## 新增 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`和 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性
<a name="ddb-add-auth-attribute"></a>

若要新增 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性，請在屬性動作中定義新的屬性。

您無法移除現有的`DO_NOTHING`屬性，並將其新增為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性。

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

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

## 移除現有的屬性
<a name="ddb-remove-attribute"></a>

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

若要正式移除現有的 `ENCRYPT_AND_SIGN`、`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`、 `SIGN_ONLY`或 `DO_NOTHING` 屬性，請更新您的屬性動作。

如果您移除`DO_NOTHING`屬性，則不得將該屬性從[允許的未簽章屬性](ddb-java-using.md#allowed-unauth)中移除。即使您不再將新值寫入該屬性，用戶端仍需要知道該屬性未簽署，才能讀取包含該屬性的現有項目。

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

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

## 將現有`ENCRYPT_AND_SIGN`屬性變更為 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`
<a name="ddb-encrypt-to-sign"></a>

若要將現有`ENCRYPT_AND_SIGN`屬性變更為 `SIGN_ONLY`或 `SIGN_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_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性變更為 `ENCRYPT_AND_SIGN`
<a name="ddb-sign-to-encrypt"></a>

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

**使用標註的資料類別**  
如果您使用 定義屬性動作`TableSchema`，請從現有屬性中移除 `@DynamoDBEncryptionSignOnly`或 `@DynamoDBEncryptionSignAndIncludeInEncryptionContext`註釋。

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

## 新增`DO_NOTHING`屬性
<a name="ddb-add-unauth-attribute"></a>

若要降低新增`DO_NOTHING`屬性時的錯誤風險，建議您在命名`DO_NOTHING`屬性時指定不同的字首，然後使用該字首定義[允許的未簽署屬性](ddb-java-using.md#allowed-unauth)。

您無法從註釋的資料類別中移除現有的 `ENCRYPT_AND_SIGN``SIGN_ONLY`、 或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 屬性，然後將 屬性新增為`DO_NOTHING`屬性。您只能新增全新的`DO_NOTHING`屬性。

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

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

**使用允許的未簽署屬性清單**

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

1. 從**步驟 1** 部署變更。

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

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

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

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

1. 從**步驟 3** 部署變更。

## 將現有`SIGN_ONLY`屬性變更為 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`
<a name="ddb-signOnly-to-signInclude"></a>

若要將現有`SIGN_ONLY`屬性變更為 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`，您必須更新您的屬性動作。部署更新之後，用戶端將能夠驗證寫入 屬性的現有值，並將繼續簽署寫入 屬性的新值。寫入 屬性的新值將包含在[加密內容](concepts.md#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`
<a name="ddb-signInclude-to-signOnly"></a>

若要將現有`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`屬性變更為 `SIGN_ONLY`，您必須更新您的屬性動作。部署更新之後，用戶端將能夠驗證寫入 屬性的現有值，並將繼續簽署寫入 屬性的新值。寫入 屬性的新值不會包含在[加密內容](concepts.md#encryption-context)中。

在將現有`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`屬性變更為 之前`SIGN_ONLY`，請仔細考慮您的更新如何影響[分支金鑰 ID 供應商](use-hierarchical-keyring.md#branch-key-id-supplier)的功能。

**使用標註的資料類別**  
如果您使用 定義屬性動作`TableSchema`，請將與屬性相關聯的屬性動作從 更新`@DynamoDBEncryptionSignAndIncludeInEncryptionContext`為 `@DynamoDBEncryptionSignOnly`。

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