创建有效的分支密钥 - AWS Encryption SDK

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

创建有效的分支密钥

分支密钥是派生自分支密钥的数据密钥 AWS KMS key , AWS KMS 分层密钥环使用该密钥来减少调用的次数。 AWS KMS活动分支密钥为最新分支密钥版本。分层密钥环为每个加密请求生成唯一的数据密钥,并使用从活动分支密钥派生的唯一包装密钥对每个数据密钥进行加密。

要创建新的活动分支密钥,必须静态配置密钥存储操作。 CreateKey是一种特权操作,用于将KMS密钥库操作配置中ARN指定的密钥添加到密钥库许可名单中。然后,使用该KMS密钥生成新的活动分支密钥。我们建议限制对此操作的访问权限,因为一旦KMS密钥被添加到密钥库中,就无法将其删除。

您可以将密钥库中的一个KMS密钥列入许可名单,也可以通过更新您在KMS密钥存储操作配置中指定的密KMS钥ARN并再次调用CreateKey来允许列入多个密钥。如果您将多个KMS密钥列入许可名单,则您的密钥库用户应配置其密钥存储操作以供发现,以便他们可以使用他们有权访问的密钥库中的任何允许列表的密钥。有关更多信息,请参阅 配置密钥存储操作

所需的权限

要创建分支密钥,您需要密钥存储操作中指定的密KMS钥的 kms: GenerateDataKeyWithoutPlaintext 和 kms: ReEncrypt 权限。

创建分支密钥

以下操作使用您在密钥存储操作配置中指定的KMS密钥创建新的活动分支密钥,并将活动分支密钥添加到用作密钥存储的 DynamoDB 表中。

调用 CreateKey 时,您可以选择指定以下可选值。

  • branchKeyIdentifier:定义自定义 branch-key-id

    要创建自定义 branch-key-id,还必须加入包含 encryptionContext 参数的其他加密上下文。

  • encryptionContext: 定义一组可选的非秘密密钥值对,用于在 k m s: 调用中包含的加密上下文中提供其他经过身份验证的数据 (AAD)。GenerateDataKeyWithoutPlaintext

    此额外加密上下文带有 aws-crypto-ec: 前缀。

Java
final Map<String, String> additionalEncryptionContext = Collections.singletonMap("Additional Encryption Context for", "custom branch key id"); final String BranchKey = keystore.CreateKey( CreateKeyInput.builder() .branchKeyIdentifier(custom-branch-key-id) //OPTIONAL .encryptionContext(additionalEncryptionContext) //OPTIONAL .build()).branchKeyIdentifier();
C# / .NET
var additionalEncryptionContext = new Dictionary<string, string>(); additionalEncryptionContext.Add("Additional Encryption Context for", "custom branch key id"); var branchKeyId = keystore.CreateKey(new CreateKeyInput { BranchKeyIdentifier = "custom-branch-key-id", // OPTIONAL EncryptionContext = additionalEncryptionContext // OPTIONAL });
Python
additional_encryption_context = {"Additional Encryption Context for": "custom branch key id"} branch_key_id: str = keystore.create_key( CreateKeyInput( branch_key_identifier = "custom-branch-key-id", # OPTIONAL encryption_context = additional_encryption_context, # OPTIONAL ) )

首先,CreateKey 操作生成以下值。

然后,该CreateKey操作GenerateDataKeyWithoutPlaintext使用以下请求调用 kms:

{ "EncryptionContext": { "branch-key-id" : "branch-key-id", "type" : "type", "create-time" : "timestamp", "logical-key-store-name" : "the logical table name for your key store", "kms-arn" : the KMS key ARN, "hierarchy-version" : "1", "aws-crypto-ec:contextKey": "contextValue" }, "KeyId": "the KMS key ARN you specified in your key store actions", "NumberOfBytes": "32" }

接下来,该CreateKey操作调用 km ReEncrypt s:,通过更新加密上下文为分支密钥创建活动记录。

最后,该CreateKey操作调用 ddb: TransactWriteItems 来编写一个新项目,该项目将保留您在步骤 2 中创建的表中的分支密钥。项目具有以下属性。

{ "branch-key-id" : branch-key-id, "type" : "branch:ACTIVE", "enc" : the branch key returned by the GenerateDataKeyWithoutPlaintext call, "version": "branch:version:the branch key version UUID", "create-time" : "timestamp", "kms-arn" : "the KMS key ARN you specified in Step 1", "hierarchy-version" : "1", "aws-crypto-ec:contextKey": "contextValue" }