

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

# AWS 数据库加密 SDK 的工作原理
<a name="how-it-works"></a>


****  

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

 AWS 数据库加密 SDK 提供专为保护存储在数据库中的数据而设计的客户端加密库。库包含可以直接扩展或使用的安全实施。有关定义和使用自定义组件的更多信息，请参阅数据库实现的 GitHub 存储库。

本节中的工作流程说明了 AWS 数据库加密 SDK 如何对数据库中的数据进行加密、签名、解密和验证。这些工作流使用抽象元素和默认特征描述基本流程。有关 AWS 数据库加密 SDK 如何与您的数据库实现配合使用的详细信息，请参阅数据库的*加密内容*主题。

 AWS 数据库加密 SDK 使用[信封加密](concepts.md#envelope-encryption)来保护您的数据。每条记录都使用唯一的[数据密钥](concepts.md#data-key)进行加密。数据密钥用于为加密操作中标记为 `ENCRYPT_AND_SIGN` 的每个字段派生唯一的*数据加密密钥*。然后，使用您指定的包装密钥对数据密钥副本进行加密。要解密加密记录， AWS 数据库加密 SDK 使用您指定的包装密钥来解密至少一个加密的数据密钥。然后其可解密加密文字并返回一条明文条目。

有关 AWS 数据库加密 SDK 中使用的术语的更多信息，请参阅[AWS 数据库加密 SDK 概念](concepts.md)。

## 加密并签名
<a name="encrypt-and-sign"></a>

 AWS 数据库加密 SDK 的核心是一个记录加密器，用于对数据库中的记录进行加密、签名、验证和解密。它取得您的记录的信息，以及要加密和签名的字段说明。它将从通过您指定的包装密钥配置的[加密材料提供程序](concepts.md#crypt-materials-manager)获取加密材料和加密材料的使用说明。

以下演练描述了 AWS 数据库加密 SDK 如何对您的数据条目进行加密和签名。

1. 加密材料管理器为 AWS 数据库加密 SDK 提供了唯一的数据加密密钥：一个纯文本[数据密钥](concepts.md#data-key)、一份由指定[包装密钥加密的数据密钥副本和一个 MAC 密钥](concepts.md#wrapping-key)。
**注意**  
您可以使用多个包装密钥加密数据密钥。每个包装密钥加密数据密钥的单独副本。 AWS 数据库加密 SDK 将所有加密的数据密钥存储在[材料描述](concepts.md#material-description)中。 AWS 数据库加密 SDK 在记录中添加一个用于存储材料描述的新字段（`aws_dbe_head`）。  
为数据密钥的每个加密副本派生一个 MAC 密钥。MAC 密钥不存储在材料描述中。反之，解密方法使用包装密钥再次派生 MAC 密钥。

1. 加密方法对您指定的[加密操作](concepts.md#crypt-actions)中标记为 `ENCRYPT_AND_SIGN` 的每个字段进行加密。

1. 加密方法从数据密钥中派生 `commitKey`，并使用它生成[密钥承诺值](concepts.md#key-commitment)，然后再丢弃该数据密钥。

1. 加密方法将[材料描述](concepts.md#material-description)添加到记录中。材料描述包含加密的数据密钥以及有关加密记录的其他信息。有关材料描述中包含的信息的完整列表，请参阅[材料描述格式](reference.md#material-description-format)。

1. 加密方法使用**步骤 1** 中返回的 MAC 密钥来计算基于哈希的消息身份验证码 (HMAC) 值，而不是材料描述、[加密上下文以及加密](concepts.md#encryption-context)操作中标记`ENCRYPT_AND_SIGN`的每个字段的规范化。`SIGN_ONLY` `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`HMAC 值存储在加密方法添加到记录的新字段（`aws_dbe_foot`）中。

1. 加密方法根据材料描述、加密上下文和每个标有 `ENCRYPT_AND_SIGN` “或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`” 的字段的规范化计算 [ECDSA 签名](concepts.md#digital-sigs)，并将 ECDSA 签名存储在字段中。`SIGN_ONLY` `aws_dbe_foot`
**注意**  
默认情况下，ECDSA 签名处于启用状态，但不是必需的。

1. 加密方法将已加密和签名的记录存储在您的数据库中

## 解密并验证
<a name="decrypt-and-verify"></a>

1. 加密材料管理器（CMM）提供解密方法，其中解密材料存储在材料描述中，包括明本[数据密钥](concepts.md#data-key)和关联的 MAC 密钥。

   1. CMM 使用指定的密钥环中的[包装密钥](concepts.md#wrapping-key)为加密的数据密钥解密，然后返回明文数据密钥。

1. 解密方法比较并验证材料描述中的密钥承诺值。

1. 解密方法可验证签名字段中的签名。

   它`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`从您定义的[允许未经身份验证的字段列表中识别哪些字段已](ddb-java-using.md#allowed-unauth)标记`ENCRYPT_AND_SIGN``SIGN_ONLY`、或。解密方法使用**步骤 1** 中返回的 MAC 密钥重新计算和比较标记为、或的字段的 HMAC 值。`ENCRYPT_AND_SIGN` `SIGN_ONLY` `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`然后，它使用存储在[加密上下文](concepts.md#encryption-context)中的公有密钥来验证 [ECDSA 签名](concepts.md#digital-sigs)。

1. 解密方法使用明文数据密钥解密标记为 `ENCRYPT_AND_SIGN` 的每个值。然后， AWS 数据库加密 SDK 会丢弃纯文本数据密钥。

1. 解密方法返回明文记录。