원시 RSA 키링 - AWS Encryption SDK

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

원시 RSA 키링

원시 RSA 키링은 사용자가 제공하는 RSA 퍼블릭 및 프라이빗 키를 사용하여 로컬 메모리의 데이터 키에 대한 비대칭 암호화 및 복호화를 수행합니다. 프라이빗 키를 생성, 저장 및 보호해야 합니다. 가급적이면 하드웨어 보안 모듈(HSM) 또는 키 관리 시스템에서 생성, 저장 및 보호해야 합니다. 암호화 함수는 RSA 퍼블릭 키 아래의 데이터 키를 암호화합니다. 복호화 함수는 프라이빗 키를 사용하여 데이터 키를 복호화합니다. 여러 RSA 패딩 모드 중에서 선택할 수 있습니다.

암호화 및 복호화하는 원시 RSA 키링에는 비대칭 퍼블릭 키와 프라이빗 키 페어가 포함되어야 합니다. 하지만 퍼블릭 RSA 키만 있는 원시 키링으로 데이터를 암호화할 수 있으며 프라이빗 키만 있는 원시 RSA 키링으로 데이터를 복호화할 수 있습니다. 다중 RSA 키링 에 원시 키링을 포함할 수 있습니다. 다중 키링 퍼블릭 키와 프라이빗 키로 원시 RSA 키링을 구성하는 경우 동일한 키 페어의 일부인지 확인하세요. 의 일부 언어 구현 AWS Encryption SDK 은 서로 다른 페어의 키를 사용하여 원시 RSA 키링을 구성하지 않습니다. 다른 구현에서는 키가 동일한 키 페어에서 나온 것인지 사용자가 확인해야 합니다.

원시 RSA 키링은 RSA 비대칭 암호화 키와 함께 사용할 AWS Encryption SDK for Python 때 JceMasterKey의 및 RawMasterKey의 와 동등 AWS Encryption SDK for Java 하며 상호 작동합니다. 한 구현으로 데이터를 암호화하고 다른 구현으로는 동일한 래핑 키를 사용하여 데이터를 복호화할 수 있습니다. 세부 정보는 키링 호환성을 참조하세요.

참고

원시 RSA 키링은 비대칭 KMS 키를 지원하지 않습니다. 비대칭 RSA KMS 키를 사용하려면 용 의NET 버전 4.x AWS Encryption SDK 와 대칭 암호화(SYMMETRIC_DEFAULT) 또는 비대칭 를 AWS Encryption SDK for Java 사용하는 지원 AWS KMS 키링의 버전 3.x를 사용합니다RSA AWS KMS keys.

RSA KMS 키의 퍼블릭 RSA 키가 포함된 원시 키링으로 데이터를 암호화하는 경우 AWS Encryption SDK 도 복호화 AWS KMS 할 수 없습니다. AWS KMS 비대칭 키의 프라이빗 KMS 키를 원시 RSA 키링으로 내보낼 수 없습니다. AWS KMS 복호화 작업은 이 AWS Encryption SDK 반환하는 암호화된 메시지를 복호화할 수 없습니다.

에서 원시 RSA 키링을 구성할 때는 경로 또는 PEM 파일 이름이 아닌 null로 종료된 C-string으로 각 키를 포함하는 파일의 내용을 제공해야 AWS Encryption SDK for C합니다. 에서 원시 RSA 키링을 구성할 때는 다른 언어 구현과의 잠재적 비호환성을 JavaScript인식해야 합니다.

네임스페이스 및 이름

키링에서 RSA 키 구성 요소를 식별하기 위해 Raw RSA 키링은 사용자가 제공하는 키 네임스페이스키 이름을 사용합니다. 이 값은 비밀이 아닙니다. 암호화 작업이 반환하는 암호화된 메시지 헤더에 일반 텍스트로 나타납니다. HSM 또는 키 관리 시스템에서 키 페어(또는 프라이빗 RSA 키)를 식별하는 키 네임스페이스와 키 이름을 사용하는 것이 좋습니다.

참고

키 네임스페이스와 키 이름은 JceMasterKeyRawMasterKey공급자 ID(또는 공급자) 및 키 ID 필드와 동일합니다.

aws-kms 키에 대한 KMS 키 네임스페이스 값을 AWS Encryption SDK for C 예약합니다. 에서 원시 AES 키링 또는 원시 RSA 키링에 사용하지 마세요 AWS Encryption SDK for C.

특정 메시지를 암호화하고 복호화하기 위해 서로 다른 키링을 구성하는 경우 네임스페이스와 이름 값이 중요합니다. 복호화 키링의 키 네임스페이스와 키 이름이 대/소문자를 구분하여 암호화 키링의 키 네임스페이스와 키 이름이 정확히 일치하지 않으면 키가 동일한 키 페어에 속하더라도 복호화 키링이 사용되지 않습니다.

암호화 및 복호화 키링에 있는 키 구성 요소의 키 네임스페이스와 키 이름은 키링에 RSA 퍼블릭 키, RSA 프라이빗 키 또는 키 페어의 두 키가 모두 포함되어 있는지 여부에 관계없이 동일해야 합니다. 예를 들어 키 네임스페이스와 RSA 키 HSM_01 이름이 인 RSA 퍼블릭 키에 대해 원시 키링으로 데이터를 암호화한다고 가정해 보겠습니다RSA_2048_06. 해당 데이터를 복호화하려면 프라이빗 RSA 키(또는 키 페어)와 동일한 키 네임스페이스 및 이름으로 Raw 키링을 구성합니다.

패딩 모드

암호화 및 복호화에 사용되는 원시 RSA 키링에 대한 패딩 모드를 지정하거나 이를 지정하는 언어 구현 기능을 사용해야 합니다.

는 각 언어의 제약 조건에 따라 다음 패딩 모드를 AWS Encryption SDK 지원합니다. 특히 OAEP SHA-256 및 -256 패딩OAEP의 MGF1 SHA패딩 모드를 사용하는 것이 좋습니다. PKCS1 패딩 모드는 이전 버전과의 호환성에만 지원됩니다.

  • OAEP SHA-1 및 SHA-1 패딩 MGF1 사용

  • OAEP SHA-256 및 SHA-256 패딩 MGF1 사용

  • OAEP SHA-384 및 SHA-384 패딩 MGF1 사용

  • OAEP SHA-512 및 SHA-512 패딩 MGF1 사용

  • PKCS1 v1.5 패딩

다음 예제에서는 RSA 키 RSA 페어의 퍼블릭 및 프라이빗 키와 SHA-256 및 -2MGF1SHA56 패딩 모드를 OAEP 사용하여 Raw 키링을 생성하는 방법을 보여줍니다. RSAPublicKeyRSAPrivateKey 변수는 사용자가 제공하는 키 자료를 나타냅니다.

C

에서 원시 RSA 키링을 생성하려면 를 AWS Encryption SDK for C사용합니다aws_cryptosdk_raw_rsa_keyring_new.

에서 원시 RSA 키링을 구성할 때는 경로 또는 PEM 파일 이름이 아닌 null로 종료된 C-string으로 각 키를 포함하는 파일의 내용을 제공해야 AWS Encryption SDK for 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 키링을 인스턴스화하려면 materialProviders.CreateRawRsaKeyring() 메서드를 NET사용합니다. 전체 예제는 RawRSAKeyringExample.cs 참조하세요.

다음 예제에서는 AWS Encryption SDK 에 의 버전 4.x를 사용합니다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

브라우저 AWS Encryption SDK for JavaScript 의 는 WebCrypto 라이브러리에서 암호화 프리미티브를 가져옵니다. 키링을 구성하기 전에 importPublicKey() 및/또는 importPrivateKey() 를 사용하여 원시 키 구성 요소를 WebCrypto 백엔드로 가져와야 합니다. 이렇게 하면 에 대한 모든 호출이 비동기식이더라도 키링 WebCrypto 이 완료됩니다. 가져오기 메서드가 사용하는 객체에는 래핑 알고리즘과 해당 패딩 모드가 포함됩니다.

키 자료를 가져온 후 RawRsaKeyringWebCrypto() 메서드를 사용하여 키링을 인스턴스화하세요. 에서 원시 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 AWS Encryption SDK for JavaScript 용 에서 원시 RSA 키링을 인스턴스화하려면 RawRsaKeyringNode 클래스의 새 인스턴스를 생성합니다. wrapKey 파라미터는 퍼블릭 키를 보유합니다. unwrapKey파라미터는 프라이빗 키를 보유합니다. 기본 패딩 모드를 지정할 수는 있지만 RawRsaKeyringNode 생성자가 기본 패딩 모드를 자동으로 계산합니다.

에서 원시 RSA 키링을 구성할 때는 다른 언어 구현과의 잠재적 비호환성을 인식 JavaScript해야 합니다.

전체 예제는 rsa_simple.ts(JavaScript Node.js)를 참조하세요.

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