本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
适用于 Python 的 DynamoDB 加密客户端的示例代码
注意
我们的客户端加密库已重命名为 “ AWS 数据库加密 SDK”。以下主题提供有关适用于 Java 的 DynamoDB 加密客户端版本 1.x—2.x 以及适用于 Python 的 DynamoDB 加密客户端版本 1.x—3.x 的信息。有关更多信息,请参阅 DynamoDB 版本支持的AWS 数据库加密SDK。
以下示例为您演示如何使用适用于 Python 的 DynamoDB 加密客户端来保护应用程序中的 DynamoDB 数据。你可以在上aws-dynamodb-encryption-python
使用 EncryptedTable 客户端帮助器类
以下示例向您展示了如何将直接KMS提供程序与EncryptedTable
客户端帮助程序类一起使用。此示例使用相同的加密材料提供程序,如使用项目加密程序示例所示。但是,它使用的是 EncryptedTable
类,而不是与低级别项目加密程序直接交互。
通过比较这些示例,您可以看到客户端帮助程序类为您执行的工作。这包括创建 DynamoDB 加密上下文和确保始终为主键属性签名,但绝不加密。要创建加密上下文并发现主密钥,客户端帮助程序类会调用 DynamoDB 操作DescribeTable。要运行此代码,您必须具有调用此操作的权限。
请参阅完整的代码示例:aws_kms_encrypted_table.py
- 步骤 1:创建表
-
首先使用表名称创建标准 DynamoDB 表的实例。
table_name='test-table' table = boto3.resource('dynamodb').Table(
table_name
) - 步骤 2:创建加密材料提供程序
-
创建您选择的加密材料提供商 (CMP) 的实例。
此示例使用直接KMS提供程序,但您可以使用任何兼容的提供商CMP。要创建直接KMS提供商,请指定AWS KMS key。此示例使用的 Amazon 资源名称 (ARN) AWS KMS key,但您可以使用任何有效的密钥标识符。
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=
kms_key_id
) - 步骤 3:创建属性操作对象
-
属性操作告知项目加密程序将对项目的每个属性执行哪些操作。此示例中的
AttributeActions
对象加密并签名所有项目,除test
属性以外,后者已被忽略。请勿在使用客户端帮助程序类时为主键属性指定属性操作。
EncryptedTable
类会签名但绝不加密主键属性。actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} )
- 步骤 4:创建加密表
-
使用标准表、直接KMS提供程序和属性操作创建加密表。此步骤将完成配置。
encrypted_table = EncryptedTable( table=table, materials_provider=kms_cmp, attribute_actions=actions )
- 步骤 5:将明文项目放入表中
-
在对
encrypted_table
调用put_item
方法时,您的表项目会以透明方式加密、签名并添加到您的 DynamoDB 表。首先,定义表项目。
plaintext_item = { 'partition_attribute': 'value1', 'sort_attribute': 55 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }
然后,请项目放入表中。
encrypted_table.put_item(Item=plaintext_item)
要从采用加密形式的 DynamoDB 表中获取该项目,请对 table
对象调用 get_item
方法。要获取已解密的项目,请对 get_item
对象调用 encrypted_table
方法。
使用项目加密程序
此示例向您展示在加密表项目时如何直接与 DynamoDB 加密客户端中的项目加密程序交互,而不是使用与项目加密程序交互的客户端帮助程序类。
使用此方法时,将手动创建 DynamoDB 加密上下文和配置对象(CryptoConfig
)。此外,您还会在加密一个调用中的项目并将它们放置在您在单独调用中的 DynamoDB 表中。这允许您自定义 put_item
调用并使用 DynamoDB 加密客户端来加密并签名绝不发送 DynamoDB 的结构化数据。
此示例使用直接KMS提供程序,但您可以使用任何兼容的提供商CMP。
请参阅完整的代码示例:aws_kms_encrypted_item.py
- 步骤 1:创建表
-
首先使用表名称创建标准 DynamoDB 表资源的实例。
table_name='test-table' table = boto3.resource('dynamodb').Table(
table_name
) - 步骤 2:创建加密材料提供程序
-
创建您选择的加密材料提供商 (CMP) 的实例。
此示例使用直接KMS提供程序,但您可以使用任何兼容的提供商CMP。要创建直接KMS提供商,请指定AWS KMS key。此示例使用的 Amazon 资源名称 (ARN) AWS KMS key,但您可以使用任何有效的密钥标识符。
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=
kms_key_id
) - 第 3 步:使用 TableInfo 帮助器类
-
要从 DynamoDB 获取有关表的信息,请创建帮助类的实例。TableInfo当您直接使用项目加密程序时,需要创建一个
TableInfo
实例并调用其方法:客户端帮助程序类可为您执行此操作。的
refresh_indexed_attributes
方法TableInfo
使用 DescribeTableDynamoDB 操作来获取有关表的实时、准确的信息。这包括其主键及其本地和全局二级索引。调用方需要具有调用DescribeTable
的权限。table_info = TableInfo(name=
table_name
) table_info.refresh_indexed_attributes(table.meta.client) - 步骤 4:创建 DynamoDB 加密上下文
-
DynamoDB 加密上下文包含有关表结构以及其如何加密和签名的信息。此示例明确创建 DynamoDB 密上下文,因为它与项目加密程序交互。客户端帮助程序类为您创建 DynamoDB 加密上下文。
要获取分区键和排序键,可以使用TableInfo辅助类的属性。
index_key = { 'partition_attribute': 'value1', 'sort_attribute': 55 } encryption_context = EncryptionContext( table_name=
table_name
, partition_key_name=table_info.primary_index.partition, sort_key_name=table_info.primary_index.sort, attributes=dict_to_ddb(index_key) ) - 步骤 5:创建属性操作对象
-
属性操作告知项目加密程序将对项目的每个属性执行哪些操作。此示例中的
AttributeActions
对象加密并签名所有项目,除已签名但未加密的主键属性和已被忽略的test
属性以外。当您与项目加密程序直接交互且您的默认操作为
ENCRYPT_AND_SIGN
时,您必须为主键指定一个替代操作。您可以使用set_index_keys
方法,该方法对主键使用SIGN_ONLY
;如果是默认操作,也可以使用DO_NOTHING
。为了指定主键,此示例使用TableInfo对象中的索引键,该索引键通过调用 DynamoDB 来填充。此方法要比硬编码主键名称更加安全。
actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} ) actions.set_index_keys(*table_info.protected_index_keys())
- 步骤 6:创建项目的配置
-
要配置 DynamoDB 加密客户端,请使用您刚才在表项目的配置中CryptoConfig
创建的对象。客户端帮助程序类 CryptoConfig 为您创建。 crypto_config = CryptoConfig( materials_provider=kms_cmp, encryption_context=encryption_context, attribute_actions=actions )
- 步骤 7:加密项目
-
此步将加密并签名项目,但不会将项目放入 DynamoDB 表中。
当您使用客户端帮助程序类时,您的项目会以透明方式加密并签名,然后在您调用帮助程序类的
put_item
方法时添加到您的 DynamoDB 表。当您直接使用项目加密程序时,encrypt 和 put 操作是相互独立的。首先,创建一个明文项目。
plaintext_item = { 'partition_attribute': 'value1', 'sort_key': 55, 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }
然后,对该项目进行加密和签名。
encrypt_python_item
方法需要CryptoConfig
配置对象。encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
- 步骤 8:将项目放入表中
-
此步会将已加密且签名的项目放入 DynamoDB 表中。
table.put_item(Item=encrypted_item)
要查看加密项目,请对原始 get_item
对象调用 table
方法,而不是对 encrypted_table
对象。它会从 DynamoDB 表获取该项目,无需验证和解密它。
encrypted_item = table.get_item(Key=partition_key)['Item']
下图展示了一个已加密且签名的示例表项目的一部分。
加密属性值为二进制数据。主键属性 (partition_attribute
和 sort_attribute
) 和 test
属性的名称和值保持明文形式。输出还显示包含签名 (*amzn-ddb-map-sig*
) 的属性和材料描述属性 (*amzn-ddb-map-desc*
)。