

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 產生資料金鑰
<a name="generating-data-keys"></a>

經授權使用者可以使用 GenerateDataKey API (與相關 API)，請求特定類型的資料金鑰或任意長度的隨機金鑰。本主題提供此 API 操作的簡化檢視。如需詳細資訊，請參閱 *AWS Key Management Service API 參考*中的 GenerateDataKey API。
+ [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**  
(選用) Name-value (名称-值) 對，其中包含要在使用金鑰的加密和解密程序期間進行驗證的其他資料。

**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. 產生隨機 nonce *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)。