多重 keyring - AWS 資料庫加密 SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

多重 keyring

我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍會提供 DynamoDB Encryption Client 的相關資訊。

您可以結合 keyring 成為多重 keyring。多重 keyring 是一種 keyring,其中包含相同或不同類型的一或多個個別 keyring。效果就像是使用系列中的數個 keyring。使用多重 keyring 來加密資料時,其任何 keyring 中的任何包裝金鑰均可以解密該資料。

建立多重 keyring 來加密資料時,您會指定其中一個 keyring 做為產生器 keyring。所有其他 keyring 稱為子 keyring。產生器 keyring 會產生並加密純文字資料金鑰。然後,所有子 keyring 中的所有包裝金鑰會加密相同的純文字資料金鑰。該多重 keyring 會為多重 keyring 中的每個包裝金鑰傳回純文字金鑰和一個加密的資料金鑰。如果產生器 keyring 是 KMS keyring, AWS KMS 則 keyring 中的產生器金鑰會產生並加密純文字金鑰。然後, AWS KMS keyring AWS KMS keys 中的所有額外金鑰,以及 multi-keyring 中所有子 keyring 中的所有包裝金鑰,請加密相同的純文字金鑰。

解密時, AWS 資料庫加密 SDK 會使用 keyring 來嘗試解密其中一個加密的資料金鑰。按照在多重 keyring 中指定的順序呼叫 keyring。只要任何 keyring 中的任何金鑰可以解密已加密的資料金鑰,處理就會停止。

若要建立多重 keyring,請先將子 keyring 執行個體化。在此範例中,我們使用 AWS KMS keyring 和 Raw AES keyring,但您可以在多 keyring 中結合任何支援的 keyring。

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?;

接著,建立多重 keyring,並指定其產生器 keyring (如果有)。在此範例中,我們會建立多金鑰環,其中 AWS KMS keyring 是產生器 keyring,AES keyring 是子 keyring。

Java

Java CreateMultiKeyringInput建構函式可讓您定義產生器 keyring 和子 keyring。產生的createMultiKeyringInput物件不可變。

final CreateMultiKeyringInput createMultiKeyringInput = CreateMultiKeyringInput.builder() .generator(awsKmsMrkMultiKeyring) .childKeyrings(Collections.singletonList(rawAesKeyring)) .build(); IKeyring multiKeyring = matProv.CreateMultiKeyring(createMultiKeyringInput);
C# / .NET

.NET CreateMultiKeyringInput 建構函式可讓您定義產生器 keyring 和子 keyring。產生的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?;

現在,您可以使用多重 keyring 來加密和解密資料。