0

我正在隐式生成数据加密密钥,如下所示(使用的密钥 ID 只是代表性的):

from aws_encryption_sdk import encrypt

# Key provider with only 2 region master keys to begin with
kms_key_provider = KMSMasterKeyProvider(key_ids=[“west-1”, “west-2”])

# encrypt something random only to get the encrypted data keys in the header from those 2 regions

my_ciphertext, encryptor_header = encrypt(source=“somerandomplaintextofnorelevance”, key_provider= kms_key_provider, algorithm=AWSKeyProvider.DEFAULT_ALGORITHM, encryption_context={“somekey”: “some value”})

my_data_keys = []
for dek in encryptor_header.encrypted_data_keys:
    my_data_keys.append(dek.encrypted_data_key)

我在 my_data_keys(例如 DEK_enc_west_1 和 DEK_enc_west_2)中获得了两个加密的数据加密密钥 (DEK) 字符串,它们都将解密为单个纯数据加密密钥,例如 DEK_Plain。现在我可以在任一区域中为 DEK_Plain 加密/解密以实现冗余。

然后,我继续在east-1 和east-2 区域激活另外两个主密钥。现在我希望在这两个新区域(east-1 和east-2)主密钥下也对相同的 DEK_Plain 进行加密,以获得两个新的加密数据密钥(例如,DEK_enc_east_1 和 DEK_enc_east_2)。

因此,使用新的完全形成的密钥提供程序,例如:

kms_key_provider = KMSMasterKeyProvider(key_ids=[“west-1”, “west-2”, “east-1”, “east-2”])

我可以使用以下 4 个区域中的任何一个获取我的 DEK_Plain:

my_plain_data_key = kms_key_provider.decrypt_data_key_from_list(…..)

基本上,如何添加其他区域主密钥以用于先前使用以前存在的其他区域主密钥生成和加密的相同数据加密密钥?

4

1 回答 1

0

在 AWS 加密文档中环顾四周,我发现类似以下示例的内容有助于我的案例(尽管如果 KMS 密钥提供程序实施具有数据密钥的这种区域扩展器功能,那将是理想的:)。下面假设 plain_dek 被分配了上述问题中的 DEK_Plain。

new_region_key_id_1 = "arn:aws:kms:us-east-1:XXXXXXXXXX:alias/xyz/master"
new_region_master_key_1 = kms_key_provider.master_key_for_encrypt(new_region_key_id_1)
key_provider_info = {"provider_id": u'aws-kms', "key_info": new_region_key_id_1}
key_provider_info_obj = MasterKeyInfo(**key_provider_info)
plain_dk_raw = RawDataKey(key_provider_info_obj, plain_dek)
encryption_context = {“somekey”: “some value”}
new_encrypted_dek_from_region_new_master_key_1 = new_region_master_key_1.encrypt_data_key(plain_dk_raw, AES_256_GCM_IV12_TAG16_HKDF_SHA384_ECDSA_P384, encryption_context)

这可以针对任意数量的新 kms 区域循环重复,从而扩展现有数据密钥,使其在最近添加了新主密钥的更广泛 AWS 区域中可解密。

于 2017-12-13T02:23:27.130 回答