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

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

原始 AES 密钥环

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

AWS 数据库加密 SDK 允许您使用您提供的 AES 对称密钥作为包装密钥来保护您的数据密钥。您需要生成、存储和保护密钥材料,最好是在硬件安全模块(HSM)或密钥管理系统中操作。如果您需要提供包装密钥并在本地或离线加密数据密钥,则请使用原始 AES 密钥环。

原始 AES 密钥环使用 AES-GCM 算法以及您指定为字节数组的包装密钥对数据进行加密。每个原始 AES 密钥环中只能指定一个包装密钥,但每个多重密钥环中可以包含多个原始 AES 密钥环,该等密钥环可单独纳入或与其他密钥环一同纳入。

密钥命名空间和名称

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

注意

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

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

例如,您可以使用密钥命名空间 HSM_01 和密钥名称 AES_256_012 定义原始 AES 密钥环。然后使用该密钥环加密部分数据。要解密这些数据,请使用相同的密钥命名空间、密钥名称和密钥材料构造原始 AES 密钥环。

以下示例说明了如何创建原始 AES 密钥。AESWrappingKey 变量代表您提供的密钥材料。

Java
final CreateRawAesKeyringInput keyringInput = CreateRawAesKeyringInput.builder() .keyName("AES_256_012") .keyNamespace("HSM_01") .wrappingKey(AESWrappingKey) .wrappingAlg(AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); IKeyring rawAesKeyring = matProv.CreateRawAesKeyring(keyringInput);
C# / .NET
var keyNamespace = "HSM_01"; var keyName = "AES_256_012"; // This example uses the key generator in Bouncy Castle to generate the key material. // In production, use key material from a secure source. var aesWrappingKey = new MemoryStream(GeneratorUtilities.GetKeyGenerator("AES256").GenerateKey()); // Create the keyring var keyringInput = new CreateRawAesKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, WrappingKey = AESWrappingKey, WrappingAlg = AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16 }; var matProv = new MaterialProviders(new MaterialProvidersConfig()); IKeyring rawAesKeyring = matProv.CreateRawAesKeyring(keyringInput);