原始RSA鑰匙圈 - AWS Encryption SDK

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

原始RSA鑰匙圈

Raw 金RSA鑰環使用您提供的RSA公開和私密金鑰,對本機記憶體中的資料金鑰執行非對稱加密和解密。您必須產生、儲存及保護私密金鑰,最好是在硬體安全模組 (HSM) 或金鑰管理系統中。加密功能會加密公開金鑰下的資料金RSA鑰。解密函數會使用私有金鑰解密資料金鑰。您可以從數種RSA填充模式中進行選擇。

加密和解密的原始金RSA鑰圈必須包含非對稱公開金鑰和私密 key pair。不過,您可以使用只有公開金鑰的 Raw 金鑰RSA圈來加密資料,也可以使用只有私密金鑰的 Raw 金RSA鑰圈來解密資料。您可以在鑰匙圈中包含任何 Raw RSA 鑰匙圈。如果您使用公開金RSA鑰和私密金鑰設定 Raw 金鑰圈,請確定它們屬於相同 key pair。的某些語言實作不 AWS Encryption SDK 會使用不同配對的金RSA鑰建構 Raw 金鑰圈。其他人依靠您來驗證您的密鑰來自同一個 key pair。

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

注意

Raw 金RSA鑰圈不支援非對稱KMS金鑰。如果你想使用非對稱RSAKMS密鑰,版本 4。 的 x AWS Encryption SDK 的。 NET和版本 3. 使用對稱加密 (SYMMETRIC_DEFAULT) 或非對稱的 適用於 JAVA 的 AWS Encryption SDK 支援 AWS KMS 金鑰環的 x 個。RSA AWS KMS keys

如果您使用包含金RSA鑰公開金鑰的原始金鑰環來加密資料,則無法將 AWS Encryption SDK 其解密。RSA KMS AWS KMS 您無法將非對稱金鑰的私密KMS金 AWS KMS 鑰匯出至 Raw 金RSA鑰圈。解 AWS KMS 密作業無法解密 AWS Encryption SDK 傳回的加密訊息

在中建構 Raw 金RSA鑰環時 適用於 C 的 AWS Encryption SDK,請務必將包含每個金鑰的PEM檔案內容提供為空結尾的 C 字串,而不是作為路徑或檔案名稱。在中構建 Raw RSA 密鑰環時 JavaScript,請注意與其他語言實現的潛在不兼容性

命名空間和名稱

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

注意

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

會保 適用於 C 的 AWS Encryption SDK 留aws-kms索引鍵的索引KMS鍵命名空間值。請勿將其與 Raw AES 鑰匙圈或 Raw 鑰匙圈一起使用。RSA 適用於 C 的 AWS Encryption SDK

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

無論金鑰圈包含RSA公開金鑰、RSA私密金鑰或金鑰 key pair 中的兩個金鑰,加密和解密金鑰環中的金鑰材料的金鑰名稱空間和金鑰名稱都必須相同。例如,假設您使用具有金鑰命名空間HSM_01和金RSA鑰名稱RSA_2048_06之RSA公開金鑰的原始金鑰環來加密資料。要解密該數據,請使用私鑰(或密鑰對)以及相同的密鑰命名空間和名稱構造 Raw 密鑰RSA環。

填充模式

您必須為用於加密和解密的 Raw 密RSA鑰環指定填充模式,或者使用語言實施的功能來為您指定它。

AWS Encryption SDK 支持以下填充模式,受到每種語言的約束。我們建議使用OAEP填充模式,特別是OAEP使用 SHA -256 和 SHA -256 填MGF1充。只有向後兼容性才支持PKCS1填充模式。

  • OAEP用 SHA -1 和 MGF1 SHA -1 填充

  • OAEP與 SHA -256 和 SHA -256 MGF1 填充

  • OAEP使用 SHA -384 和 -384 填MGF1充 SHA

  • OAEP使用 SHA -512 和MGF1具有 SHA -512 填充

  • PKCS1填充

下列範例說明如何使用金RSA鑰組的公開和私密金鑰,以及使用 -256 和 SHA -256 填補模式來建立原始RSA金鑰環。OAEP MGF1 SHARSAPublicKeyRSAPrivateKey變數代表您提供的關鍵材料。

C

若要在中建立 Raw RSA 金鑰圈 適用於 C 的 AWS Encryption SDK,請使用aws_cryptosdk_raw_rsa_keyring_new

在中建構 Raw 金RSA鑰環時 適用於 C 的 AWS Encryption SDK,請務必將包含每個金鑰的PEM檔案內容提供為空結尾的 C 字串,而不是作為路徑或檔案名稱。如需完整範例,請參閱「關鍵」。

struct aws_allocator *alloc = aws_default_allocator(); AWS_STATIC_STRING_FROM_LITERAL(key_namespace, "HSM_01"); AWS_STATIC_STRING_FROM_LITERAL(key_name, "RSA_2048_06"); struct aws_cryptosdk_keyring *rawRsaKeyring = aws_cryptosdk_raw_rsa_keyring_new( alloc, key_namespace, key_name, private_key_from_pem, public_key_from_pem, AWS_CRYPTOSDK_RSA_OAEP_SHA256_MGF1);
C# / .NET

要在中實例化一個 Raw RSA 密鑰環。 AWS Encryption SDK NET,使用該materialProviders.CreateRawRsaKeyring()方法。如需完整範例,請參閱 R awRSAKeyring 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 = "RSA_2048_06"; // Get public and private keys from PEM files var publicKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePublicKey.pem")); var privateKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePrivateKey.pem")); // Create the keyring input var createRawRsaKeyringInput = new CreateRawRsaKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, PaddingScheme = PaddingScheme.OAEP_SHA512_MGF1, PublicKey = publicKey, PrivateKey = privateKey }; // Create the keyring var rawRsaKeyring = materialProviders.CreateRawRsaKeyring(createRawRsaKeyringInput);
JavaScript Browser

瀏覽器 適用於 JavaScript 的 AWS Encryption SDK 中的從庫中獲取其加密原語。WebCrypto在建構金鑰圈之前,您必須使用importPublicKey()和/或importPrivateKey()將原始金鑰材料匯入 WebCrypto 後端。即使所有呼叫都是 WebCrypto 非同步的,這也可以確保金鑰圈完成。匯入方法採用的物件包含包裝演算法及其填補模式。

匯入金鑰材料後,請使用該RawRsaKeyringWebCrypto()方法實例化金鑰環。在中構建 Raw RSA 密鑰環時 JavaScript,請注意與其他語言實現的潛在不兼容性

如需完整範例,請參閱 rsa_simple. ts (瀏覽器)。JavaScript

const privateKey = await RawRsaKeyringWebCrypto.importPrivateKey( privateRsaJwKKey ) const publicKey = await RawRsaKeyringWebCrypto.importPublicKey( publicRsaJwKKey ) const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringWebCrypto({ keyName, keyNamespace, publicKey, privateKey, })
JavaScript Node.js

若要在中實例化 Node.js 的原始RSA金鑰環, 適用於 JavaScript 的 AWS Encryption SDK 請建立類別的新執行個體RawRsaKeyringNode。該wrapKey參數保存公鑰。unwrapKey參數會保留私密金鑰。雖然您可以指定偏好的填充模式,但建RawRsaKeyringNode構函式會為您計算預設填補模式。

在中構建原始RSA密鑰環時 JavaScript,請注意與其他語言實現的潛在不兼容性

如需完整範例,請參閱簡單的說明 (Node.js)。 JavaScript

const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringNode({ keyName, keyNamespace, rsaPublicKey, rsaPrivateKey})
Java
final CreateRawRsaKeyringInput keyringInput = CreateRawRsaKeyringInput.builder() .keyName("RSA_2048_06") .keyNamespace("HSM_01") .paddingScheme(PaddingScheme.OAEP_SHA256_MGF1) .publicKey(RSAPublicKey) .privateKey(RSAPrivateKey) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); IKeyring rawRsaKeyring = matProv.CreateRawRsaKeyring(keyringInput);