原始 RSA 密钥环 - AWS Encryption SDK

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

原始 RSA 密钥环

原始 RSA 密钥环使用您提供的 RSA 公有密钥和私有密钥为本地内存中的数据密钥执行非对称加密和解密。您需要生成、存储和保护私有密钥,最好是在硬件安全模块(HSM)或密钥管理系统中操作。加密功能对 RSA 公有密钥下的数据密钥进行加密。解密功能使用私有密钥对数据密钥进行解密。您可以从几种 RSA 填充模式中进行选择。

加密和解密的原始 RSA 密钥环必须包含一个非对称公有密钥和私有密钥对。但是,您可以使用仅具有公有密钥的原始 RSA 密钥环加密数据,并使用仅具有私有密钥的原始 RSA 密钥环解密数据。您可以在多重密钥环中包含任何原始 RSA 密钥环。如果您为原始 RSA 密钥环配置公有密钥和私有密钥,请确保其属于同一个密钥对。的某些语言实现 AWS Encryption SDK 不会使用来自不同对的密钥构建 Raw RSA 密钥环。其他语言实施则需要您验证密钥是否来自同一个密钥对。

Raw RSA 密钥环与 RSA 非对称加密密钥一起使用 AWS Encryption SDK for Python 时,等同于 AWS Encryption SDK for Java 和RawMasterKey中的密钥并与之互操作。JceMasterKey您可以使用一种实现加密数据,用使用相同包装密钥的任何其他实现进行解密。有关更多信息,请参阅 密钥环兼容性

注意

原始 RSA 密钥环不支持非对称 KMS 密钥。如果要使用非对称 RSA KMS 密钥,请使用版本 4。 .NET AWS Encryption SDK 的 x 和版本 3。 x AWS Encryption SDK for Java 支持使用对称加密 (SYMMETRIC_DEFAULT) 或非对称 RSA 的密 AWS KMS 钥环。 AWS KMS keys

如果您使用包含 RSA KMS 密钥公钥的 Raw RSA 密钥环对数据进行加密,则两者都 AWS Encryption SDK 无法 AWS KMS 对其进行解密。您无法将 AWS KMS 非对称 KMS 密钥的私钥导出到原始 RSA 密钥环中。 AWS KMS 解密操作无法解密返回的加密消息。 AWS Encryption SDK

在中构建 Raw RSA 密钥环时 AWS Encryption SDK for C,请务必提供包含每个密钥的 PEM 文件的内容,以空结尾的 C 字符串,而不是路径或文件名。在中构建 Raw RSA 密钥环时 JavaScript,请注意可能与其他语言实现不兼容

命名空间和名称

为标识密钥环中的 RSA 密钥材料,原始 AES 密钥环使用您提供的命名空间密钥名称。这些值不是机密的。其以明文形式出现在加密操作返回的加密消息的标头中。我们建议在 HSM 或密钥管理系统中使用密钥命名空间与用于标识 RSA 密钥对(或其私有密钥)的密钥名称。

注意

密钥命名空间和密钥名称等同于 JceMasterKeyRawMasterKey提供程序 ID(或提供程序)和密钥 ID字段。

为 KMS aws-kms 密钥 AWS Encryption SDK for C 保留密钥命名空间值。请勿在原始 AES 密钥环或原始 RSA 密钥环中将其与 AWS Encryption SDK for C共用。

如果您通过构造不同的密钥环加密和解密给定消息,命名空间和名称值则至关重要。如果解密密钥环中的密钥命名空间和密钥名称与加密密钥环中的密钥命名空间和密钥名称不完全匹配、大小写不一致,即使密钥来自相同的密钥对,也不会使用解密密钥环。

无论密钥环中包含 RSA 公有密钥、RSA 私有密钥还是密钥对中的两个密钥,加密和解密密钥环中密钥材料的密钥命名空间和密钥名称必须相同。例如,假设您使用包含密钥命名空间 HSM_01 和密钥名称 RSA_2048_06 的 RSA 公有密钥的原始 RSA 密钥环加密数据。要解密数据,请使用私有密钥(或密钥对)、相同的密钥命名空间和名称构造原始 RSA 密钥环。

填充模式

您必须为用于加密和解密的原始 RSA 密钥环指定填充模式,或者使用为您指定填充模式的语言实施功能。

AWS Encryption SDK 支持以下填充模式,受每种语言的限制。建议使用 OAEP 填充模式,尤其是具有 SHA-256 的 OAEP 和具有 SHA-256 填充的 MGF1。支持 PKCS1 填充模式仅出于向后兼容性考虑。

  • 具有 SHA-1 的 OAEP 和具有 SHA-1 填充的 MGF1

  • 具有 SHA-1 的 SHA-256 和具有 SHA-256 填充的 MGF1

  • 具有 SHA-1 的 SHA-384 和具有 SHA-384 填充的 MGF1

  • 具有 SHA-1 的 SHA-512 和具有 SHA-512 填充的 MGF1

  • PKCS1 v1.5 填充

以下示例说明了如何使用 RSA 密钥对的公有密钥和私有密钥、具有 SHA-256 的 MGF1 和具有 SHA-256 填充模式的 MGF1 创建原始 RSA 密钥环。RSAPublicKeyRSAPrivateKey 变量代表您提供的密钥材料。

C

要在中创建 RSA 原始密钥环 AWS Encryption SDK for C,请使用。aws_cryptosdk_raw_rsa_keyring_new

在中构建 Raw RSA 密钥环时 AWS Encryption SDK for C,请务必提供包含每个密钥的 PEM 文件的内容,以空结尾的 C 字符串,而不是路径或文件名。有关完整示例,请参阅 raw_rsa_keyring.c

struct aws_allocator *alloc = aws_default_allocator(); AWS_STATIC_STRING_FROM_LITERAL(key_namespace, "HSM_01"); AWS_STATIC_STRING_FROM_LITERAL(key_name, "RSA_2048_06"); struct aws_cryptosdk_keyring *rawRsaKeyring = aws_cryptosdk_raw_rsa_keyring_new( alloc, key_namespace, key_name, private_key_from_pem, public_key_from_pem, AWS_CRYPTOSDK_RSA_OAEP_SHA256_MGF1);
C# / .NET

要在 AWS Encryption SDK 适用于.NET 的 Raw RSA 密钥环中实例化,请使用方法。materialProviders.CreateRawRsaKeyring()有关完整的示例,请参阅 rawRSA KeyringExample .cs。

以下示例使用适用于 .NET 的 AWS Encryption SDK 版本 4.x

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); var keyNamespace = "HSM_01"; var keyName = "RSA_2048_06"; // Get public and private keys from PEM files var publicKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePublicKey.pem")); var privateKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePrivateKey.pem")); // Create the keyring input var createRawRsaKeyringInput = new CreateRawRsaKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, PaddingScheme = PaddingScheme.OAEP_SHA512_MGF1, PublicKey = publicKey, PrivateKey = privateKey }; // Create the keyring var rawRsaKeyring = materialProviders.CreateRawRsaKeyring(createRawRsaKeyringInput);
JavaScript Browser

浏览器 AWS Encryption SDK for JavaScript 中的从库中获取其加密原语。WebCrypto在构造密钥环之前,必须使用importPublicKey()和/或importPrivateKey()将原始密钥材料导入 WebCrypto 后端。这样可以确保即使对的所有调用都是异步的,密钥环也是完整 WebCrypto 的。导入方法采用的对象包括包装算法及其填充模式。

导入密钥材料后,使用 RawRsaKeyringWebCrypto() 方法实例化密钥环。在中构建 Raw RSA 密钥环时 JavaScript,请注意可能与其他语言实现不兼容

有关完整的示例,请参阅 rsa_simple .ts(浏览器)。JavaScript

const privateKey = await RawRsaKeyringWebCrypto.importPrivateKey( privateRsaJwKKey ) const publicKey = await RawRsaKeyringWebCrypto.importPublicKey( publicRsaJwKKey ) const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringWebCrypto({ keyName, keyNamespace, publicKey, privateKey, })
JavaScript Node.js

要在 AWS Encryption SDK for JavaScript Node.js 中实例化原始 RSA 密钥环,请创建该类的新实例。RawRsaKeyringNodewrapKey 参数用于保存公有密钥。unwrapKey 参数用于保存私有密钥。尽管您可以指定首选填充模式,但 RawRsaKeyringNode 构造函数会为您计算默认填充模式。

在中构造原始 RSA 密钥环时 JavaScript,请注意可能与其他语言实现不兼容

有关完整的示例,请参阅 rsa_simple .ts (Node.js)。JavaScript

const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringNode({ keyName, keyNamespace, rsaPublicKey, rsaPrivateKey})
Java
final CreateRawRsaKeyringInput keyringInput = CreateRawRsaKeyringInput.builder() .keyName("RSA_2048_06") .keyNamespace("HSM_01") .paddingScheme(PaddingScheme.OAEP_SHA256_MGF1) .publicKey(RSAPublicKey) .privateKey(RSAPrivateKey) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); IKeyring rawRsaKeyring = matProv.CreateRawRsaKeyring(keyringInput);