使用适用于 Python 的 DynamoDB 加密客户端 - AWS 数据库加密 SDK

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

使用适用于 Python 的 DynamoDB 加密客户端

注意

我们的客户端加密库已重命名为 AWS 数据库加密SDK。以下主题提供有关适用于 Java 的 DynamoDB 加密客户端版本 1.x—2.x 以及适用于 Python 的 DynamoDB 加密客户端版本 1.x—3.x 的信息。有关更多信息,请参阅 DynamoDB 版本支持的AWS 数据库加密SDK

本主题介绍了适用于 Python 的 DynamoDB 加密客户端的可能在其他编程语言实施中找不到的一些功能。这些功能旨在更轻松地以最安全的方式使用 DynamoDB 加密客户端。除非您有不寻常的使用案例,否则我们建议您使用这些功能。

有关使用 DynamoDB 加密客户端进行编程的详细信息,请参阅本指南中的 Python 示例、存储库 GitHub中的 aws-dynamodb-encryption-python 示例以及 DynamoDB 加密客户端的 Python 文档。

客户端帮助程序类

适用于 Python 的 DynamoDB 加密客户端包括多个对 DynamoDB 的 Boto 3 类进行镜像的客户端帮助程序类。这些帮助程序类旨在更轻松地向您的现有 DynamoDB 应用程序添加加密和签名并且避免最常见问题,如下所示:

  • 通过向对象添加主密钥的覆盖操作,或者在您的AttributeActionsAttributeActions对象明确要求客户端加密主密钥时抛出异常,防止您对项目中的主密钥进行加密。如果您的 AttributeActions 对象中的默认操作为 DO_NOTHING,则客户端帮助程序类会对主键使用该操作。否则,它们使用 SIGN_ONLY

  • 创建TableInfo 对象并根据对 Dynamo DB 的调用填充 DynamoDB 加密上下文。这有助于确保您的 DynamoDB 加密上下文准确且客户端可以标识主键。

  • 支持方法(如 put_itemget_item),这些方法在您在 DynamoDB 表中写入或读取时会以透明方式加密和解密表项目。仅不支持 update_item 方法。

您可以使用客户端帮助程序类而不是直接与较低级别的项目加密程序交互。除非您需要在项目加密程序中设置高级选项,否则使用这些类。

客户端帮助程序类包括:

要使用客户端帮助程序类,调用者必须具有在目标表上调用 Dynam DescribeTableoDB 操作的权限。

TableInfo 班级

TableInfo类是一个代表一个 DynamoDB 表的辅助类,其中包含用于其主键和二级索引的字段。它有助于您获取有关表的准确的实时信息。

如果您使用的是客户端帮助程序类,它会为您创建并使用 TableInfo 对象。否则,您可以明确创建一个。有关示例,请参阅使用项目加密程序

当您在TableInfo对象上调用该refresh_indexed_attributes方法时,它会通过调用 DynamoDB DescribeTable操作来填充该对象的属性值。查询表要比硬编码索引名称更加可靠。TableInfo 类还包括 encryption_context_values 属性,该属性提供了 DynamoDB 加密上下文所需的值。

要使用该refresh_indexed_attributes方法,调用者必须具有在目标表上调用 Dynam DescribeTableoDB 操作的权限。

Python 中的属性操作

属性操作告知项目加密程序将对项目的每个属性执行哪些操作。要在 Python 中指定属性操作,请创建具有默认操作和针对特定属性的任何例外的 AttributeActions 对象。有效值将在 CryptoAction 枚举类型中定义。

重要

使用属性操作对表项进行加密后,在数据模型中添加或删除属性可能会导致签名验证错误,从而使您无法解密数据。有关详细说明,请参阅更改数据模型

DO_NOTHING = 0 SIGN_ONLY = 1 ENCRYPT_AND_SIGN = 2

例如,此 AttributeActions 对象建立 ENCRYPT_AND_SIGN 作为所有属性的默认值,并且指定 ISBNPublicationYear 属性的例外。

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={ 'ISBN': CryptoAction.DO_NOTHING, 'PublicationYear': CryptoAction.SIGN_ONLY } )

如果您使用的是客户端帮助程序类,则无需指定主键属性的属性操作。该客户端帮助程序类阻止您加密主键。

如果您未使用客户端帮助程序类且默认操作为 ENCRYPT_AND_SIGN,则必须为主键指定操作。对主键建议的操作为 SIGN_ONLY。为了简化此操作,请使用set_index_keys方法,该方法使用 SIGN _ ONLY 作为主键,如果这是默认操作NOTHING,则使用DO_。

警告

请勿加密主键属性。它们必须保留为明文,以便 DynamoDB 查找项目而无需运行全表扫描。

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, ) actions.set_index_keys(*table_info.protected_index_keys())