原始 RSA 密钥环 - AWS 数据库加密 SDK

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

原始 RSA 密钥环

我们的客户端加密库已重命名为 AWS 数据库加密 SDK。本开发人员指南仍提供有关 DynamoDB 加密客户端的信息。

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

加密和解密的原始 RSA 密钥环必须包含一个非对称公有密钥和私有密钥对。但是,您可以使用仅具有公有密钥的原始 RSA 密钥环加密数据,并使用仅具有私有密钥的原始 RSA 密钥环解密数据。您可以在多重密钥环中包含任何原始 RSA 密钥环。如果您为原始 RSA 密钥环配置公有密钥和私有密钥,请确保其属于同一个密钥对。

Raw RSA 密钥环与 RSA 非对称加密密钥一起使用 AWS Encryption SDK for Java 时,等同于并与之互操作。JceMasterKey

注意

原始 RSA 密钥环不支持非对称 KMS 密钥。要使用非对称 RSA KMS 密钥,请构造 AWS KMS 密钥环

命名空间和名称

为标识密钥环中的 RSA 密钥材料,原始 AES 密钥环使用您提供的命名空间密钥名称。这些值不是机密的。它们以纯文本形式出现在 AWS 数据库加密 SDK 添加到记录中的材料描述中。建议在 HSM 或密钥管理系统中使用密钥命名空间与用于标识 RSA 密钥对(或其私有密钥)的密钥名称。

注意

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

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

无论密钥环中包含 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 填充

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

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);
C# / .NET
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 keyringInput = new CreateRawRsaKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, PaddingScheme = PaddingScheme.OAEP_SHA512_MGF1, PublicKey = publicKey, PrivateKey = privateKey }; // Create the keyring var matProv = new MaterialProviders(new MaterialProvidersConfig()); var rawRsaKeyring = matProv.CreateRawRsaKeyring(keyringInput);