

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

# Amazon DynamoDB Encryption Client 概念
<a name="DDBEC-legacy-concepts"></a>

**注意**  
我们的客户端加密库已[重命名为 AWS 数据库加密 SDK](DDBEC-rename.md)。以下主题提供有关适用于 Java 的 DynamoDB 加密客户端版本 1.*x*—2.*x* 以及适用于 Python 的 DynamoDB 加密客户端版本 1.*x*—3.*x* 的信息。有关更多信息，请参阅[适用于 DynamoDB 的AWS 数据库加密 SDK 版本支持](legacy-dynamodb-encryption-client.md#legacy-support)。

本主题介绍 Amazon DynamoDB Encryption Client 中使用的概念和术语。

要了解 DynamoDB 加密客户端的组件如何交互，请参阅 [DynamoDB 加密客户端的工作原理](DDBEC-legacy-how-it-works.md)。

**Topics**
+ [加密材料提供程序 (CMP)](#concept-material-provider)
+ [项目加密程序](#item-encryptor)
+ [属性操作](#legacy-attribute-actions)
+ [材料描述](#legacy-material-description)
+ [DynamoDB 加密上下文](#legacy-encryption-context)
+ [提供程序存储](#provider-store)

## 加密材料提供程序 (CMP)
<a name="concept-material-provider"></a>

在实施 DynamoDB 加密客户端时，第一批任务中有一个任务是[选择加密材料提供程序](crypto-materials-providers.md)（CMP）（又称为*加密材料提供程序*）。您的选择决定了剩下的大部分实施操作。

*加密材料提供程序* (CMP) 收集、汇编并返回[项目加密程序](#item-encryptor)用于为表项目加密和签名的加密材料。CMP 确定要使用的加密算法以及如何生成和保护加密和签名密钥。

CMP 与项目加密程序交互。项目加密程序从 CMP 请求加密或解密材料，而 CMP 将这些材料返回给项目加密程序。然后，项目加密程序使用加密材料为项目加密和签名，或验证和解密项目。

在配置客户端时指定 CMP。您可以创建兼容的自定义 CMP，也可以使用库 CMPs 中的众多自定义 CMP 之一。大多数 CMPs 都适用于多种编程语言。

## 项目加密程序
<a name="item-encryptor"></a>

*项目加密程序*是为 DynamoDB 加密客户端执行加密操作的低级别组件。它从[加密材料提供程序](#concept-material-provider) (CMP) 请求加密材料，然后使用 CMP 返回的材料为表项目加密和签名，或验证和解密表项目。

可以直接与项目加密程序交互或使用库提供的帮助程序。例如，适用于 Java 的 DynamoDB 加密客户端包含可与 `DynamoDBMapper` 一起使用的 `AttributeEncryptor` 帮助程序类，而不是直接与 `DynamoDBEncryptor` 项目加密程序交互。Python 库包含与项目加密程序交互的 `EncryptedTable`、`EncryptedClient` 和 `EncryptedResource` 帮助程序类。

## 属性操作
<a name="legacy-attribute-actions"></a>

*属性操作*告知项目加密程序将对项目的每个属性执行哪些操作。

属性操作值可以是以下任何值：
+ **加密和签名** – 加密属性值。在项目签名中包含属性（名称和值）。
+ **仅签名** – 在项目签名中包含属性。
+ **不执行任何操作** – 不为属性加密或签名。

对于可能存储敏感数据的任何属性，请使用 **Encrypt and sign (加密和签名)**。对于主键属性（分区键和排序键），使用 **Sign only**。不会为[材料描述属性](#legacy-material-description)和签名属性签名或加密。无需为这些属性指定属性操作。

仔细选择属性操作。如有怀疑，请使用 **Encrypt and sign (加密和签名)**。一旦使用 DynamoDB 加密客户端来保护表项，就无法在不冒签名验证错误风险的情况下更改属性的操作。有关更多信息，请参阅 [更改数据模型](data-model.md)。

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

如果 [DynamoDB 加密上下文](concepts.md#encryption-context)标识您的主键属性，则客户端将在您尝试加密这些属性时引发错误。

对于每种编程语言而言，用于指定属性操作的技术各不相同。此技术还可能特定于使用的帮助程序类。

有关详细信息，请参阅编程语言对应的文档。
+ [Python](python-using.md#python-attribute-actions)
+ [Java](java-using.md#attribute-actions-java)

## 材料描述
<a name="legacy-material-description"></a>

已加密表项目的*材料描述* 包含有关如何为表项目加密和签名的信息（如加密算法）。[加密材料提供程序](#concept-material-provider) (CMP) 将在汇编用于加密和签名的加密材料时记录材料描述。之后，当它需要汇编加密材料以验证和解密项目时，它将使用材料描述作为指南。

在 DynamoDB 加密客户端中，材料描述引用三个相关元素：

**请求的材料描述**  
某些[加密材料提供程序](#concept-material-provider) (CMPs) 允许您指定高级选项，例如加密算法。要指明您的选择，请将名称-值对添加到表项目加密请求中 [DynamoDB 加密上下文](concepts.md#encryption-context)的材料描述属性中。此元素也称为*请求的材料描述*。请求的材料描述中的有效值由您选择的 CMP 定义。  
由于材料描述会覆盖安全默认值，因此建议忽略请求的材料描述，除非有不得已的原因要使用它。

**实际材料描述**  
[加密材料提供者 (CMPs) 返回的材料](#concept-material-provider)描述称为*实际材料描述*。它描述 CMP 在汇编加密材料时使用的实际值。它一般包括请求的描述材料（如有），请求的描述材料有增加和更改。

**材料描述属性**  
客户端将实际材料描述保存在已加密项目的*材料描述属性* 中。材料描述属性名称为 `amzn-ddb-map-desc` 并且其值为实际材料描述。客户端将使用材料描述属性中的值验证和解密项目。

## DynamoDB 加密上下文
<a name="legacy-encryption-context"></a>

*DynamoDB 加密上下文* 为[加密材料提供程序](#concept-material-provider)（CMP）提供有关表和项目的信息。在高级实施中，DynamoDB 加密上下文可以包括[请求的材料描述](#legacy-material-description)。

在对表项目进行加密时，DynamoDB 加密上下文将以加密方式绑定到加密的属性值。当您解密时，如果 DynamoDB 加密上下文与用于加密的 DynamoDB 加密上下文不是区分大小写的完全匹配，则解密操作将失败。如果您与[项目加密程序](#item-encryptor)直接交互，则必须在调用加密或解密方法时提供 DynamoDB 加密上下文。大多数帮助程序将创建 DynamoDB 加密上下文。

**注意**  
*DynamoDB 加密*客户端中的 DynamoDB 加密上下文与 () 和中的加密上下*文*无关。 AWS Key Management Service AWS KMS AWS Encryption SDK

DynamoDB 加密上下文可以包含以下字段。所有字段和值均为可选项。
+ 表名
+ 分区键名称
+ 排序键名称
+ 属性名称/值对
+ [请求的材料描述](#legacy-material-description)

## 提供程序存储
<a name="provider-store"></a>

提供*商存储*是返回[加密材料提供者](#concept-material-provider) (CMPs) 的组件。提供商商店可以创建 CMPs 或从其他来源（例如其他提供商商店）获取它们。提供商存储将其创建的 CMPs 版本保存在永久存储中，其中每个存储的 CMP 都由请求者的材料名称和版本号标识。

DynamoDB 加密客户端中的[最新提供](most-recent-provider.md)程序来自提供程序存储，但您可以使用提供程序存储为 CMPs 任何组件提供该提供程序。 CMPs 每个最新提供程序都与一个提供商存储相关联，但一个提供商存储可以 CMPs 向多个主机的多个请求者提供服务。

提供商商店按需创建新版本，并返回新版本和现有版本。 CMPs 它还将返回指定材料名称的最新版本号。这使请求者知道提供程序存储何时具有它可请求的 CMP 的新版本。

DynamoDB 加密客户端包括[ MetaStore](most-recent-provider.md#about-metastore)一个，它是一个提供商存储，它使用存储在 DynamoDB 中并使用内部 DynamoDB 加密客户端加密的密钥创建 Wr CMPs apped。

**了解更多：**
+ 提供程序存储：[Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/ProviderStore.html)、[Python](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/src/dynamodb_encryption_sdk/material_providers/store/__init__.py)
+ MetaStore: [Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/MetaStore.html)、[Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/materials_providers/metastore.html#module-dynamodb_encryption_sdk.material_providers.store.meta)