

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

# 生成数据密钥
<a name="generating-data-keys"></a>

授权用户可以使用 GenerateDataKey API（及相关 APIs）请求特定类型的数据密钥或任意长度的随机密钥。本主题提供此 API 操作的简化视图。有关详细信息，请参阅 *AWS Key Management Service API 参考 GenerateDataKey APIs *中的。
+ [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
+ [GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)
+ [GenerateDataKeyPair](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPair.html)
+ [GenerateDataKeyPairWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)

以下是 `GenerateDataKey` 请求语法。

```
{
	“EncryptionContext”: {“string” : “string”},
	“GrantTokens”: [“string”],
	“KeyId”: “string”,
	“NumberOfBytes”: “number”
}
```

请求接受采用 JSON 格式的以下数据。

**KeyId**  
用于加密数据密钥的密钥的密钥标识符。此值必须标识对称加密 KMS 密钥。  
此参数为必需参数。

**NumberOfBytes**  
包含要生成的字节数的整数。此参数为必需参数。  
调用者必须提供 `KeySpec` 或 `NumberOfBytes`，但不能同时提供两者。

**EncryptionContext**  
（可选）包含在使用密钥的加密和解密过程中要进行身份验证的其他数据的名称-值对。

**GrantTokens**  
（可选）表示提供生成或使用密钥的权限的授权令牌的列表。有关授权和授权令牌的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的 [AWS KMS的身份验证和访问控制](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

对命令进行身份验证后 AWS KMS，获取与 KMS 密钥关联的当前活动 EKT。它通过 AWS KMS 主机与域中 HSM 之间的受保护会话，将 EKT 以及您提供的请求和任何加密上下文传递给 HSM。

HSM 执行以下操作：

1. 生成请求的机密材料并将其保存在易失性存储器中。

1. 解密与请求中定义的 KMS 密钥的密钥 ID 匹配的 *EKT* 以获取主动 *HBK = Decrypt(DKi, EKT)*。

1. 生成一次性的随机数 *N*。

1. 从 *HBK* 和 *N* 生成 256 位 AES-GCM 派生的加密密钥 *K*。

1. 加密机密材料 *ciphertext = Encrypt(K, context, secret)*。

`GenerateDataKey`通过 AWS KMS 主机和 HSM 之间的安全通道将纯文本秘密材料和密文返回给您。 AWS KMS 然后通过 TLS 会话将其发送给您。 AWS KMS 不保留明文或密文。如果没有*密文*、加密上下文和使用 *KMS 密钥*的授权，则无法返回底层机密。

以下是响应语法。

```
{
	"CiphertextBlob": "blob",
	"KeyId": "string",
	"Plaintext": "blob"
}
```

数据密钥的管理由您作为应用程序开发人员负责。要使用 AWS KMS 数据密钥（但不是数据密钥对）进行客户端加密的最佳实践，可以使用。[AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/)

数据密钥可以以任何频率轮换。此外，数据密钥可以使用 `ReEncrypt` API 操作在不同的 KMS 密钥或轮换的 KMS 密钥下重新加密。有关详细信息，请参阅 *AWS Key Management Service API 参考[ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)*中的。