本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
多重密钥环
您可以将多个密钥环合并为一个多重密钥环。多重密钥环 是由一个或多个相同或不同类型的密钥环组成的密钥环。效果与连续使用多个密钥环类似。在使用多重密钥环加密数据时,其任意密钥环中的任意包装密钥都可以对数据进行解密。
在创建多重密钥环以加密数据时,您可以将一个密钥环指定为生成器密钥环。所有其他密钥环称为子密钥环。生成器密钥环生成并加密明文数据密钥。然后,所有子密钥环中的所有包装密钥都加密相同的明文数据密钥。对于多重密钥环中的每个包装密钥,多重密钥环都返回明文密钥和一个加密的数据密钥。如果生成器密钥环是 KMS 密钥环,则密钥 AWS KMS 环中的生成器密钥会生成并加密纯文本密钥。然后,密钥环 AWS KMS keys 中的所有其他密钥,以及多密 AWS KMS 钥环中所有子密钥环中的所有封装密钥,都将加密相同的纯文本密钥。
解密时, AWS 数据库加密 SDK 使用密钥环尝试解密其中一个加密的数据密钥。密钥环是按照在多重密钥环中指定的顺序调用的。只要任何密钥环中的任何密钥可以解密加密的数据密钥,处理就会立即停止。
要创建多重密钥环,首先要实例化子密钥环。在此示例中,我们使用 AWS KMS 密钥环和 Raw AES 密钥环,但您可以将任何支持的密钥环组合到一个多密钥环中。
- Java
-
// 1. Create the raw AES keyring.
final MaterialProviders matProv = MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
final CreateRawAesKeyringInput createRawAesKeyringInput = CreateRawAesKeyringInput.builder()
.keyName("AES_256_012
")
.keyNamespace("HSM_01
")
.wrappingKey(AESWrappingKey
)
.wrappingAlg(AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16)
.build();
IKeyring rawAesKeyring = matProv.CreateRawAesKeyring(createRawAesKeyringInput);
// 2. Create the AWS KMS keyring.
final CreateAwsKmsMrkMultiKeyringInput createAwsKmsMrkMultiKeyringInput = CreateAwsKmsMrkMultiKeyringInput.builder()
.generator(kmsKeyArn
)
.build();
IKeyring awsKmsMrkMultiKeyring = matProv.CreateAwsKmsMrkMultiKeyring(createAwsKmsMrkMultiKeyringInput);
- C# / .NET
-
// 1. Create the raw AES keyring.
var keyNamespace = "HSM_01
";
var keyName = "AES_256_012
";
var matProv = new MaterialProviders(new MaterialProvidersConfig());
var createRawAesKeyringInput = new CreateRawAesKeyringInput
{
KeyName = "keyName",
KeyNamespace = "myNamespaces",
WrappingKey = AESWrappingKey
,
WrappingAlg = AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16
};
var rawAesKeyring = matProv.CreateRawAesKeyring(createRawAesKeyringInput);
// 2. Create the AWS KMS keyring.
// We create a MRK multi keyring, as this interface also supports
// single-region KMS keys,
// and creates the KMS client for us automatically.
var createAwsKmsMrkMultiKeyringInput = new CreateAwsKmsMrkMultiKeyringInput
{
Generator = keyArn
};
var awsKmsMrkMultiKeyring = matProv.CreateAwsKmsMrkMultiKeyring(createAwsKmsMrkMultiKeyringInput);
- Rust
-
// 1. Create the raw AES keyring
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;
let raw_aes_keyring = mpl
.create_raw_aes_keyring()
.key_name("AES_256_012
")
.key_namespace("HSM_01
")
.wrapping_key(aes_key_bytes
)
.wrapping_alg(AesWrappingAlg::AlgAes256GcmIv12Tag16)
.send()
.await?;
// 2. Create the AWS KMS keyring
let aws_kms_mrk_multi_keyring = mpl
.create_aws_kms_mrk_multi_keyring()
.generator(key_arn)
.send()
.await?;
接下来创建多重密钥环并指定其生成器密钥环(如果有)。在此示例中,我们创建了一个多密钥环,其中密钥环是生成器 AWS KMS 密钥环,AES 密钥环是子密钥环。
- Java
-
Java CreateMultiKeyringInput
构造函数允许您定义生成器密钥环和子密钥环。生成的 createMultiKeyringInput
对象不可变。
final CreateMultiKeyringInput createMultiKeyringInput = CreateMultiKeyringInput.builder()
.generator(awsKmsMrkMultiKeyring)
.childKeyrings(Collections.singletonList(rawAesKeyring))
.build();
IKeyring multiKeyring = matProv.CreateMultiKeyring(createMultiKeyringInput);
- C# / .NET
-
.NET CreateMultiKeyringInput
构造函数允许您定义生成器密钥环和子密钥环。生成的 CreateMultiKeyringInput
对象不可变。
var createMultiKeyringInput = new CreateMultiKeyringInput
{
Generator = awsKmsMrkMultiKeyring,
ChildKeyrings = new List<IKeyring> { rawAesKeyring }
};
var multiKeyring = matProv.CreateMultiKeyring(createMultiKeyringInput);
- Rust
-
let multi_keyring = mpl
.create_multi_keyring()
.generator(aws_kms_mrk_multi_keyring)
.child_keyrings(vec![raw_aes_keyring.clone()])
.send()
.await?;
现在,您就可以使用此多重密钥环加密和解密数据了。