AWS KMS ECDH 钥匙圈 - AWS Encryption SDK

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

AWS KMS ECDH 钥匙圈

重要

AWS KMS ECDH 密钥环仅适用于版本 3。 的 x 个 AWS Encryption SDK for Java。 AWS KMS ECDH 密钥环是在材料提供者库的 1.5.0 版本中引入的。

AWS KMS ECDH 密钥环使用非对称密钥协议AWS KMS keys来派生双方共享的对称包装密钥。首先,密钥环使用 Elliptic Curve Diffie-Hellman (ECDH) 密钥协议算法,从发送者的 KMS 密钥对中的私钥和接收者的公钥中派生出共享密钥。然后,密钥环使用共享密钥来派生用于保护您的数据加密密钥的共享包装密钥。 AWS Encryption SDK 使用 (KDF_CTR_HMAC_SHA384) 派生共享包装密钥的密钥派生函数符合 NIST 关于密钥派生的建议

密钥派生函数返回 64 字节的密钥材料。为确保双方使用正确的密钥材料,使用前 32 个字节作为承诺密钥, AWS Encryption SDK 使用最后 32 字节作为共享封装密钥。解密时,如果密钥环无法复制存储在邮件标题密文中的相同承诺密钥和共享包装密钥,则操作将失败。例如,如果您使用配置有 Alice 私钥和 Bob 公钥的密钥环对数据进行加密,则使用 Bob 的私钥和 Alice 的公钥配置的密钥环将复制相同的承诺密钥和共享包装密钥,并能够解密数据。如果 Bob 的公钥不是来自 KMS 密钥对,那么 Bob 可以创建一个 Ra w ECDH 密钥环来解密数据。

AWS KMS ECDH 密钥环使用 AES-GCM 使用对称密钥对数据进行加密。然后使用 AES-GCM 使用派生的共享包装密钥对数据密钥进行信封加密。每个 AWS KMS ECDH 密钥环只能有一个共享的包装密钥,但您可以在多密钥环中单独或与其他密钥环一起包含多个 AWS KMS ECDH 密钥环。

AWS KMS ECDH 密钥环所需的权限

AWS Encryption SDK 不需要 AWS 帐户,也不依赖任何 AWS 服务。但是,要使用 AWS KMS ECDH 密钥环,您需要一个 AWS 帐户以及对密钥环 AWS KMS keys 中的以下最低权限。权限因您使用的密钥协议架构而异。

创建 AWS KMS ECDH 密钥环

要创建用于加密和解密数据的 AWS KMS ECDH 密钥环,必须使用密钥协议架构。KmsPrivateKeyToStaticPublicKey要使用密钥协议架构初始化 AWS KMS ECDH KmsPrivateKeyToStaticPublicKey 密钥环,请提供以下值:

Java

以下示例使用发件人的 KMS 密钥、发件人的公钥和收件人的公钥创建一个 AWS KMS ECDH 密钥环。此示例使用可选senderPublicKey参数提供发送者的公钥。如果您不提供发件人的公钥,则密钥环会调用 AWS KMS 以检索发件人的公钥。发件人和收件人的密钥对都在ECC_NIST_P256弯曲中。

// Retrieve public keys // Must be DER-encoded X.509 public keys ByteBuffer BobPublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"); ByteBuffer AlicePublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"); // Create the AWS KMS ECDH static keyring final CreateAwsKmsEcdhKeyringInput senderKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPrivateKeyToStaticPublicKey( KmsPrivateKeyToStaticPublicKeyInput.builder() .senderKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab") .senderPublicKey(BobPublicKey) .recipientPublicKey(AlicePublicKey) .build()).build()).build();

创建 AWS KMS ECDH 发现密钥环

解密时,最佳做法是指定 AWS Encryption SDK 可以使用的密钥。要遵循此最佳实践,请使用带有密钥协议架构的 AWS KMS ECDH KmsPrivateKeyToStaticPublicKey 密钥环。但是,您也可以创建 AWS KMS ECDH 发现密钥环,即 AWS KMS ECDH 密钥环,该密钥环可以解密任何消息,其中指定 KMS 密钥对的公钥与存储在消息密文中的收件人的公钥相匹配。

重要

使用密KmsPublicKeyDiscovery钥协议架构解密消息时,无论谁拥有所有公钥,都将接受所有公钥。

要使用密钥协议架构初始化 AWS KMS ECDH KmsPublicKeyDiscovery 密钥环,请提供以下值:

  • 收件人的 AWS KMS key 身份证

    必须标识值为的非对称 NIST 推荐的椭圆曲线 (ECC) KMS 密钥对。KeyUsage KEY_AGREEMENT

  • 曲线规格

    标识收件人的 KMS 密钥对中的椭圆曲线规范。

    有效值:ECC_NIST_P256ECC_NIS_P384ECC_NIST_P512

  • (可选)授权令牌列表

    如果您通过授权控制对 AWS KMS ECDH 密钥环中 KMS 密钥的访问权限,则在初始化密钥环时必须提供所有必要的授权令牌。

Java

以下示例创建了一个 AWS KMS ECDH 发现密钥环,曲线上有 KMS 密钥对。ECC_NIST_P256您必须对指定的 KMS 密钥对拥有 kms: GetPublicKey 和 kms: DeriveSharedSecret 权限。此密钥环可以解密任何消息,其中指定 KMS 密钥对的公钥与存储在消息密文中的收件人的公钥相匹配。

// Create the AWS KMS ECDH discovery keyring final CreateAwsKmsEcdhKeyringInput recipientKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPublicKeyDiscovery( KmsPublicKeyDiscoveryInput.builder() .recipientKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321").build() ).build()) .build();