

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 更新您的数据模型
<a name="ddb-update-data-model"></a>


****  

|  | 
| --- |
| 我们的客户端加密库已重命名为 AWS 数据库加密 SDK。本开发人员指南仍提供有关 [DynamoDB 加密客户端](legacy-dynamodb-encryption-client.md)的信息。 | 

[在为 DynamoDB 配置 AWS 数据库加密 SDK 时，您需要提供属性操作。](concepts.md#crypt-actions)在加密时，D AWS atabase Encryption SDK 使用属性操作来识别哪些属性需要加密和签名，哪些属性需要签名（但不加密），哪些要忽略。您还可以定义[允许的未签名属性](ddb-java-using.md#allowed-unauth)以明确告诉客户端哪些属性被排除在签名之外。解密时， AWS 数据库加密 SDK 使用您定义的允许的未签名属性来识别签名中未包含哪些属性。属性操作不会保存在加密项目中， AWS 数据库加密 SDK 也不会自动更新您的属性操作。

仔细选择属性操作。如有怀疑，请使用 **Encrypt and sign (加密和签名)**。使用 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 层密钥环](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`加密操作，必须使用 AWS 数据库加密 SDK 的 3.3 或更高版本。在[更新要包含的数据模型之前，先将](#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`注释添加新属性。

**使用对象模型**  
如果您手动定义了属性操作，请将新属性添加到对象模型中的属性操作中，并指定`ENCRYPT_AND_SIGN``SIGN_ONLY`、或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`作为属性操作。

## 移除现有属性
<a name="ddb-remove-attribute"></a>

如果您决定不再需要某个属性，则可以停止向该属性写入数据，或者将其正式从属性操作中移除。当您停止向某个属性写入新数据时，该属性仍会显示在您的属性操作中。如果您将来需要重新开始使用该属性，则此操作可能会帮到您。正式从属性操作中移除属性并不能将其从数据集中移除。您的数据集仍将包含具有该属性的项目。

要正式移除现有`ENCRYPT_AND_SIGN``SIGN_ONLY``SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`、或`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`，请更新现有属性，以便在带`@DynamoDBEncryptionSignAndIncludeInEncryptionContext`注释的数据类中包含`@DynamoDBEncryptionSignOnly`或注释。

**使用对象模型**  
如果您手动定义了属性操作，请将与现有属性关联的属性操作从对象模型更新`ENCRYPT_AND_SIGN`为`SIGN_ONLY`或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`在对象模型中。

## 将现有`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_ONLY` 更新为 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。

## 将现有的 `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_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 更新为 `SIGN_ONLY`。