原始RSA金鑰環 - AWS Encryption SDK

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

原始RSA金鑰環

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

加密和解密的原始RSA金鑰環必須包含非對稱公有金鑰和私有金鑰對。不過,您可以使用只有公有金鑰的原始RSA金鑰環加密資料,也可以使用只有私有金鑰的原始RSA金鑰環解密資料。您可以在多RSA金鑰 中包含任何原始金鑰。 多重 keyring如果您使用公有金鑰和私有金鑰設定原始RSA金鑰環,請確定它們屬於相同的金鑰對。的某些語言實作 AWS Encryption SDK 不會使用來自不同對的金鑰建置原始RSA金鑰。其他人依賴您驗證您的金鑰是否來自相同的金鑰對。

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

注意

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

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

在 中建構原始RSA金鑰環時 適用於 C 的 AWS Encryption SDK,請務必提供包含每個金鑰PEM的檔案內容,作為 null 終止的 C 字串,而不是路徑或檔案名稱。在 中建構原始RSA金鑰環時 JavaScript,請注意與其他語言實作的潛在不相容

命名空間和名稱

若要識別鍵環中的RSA金鑰材料,原始RSA鍵環會使用您提供的金鑰命名空間金鑰名稱。這些值並非機密。它們會以純文字顯示在加密操作傳回的加密訊息標頭中。建議您使用金鑰命名空間和金鑰名稱,以識別 或 HSM金鑰管理系統中的RSA金鑰對 (或其私有金鑰)。

注意

金鑰命名空間和金鑰名稱等同於 和 中的提供者 ID (或提供者JceMasterKey金鑰 ID 欄位RawMasterKey

適用於 C 的 AWS Encryption SDK 會保留aws-kms金鑰的KMS金鑰命名空間值。請勿將其與 搭配使用於原始AES金鑰環或原始RSA金鑰環 適用於 C 的 AWS Encryption SDK。

如果您建構不同的鍵環來加密和解密指定的訊息,命名空間和名稱值至關重要。如果解密金鑰環中的金鑰命名空間和金鑰名稱與加密金鑰環中金鑰命名空間和金鑰名稱不完全且區分大小寫,即使金鑰來自相同的金鑰對,也不會使用解密金鑰環。

加密和解密金鑰環中金鑰材料的金鑰命名空間和金鑰名稱必須相同,無論金鑰環是否包含RSA公有金鑰、RSA私有金鑰或金鑰對中的兩個金鑰。例如,假設您使用原始RSA金鑰來加密具有金鑰命名空間HSM_01和金鑰名稱 的RSA公有金鑰的資料RSA_2048_06。若要解密該資料,請使用私有RSA金鑰 (或金鑰對) 和相同的金鑰命名空間和名稱來建構原始金鑰環。

填充模式

您必須為用於加密和解密的原始RSA金鑰環指定填充模式,或使用語言實作的功能來為您指定。

AWS Encryption SDK 支援下列填充模式,受限於每種語言的限制。我們建議使用OAEP填充模式,特別是 OAEP SHA-256 和 MGF1 SHA-256 Padding。僅支援向後相容性的PKCS1填充模式。

  • OAEP 使用 SHA-1 和 MGF1 SHA-1 Padding

  • OAEP 使用 SHA-256 和 MGF1 SHA-256 Padding

  • OAEP 使用 SHA-384 和 MGF1 SHA-384 Padding

  • OAEP 使用 SHA-512 和 MGF1 SHA-512 Padding

  • PKCS1 v1.5 填充

下列範例示範如何使用RSA金鑰對的公有和私有金鑰,以及使用 SHA-256 和 MGF1 SHA-256 填充模式OAEP來建立原始RSA金鑰環。RSAPublicKeyRSAPrivateKey變數代表您提供的關鍵材料。

C

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

在 中建構原始RSA金鑰環時 適用於 C 的 AWS Encryption SDK,請務必提供包含每個金鑰PEM的檔案內容,作為 null 終止的 C 字串,而不是路徑或檔案名稱。如需完整範例,請參閱 raw_rsa_keyring.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

若要在適用於 AWS Encryption SDK 的 中實例化原始RSA金鑰環NET,請使用 materialProviders.CreateRawRsaKeyring()方法。如需完整範例,請參閱 RawRSAKeyringExample.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()方法來實例化金鑰環。在 中建構原始RSA金鑰環時 JavaScript,請注意與其他語言實作的潛在不相容

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

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

import { RsaImportableKey, RawRsaKeyringWebCrypto, buildClient, CommitmentPolicy, } from '@aws-crypto/client-browser' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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

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

在 中建構原始RSA金鑰環時 JavaScript,請注意與其他語言實作的潛在不相容

下列範例使用 buildClient函數來指定預設承諾政策 REQUIRE_ENCRYPT_REQUIRE_DECRYPT。您也可以使用 buildClient來限制加密訊息中的加密資料金鑰數量。如需詳細資訊,請參閱限制加密的資料金鑰

如需完整範例,請參閱 rsa_simple.ts (JavaScript Node.js)。

import { RawRsaKeyringNode, buildClient, CommitmentPolicy, } from '@aws-crypto/client-node' const { encrypt, decrypt } = buildClient( CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) 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);
Python

下列範例會使用預設承諾政策 、 來實例化 AWS Encryption SDK 用戶端REQUIRE_ENCRYPT_REQUIRE_DECRYPT。如需完整範例,請參閱 中 適用於 Python 的 AWS Encryption SDK 儲存庫中的 raw_rsa_keyring_example.py GitHub。

# Define the key namespace and key name key_name_space = "HSM_01" key_name = "RSA_2048_06" # Instantiate the material providers mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create Raw RSA keyring keyring_input: CreateRawRsaKeyringInput = CreateRawRsaKeyringInput( key_namespace=key_name_space, key_name=key_name, padding_scheme=PaddingScheme.OAEP_SHA256_MGF1, public_key=RSAPublicKey, private_key=RSAPrivateKey ) raw_rsa_keyring: IKeyring = mat_prov.create_raw_rsa_keyring( input=keyring_input )