更新您的数据模型 - AWS 数据库加密 SDK

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

更新您的数据模型

我们的客户端加密库已重命名为 AWS 数据库加密SDK。本开发人员指南仍提供有关 DynamoDB 加密客户端的信息。

在为 DynamoDB 配置 AWS 数据库加密时,您需要SDK提供属性操作。加密时, AWS 数据库加密SDK使用属性操作来识别要加密和签名的属性、要签名(但不加密)的属性以及要忽略哪些属性。您还可以定义允许的未签名属性以明确告诉客户端哪些属性被排除在签名之外。解密时, AWS 数据库加密SDK使用您定义的允许的未签名属性来标识签名中未包含哪些属性。属性操作不会保存在加密项目中, AWS 数据库加密SDK也不会自动更新您的属性操作。

仔细选择属性操作。如有怀疑,请使用 Encrypt and sign (加密和签名)。使用 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_SIGNSIGN_ONLY、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT属性,请在属性操作中定义新属性。

您不能移除现有DO_NOTHING属性并将其作为ENCRYPT_AND_SIGNSIGN_ONLY、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT属性重新添加。

使用带注释的数据类

如果您使用 TableSchema 定义了属性操作,则请将新的属性添加到带注释的数据类中。如果您没有为新属性指定属性操作注释,则默认情况下,客户端将对新属性进行加密和签名(除非该属性是主键的一部分)。如果您只想对新属性进行签名,则必须使用@DynamoDBEncryptionSignOnly@DynamoDBEncryptionSignAndIncludeInEncryptionContext注释添加新属性。

使用对象模型

如果您手动定义了属性操作,请将新属性添加到对象模型中的属性操作中,并指定ENCRYPT_AND_SIGNSIGN_ONLY、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT作为属性操作。

移除现有属性

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

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

使用对象模型

如果您手动定义了属性操作,请将与现有属性关联的属性操作从对象模型更新ENCRYPT_AND_SIGNSIGN_ONLYSIGN_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 属性的步骤取决于您是在列表中明确定义允许的未签名属性还是使用前缀对其进行定义。

使用允许的未签名属性前缀

如果您使用 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_ONLY 更新为 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

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