

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

# AWS 数据库加密 SDK 中支持的算法套件
<a name="supported-algorithms"></a>


****  

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

*算法套件* 是一组加密算法和相关的值。密码系统使用算法实现来生成密文。

 AWS 数据库加密 SDK 使用算法套件对数据库中的字段进行加密和签名。所有支持的算法套件都使用带 Galois/Counter 模式 (GCM) 的高级加密标准 (AES) 算法（称为 AES-GCM）来加密原始数据。 AWS 数据库加密 SDK 支持 256 位加密密钥。身份验证标签长度始终为 16 字节。


**AWS 数据库加密 SDK 算法套件**  

| 算法 | 加密算法 | 数据密钥长度（位） | 密钥派生算法 | 对称签名算法 | 非对称签名算法 | 密钥承诺 | 
| --- | --- | --- | --- | --- | --- | --- | 
| 默认 | AES-GCM | 256 | HKDF 以及 SHA-512 | HMAC-SHA-384 | ECDSA 以及 P-384 和 SHA-384 | HKDF 以及 SHA-512 | 
| 没有 ECDSA 数字签名的 AES-GCM | AES-GCM | 256 | HKDF 以及 SHA-512 | HMAC-SHA-384 | 无 | HKDF 以及 SHA-512 | 

**加密算法**  
与加密算法一起使用的名称和模式。 AWS 数据库加密 SDK 中的算法套件使用带 Galois/Counter 模式 (GCM) 的高级加密标准 (AES) 算法。  


**数据密钥长度**  
[数据密钥](concepts.md#data-key)的长度（以位为单位）。 AWS 数据库加密 SDK 支持 256 位数据密钥。数据密钥用作基于 HMAC 的密 extract-and-expand钥派生函数 (HKDF) 的输入。HKDF 的输出用作加密算法中的数据加密密钥。

**密钥派生算法**  
基于 HMAC 的 extract-and-expand密钥派生函数 (HKDF)，用于派生数据加密密钥。 AWS 数据库加密 SDK 使用 [RFC](https://tools.ietf.org/html/rfc5869) 5869 中定义的 HKDF。  
+ 使用的哈希函数是 SHA-512
+ 对于提取步骤：
  + 不使用加密盐。根据 RFC，加密盐设置为包含零的字符串。
  + [输入密钥材料是密钥环中的数据密钥。](concepts.md#keyring-concept)
+ 对于扩展步骤：
  + 输入伪随机密钥是提取步骤的输出。
  + 密钥标签是按大端字节顺序排列的 `DERIVEKEY` 字符串的 UTF-8 编码字节。
  + 输入信息是将算法 ID 和密钥标签（按此顺序）串联在一起的结果。
  + 输出加密材料的长度是**数据密钥长度**。该输出用作加密算法中的数据加密密钥。

**对称签名算法**  
用于生成对称签名的基于哈希的消息身份验证码 (HMAC) 算法。所有支持的算法套件都包含 HMAC 验证。  
 AWS 数据库加密 SDK 对材料描述和所有标有`ENCRYPT_AND_SIGN``SIGN_ONLY`、或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`的字段进行序列化。然后，它使用带有加密哈希函数算法 (SHA-384) 的 HMAC 对规范化进行签名。  
对称 HMAC 签名存储在 AWS 数据库加密 SDK 添加到记录中的新字段 (`aws_dbe_foot`) 中。

**非对称签名算法**  
用于生成非对称数字签名的签名算法。  
 AWS 数据库加密 SDK 对材料描述和所有标有`ENCRYPT_AND_SIGN``SIGN_ONLY`、或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`的字段进行序列化。然后，它使用具有以下细节的椭圆曲线数字签名算法 (ECDSA) 对规范化进行签名：  
+ 使用的椭圆曲线是 P-384，定义见[数字签名标准 (DSS) (FIPS PUB 186-4)](http://doi.org/10.6028/NIST.FIPS.186-4)。
+ 使用的哈希函数是 SHA-384。
非对称 ECDSA 签名与现场对称 HMAC 签名一起存储。`aws_dbe_foot`  
默认情况下包括 ECDSA 数字签名，但不是必需的。

**密钥承诺**  
基于 HMAC 的 extract-and-expand密钥派生函数 (HKDF) 用于派生提交密钥。  
+ 使用的哈希函数是 SHA-512
+ 对于提取步骤：
  + 不使用加密盐。根据 RFC，加密盐设置为包含零的字符串。
  + [输入密钥材料是密钥环中的数据密钥。](concepts.md#keyring-concept)
+ 对于扩展步骤：
  + 输入伪随机密钥是提取步骤的输出。
  + 输入信息是按大字节顺序排列的`COMMITKEY`字符串的 UTF-8 编码字节。
  + 输出键控材料的长度为 256 位。此输出用作提交密钥。
[提交密钥计算[记录承诺](reference.md#format-commitment)，即不同的 256 位基于哈希的消息身份验证码 (HMAC) 哈希，而不是材料描述。](reference.md#material-description-format)有关向算法套件添加密钥承诺的技术说明，请参阅 Cryptology ePrint Archive AEADs 中的[密钥提交](https://eprint.iacr.org/2020/1153)。

## 默认的算法套件
<a name="recommended-algorithms"></a>

默认情况下， AWS 数据库加密 SDK 使用带有 AES-GCM、基于 HMAC 的 extract-and-expand密钥派生函数 (HKDF)、HMAC 验证、ECDSA 数字签名、密钥承诺和 256 位加密密钥的算法套件。

默认算法套件包括 HMAC 验证（对称签名）和 [ECDSA 数字签名（非对称签名](concepts.md#digital-sigs)）。这些签名存储在 AWS 数据库加密 SDK 添加到记录中的新字段 (`aws_dbe_foot`) 中。当授权策略允许一组用户加密数据，允许另一组用户解密数据时，ECDSA 数字签名特别有用。

默认算法套件还会派生一个[密钥承诺](concepts.md#key-commitment) ——一个将数据密钥与记录关联的 HMAC 哈希。密钥承诺值是根据材料描述和提交密钥计算得出的 HMAC。然后，密钥承诺值将存储在材料描述中。密钥承诺确保每个加密文字仅解密为一个明文。这些算法套件通过验证用作加密算法输入的数据密钥达到上述目的。加密时，算法套件会派生密钥承诺 HMAC。在解密之前，这些算法套件会验证数据密钥是否生成相同的密钥承诺 HMAC。如果没有，Decrypt 调用会失败。

## 没有 ECDSA 数字签名的 AES-GCM
<a name="other-algorithms"></a>

尽管默认算法套件可能适用于大多数应用程序，但您可以选择其他算法套件。例如，没有ECDSA数字签名的算法套件可以满足某些信任模型。仅当加密数据的用户和解密数据的用户同样受到信任时，才使用此套件。

所有 AWS 数据库加密 SDK 算法套件都包含 HMAC 验证（对称签名）。唯一的区别是，没有ECDSA数字签名的AES-GCM算法套件缺少提供额外真实性和不可否认性的非对称签名。

例如，如果您的密钥环、、和中有多个包装密钥 `wrappingKeyA``wrappingKeyB`，并且您使用`wrappingKeyA`解密记录`wrappingKeyC`，则 HMAC 对称签名会验证该记录是否由有权访问的用户加密。`wrappingKeyA`如果您使用默认算法套件，则会 HMACs提供相同的验证`wrappingKeyA`，并使用 ECDSA 数字签名来确保记录由具有加密权限的用户加密。`wrappingKeyA`

要选择不带数字签名的 AES-GCM 算法套件，请在加密配置中加入以下片段。

------
#### [ Java ]

以下代码段指定了没有 ECDSA 数字签名的 AES-GCM 算法套件。有关更多信息，请参阅 [适用于 DynamoDB 的 AWS 数据库加密 SDK 中的加密配置](ddb-java-using.md#ddb-config-encrypt)。

```
.algorithmSuiteId(
    DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384)
```

------
#### [ C\$1 / .NET ]

以下代码段指定了没有 ECDSA 数字签名的 AES-GCM 算法套件。有关更多信息，请参阅 [适用于 DynamoDB 的 AWS 数据库加密 SDK 中的加密配置](ddb-net-using.md#ddb-net-config-encrypt)。

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

------
#### [ Rust ]

以下代码段指定了没有 ECDSA 数字签名的 AES-GCM 算法套件。有关更多信息，请参阅 [适用于 DynamoDB 的 AWS 数据库加密 SDK 中的加密配置](ddb-rust-using.md#ddb-rust-config-encrypt)。

```
.algorithm_suite_id(
    DbeAlgorithmSuiteId::AlgAes256GcmHkdfSha512CommitKeyEcdsaP384SymsigHmacSha384,
)
```

------