原始AES鑰匙圈 - AWS Encryption SDK

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

原始AES鑰匙圈

AWS Encryption SDK 可讓您使用您提供的AES對稱金鑰做為保護資料金鑰的環繞金鑰。您必須產生、儲存及保護金鑰材料,最好是在硬體安全模組 (HSM) 或金鑰管理系統中。當您需要提供包裝金AES鑰並在本機或離線加密資料金鑰時,請使用 Raw 金鑰圈。

Raw 金AES鑰環會使用 AES-GCM 演算法和您指定為位元組陣列的包裝金鑰來加密資料。您只能在每個 Raw 金鑰圈中指定一個環繞金鑰,但您可以在多重金鑰AES圈中包含多個 Raw 金AES鑰圈,單獨或與其他金鑰圈一起包含多個 Raw 金鑰圈。

Raw AES 金鑰環等同於與AES加密金鑰搭配使用 適用於 Python 的 AWS Encryption SDK 時,與中的RawMasterKey類別 適用於 JAVA 的 AWS Encryption SDK 和類別相互操作。JceMasterKey您可以使用一個實作來加密資料,並利用使用相同包裝金鑰的任何其他實作來解密資料。如需詳細資訊,請參閱 Keyring 相容性

關鍵命名空間和名稱

為了識別AES金鑰圈中的金鑰,Raw 金AES鑰圈會使用您提供的金鑰命名空間金鑰名稱。這些值並非機密。它們會以純文字顯示在加密作業傳回的加密郵件標頭中。我們建議您使用金鑰命名空間HSM或金鑰管理系統,以及識別該系統中AES金鑰的金鑰名稱。

注意

金鑰命名空間和金鑰名稱等同於和中的「提供者 ID」(或「提供者」) 和「金鑰 ID」欄位RawMasterKeyJceMasterKey

適用於 C 的 AWS Encryption SDK 和 AWS Encryption SDK 的。 NET保留金aws-kms鑰的索引KMS鍵命名空間值。請勿在 Raw AES 金鑰環或 Raw 金鑰圈中使用此命名空間值與這些程式RSA庫。

如果您構建不同的密鑰環來加密和解密給定的消息,則命名空間和名稱值非常重要。如果解密金鑰圈中的金鑰命名空間和金鑰名稱與加密金鑰圈中的金鑰命名空間和金鑰名稱不完全相符且區分大小寫,即使金鑰材料位元組相同,也不會使用解密金鑰圈。

例如,您可以使用金鑰命名空間HSM_01和金鑰名稱AES_256_012來定義 Raw 金鑰AES環。然後,您可以使用該密鑰環來加密某些數據。要解密該數據,請使用相同的密AES鑰名稱空間,密鑰名稱和密鑰材料構造一個 Raw 密鑰環。

下列範例顯示如何建立 Raw AES 金鑰圈。AESWrappingKey變數代表您提供的關鍵材料。

C

若要在中實例化 Raw AES 金鑰環 適用於 C 的 AWS Encryption SDK,請使用. aws_cryptosdk_raw_aes_keyring_new() 如需完整範例,請參閱「鍵」。

struct aws_allocator *alloc = aws_default_allocator(); AWS_STATIC_STRING_FROM_LITERAL(wrapping_key_namespace, "HSM_01"); AWS_STATIC_STRING_FROM_LITERAL(wrapping_key_name, "AES_256_012"); struct aws_cryptosdk_keyring *raw_aes_keyring = aws_cryptosdk_raw_aes_keyring_new( alloc, wrapping_key_namespace, wrapping_key_name, aes_wrapping_key, wrapping_key_len);
C# / .NET

在 AWS Encryption SDK 中建立 Raw AES 金鑰圈。 NET,使用該materialProviders.CreateRawAesKeyring()方法。如需完整範例,請參閱 R awAESKeyring Example.cs

下列範例使用版本 4。 的 x AWS Encryption SDK 的。 NET。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); 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 that determines how your data keys are protected. var createKeyringInput = new CreateRawAesKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, WrappingKey = aesWrappingKey, WrappingAlg = AesWrappingAlg.ALG_AES256_GCM_IV12_TAG16 }; var keyring = materialProviders.CreateRawAesKeyring(createKeyringInput);
JavaScript Browser

適用於 JavaScript 的 AWS Encryption SDK 在瀏覽器中獲取其密碼編譯原語從. WebCryptoAPI 在建構金鑰圈之前,您必須使用RawAesKeyringWebCrypto.importCryptoKey()將原始金鑰材料匯入 WebCrypto 後端。即使所有呼叫都是 WebCrypto 非同步的,這也可以確保金鑰圈完成。

然後,要實例化 Raw AES 密鑰環,請使用該方RawAesKeyringWebCrypto()法。您必須根據密鑰材料的長度指定包裝算法(「包裝套件)。AES如需完整範例,請參閱 aes_simple.ts (瀏覽器)。JavaScript

const keyNamespace = 'HSM_01' const keyName = 'AES_256_012' const wrappingSuite = RawAesWrappingSuiteIdentifier.AES256_GCM_IV12_TAG16_NO_PADDING /* Import the plaintext AES key into the WebCrypto backend. */ const aesWrappingKey = await RawAesKeyringWebCrypto.importCryptoKey( rawAesKey, wrappingSuite ) const rawAesKeyring = new RawAesKeyringWebCrypto({ keyName, keyNamespace, wrappingSuite, aesWrappingKey })
JavaScript Node.js

若要在 Node.js 中實例化原始AES金鑰環, 適用於 JavaScript 的 AWS Encryption SDK 請建立類別的實體。 RawAesKeyringNode您必須根據密鑰材料的長度指定包裝算法(「包裝套件」)。AES如需完整範例,請參閱 「簡單」(Node.js)。JavaScript

const keyName = 'AES_256_012' const keyNamespace = 'HSM_01' const wrappingSuite = RawAesWrappingSuiteIdentifier.AES256_GCM_IV12_TAG16_NO_PADDING const rawAesKeyring = new RawAesKeyringNode({ keyName, keyNamespace, aesWrappingKey, wrappingSuite, })
Java

若要在中實例化 Raw AES 金鑰環 適用於 JAVA 的 AWS Encryption SDK,請使用. matProv.CreateRawAesKeyring()

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