AWS KMS ECDH 密钥环 - AWS Encryption SDK

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

AWS KMS ECDH 密钥环

密 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密钥环是在加密材料提供程序库 (MPL) 的 1.5.0 版本中引入的,并由以下编程语言和版本支持:

  • 版本 3。 的 x AWS Encryption SDK for Java

  • 版本 4。 for AWS Encryption SDK 的 x。 NET

  • 版本 4。 的 x AWS Encryption SDK for Python,与可选MPL依赖项一起使用时。

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密钥环,请提供以下值:

C# / .NET

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

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Must be DER-encoded X.509 public keys var BobPublicKey = new MemoryStream(new byte[] { }); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the AWS KMS ECDH static keyring var staticConfiguration = new KmsEcdhStaticConfigurations { KmsPrivateKeyToStaticPublicKey = new KmsPrivateKeyToStaticPublicKeyInput { SenderKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", SenderPublicKey = BobPublicKey, RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = staticConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

以下示例使用包含发件人 AWS KMS ECDH密KMS钥、发件人公钥和收件人公钥的密钥创建密钥环。此示例使用可选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();
Python

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

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateAwsKmsEcdhKeyringInput, KmsEcdhStaticConfigurationsKmsPrivateKeyToStaticPublicKey, KmsPrivateKeyToStaticPublicKeyInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Retrieve public keys # Must be DER-encoded X.509 public keys bob_public_key = get_public_key_bytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab") alice_public_key = get_public_key_bytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321") # Create the AWS KMS ECDH static keyring sender_keyring_input = CreateAwsKmsEcdhKeyringInput( kms_client = boto3.client('kms', region_name="us-west-2"), curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = KmsEcdhStaticConfigurationsKmsPrivateKeyToStaticPublicKey( KmsPrivateKeyToStaticPublicKeyInput( sender_kms_identifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", sender_public_key = bob_public_key, recipient_public_key = alice_public_key, ) ) ) keyring = mat_prov.create_aws_kms_ecdh_keyring(sender_keyring_input)

创建 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 key pa KeyUsage ir。KEY_AGREEMENT

  • 曲线规格

    标识接收者 ke KMS y pair 中的椭圆曲线规范。

    有效值:ECC_NIST_P256ECC_NIS_P384ECC_NIST_P512

  • (可选)授权令牌列表

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

C# / .NET

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

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Create the AWS KMS ECDH discovery keyring var discoveryConfiguration = new KmsEcdhStaticConfigurations { KmsPublicKeyDiscovery = new KmsPublicKeyDiscoveryInput { RecipientKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = discoveryConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

以下示例创建了ECC_NIST_P256曲线上带有密钥对(key pair)的 AWS KMS ECDH发现KMS密钥环。您必须对指定密钥对拥有 km DeriveSharedSecret s: GetPublicKey 和 KMS kms: 权限。此密钥环可以解密任何消息,其中指定密钥对的公钥与存储在消息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();
Python

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

import boto3 from aws_cryptographic_materialproviders.mpl.models import ( CreateAwsKmsEcdhKeyringInput, KmsEcdhStaticConfigurationsKmsPublicKeyDiscovery, KmsPublicKeyDiscoveryInput, ) from aws_cryptography_primitives.smithygenerated.aws_cryptography_primitives.models import ECDHCurveSpec # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS ECDH discovery keyring create_keyring_input = CreateAwsKmsEcdhKeyringInput( kms_client = boto3.client('kms', region_name="us-west-2"), curve_spec = ECDHCurveSpec.ECC_NIST_P256, key_agreement_scheme = KmsEcdhStaticConfigurationsKmsPublicKeyDiscovery( KmsPublicKeyDiscoveryInput( recipient_kms_identifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", ) ) ) keyring = mat_prov.create_aws_kms_ecdh_keyring(create_keyring_input)