기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Raw RSA 키링
Raw RSA 키링은 제공한 RSA 퍼블릭 및 프라이빗 키를 사용하여 로컬 메모리에서 데이터 키의 비대칭 암호화 및 복호화를 수행합니다. 가급적이면 하드웨어 보안 모듈(HSM) 또는 키 관리 시스템에서 프라이빗 키를 생성, 저장 및 보호해야 합니다. 암호화 기능은 RSA 퍼블릭 키로 데이터 키를 암호화합니다. 복호화 함수는 프라이빗 키를 사용하여 데이터 키를 복호화합니다. 여러 RSA 패딩 모드 중에서 선택할 수 있습니다.
암호화 및 복호화하는 Raw RSA 키링에는 비대칭 퍼블릭 키 페어와 프라이빗 키 페어가 포함되어야 합니다. 단, 퍼블릭 키만 있는 Raw RSA 키링을 사용하여 데이터를 암호화할 수 있으며, 프라이빗 키만 있는 Raw RSA 키링을 사용하여 데이터를 복호화할 수 있습니다. 다중 키링에 Raw RSA 키링을 포함시킬 수 있습니다. 퍼블릭 키와 프라이빗 키로 Raw RSA 키링을 구성하는 경우 두 키링이 동일한 키 페어에 속하는지 확인하세요. 의 일부 언어 구현 AWS Encryption SDK 은 서로 다른 페어의 키를 사용하여 Raw RSA 키링을 구성하지 않습니다. 다른 구현에서는 키가 동일한 키 페어에서 나온 것인지 사용자가 확인해야 합니다.
Raw RSA 키링은의 JceMasterKey 및 RSA 비대칭 암호화 키와 함께 사용되는 AWS Encryption SDK for Python 경우의 RawMasterKey와 동등 AWS Encryption SDK for Java 하며 상호 작동합니다. 한 구현으로 데이터를 암호화하고 다른 구현으로는 동일한 래핑 키를 사용하여 데이터를 복호화할 수 있습니다. 세부 정보는 키링 호환성을 참조하세요.
Raw RSA 키링은 비대칭 KMS 키를 지원하지 않습니다. 비대칭 RSA KMS 키를 사용하려면 다음 프로그래밍 언어가 비대칭 RSA를 사용하는 AWS KMS 키링을 지원합니다 AWS KMS keys.
-
의 버전 3.x AWS Encryption SDK for Java
-
.NET AWS Encryption SDK 용의 버전 4.x
-
선택적 암호화 자료 공급자 라이브러리(MPL) 종속성과 함께 사용하는 AWS Encryption SDK for Python경우 버전 4.x.
-
Go AWS Encryption SDK 용의 버전 0.1.x 이상
RSA KMS 키의 퍼블릭 키가 포함된 Raw RSA 키링으로 데이터를 암호화하는 경우 AWS Encryption SDK 도 복호화할 AWS KMS 수 없습니다. AWS KMS 비대칭 KMS 키의 프라이빗 키는 Raw RSA 키링으로 내보낼 수 없습니다. AWS KMS 복호화 작업은이 AWS Encryption SDK 반환하는 암호화된 메시지를 복호화할 수 없습니다.
에서 Raw RSA 키링을 구성할 때는 경로 또는 파일 이름이 아닌 null로 종료된 C-문자열로 각 키를 포함하는 PEM 파일의 내용을 제공해야 AWS Encryption SDK for C합니다. JavaScript에서 Raw RSA 키링을 구성하면 다른 언어 구현과 호환되지 않을 수 있습니다.
네임스페이스 및 이름
키링에서 RSA 키 자료를 식별하기 위해 Raw RSA 키링은 사용자가 제공한 키 네임스페이스와 키 이름을 사용합니다. 이 값은 비밀이 아닙니다. 암호화 작업이 반환하는 암호화된 메시지 헤더에 일반 텍스트로 나타납니다. HSM 또는 키 관리 시스템에서 RSA 키 페어(또는 프라이빗 키)를 식별하는 키 네임스페이스와 키 이름을 사용하는 것이 좋습니다.
키 네임스페이스와 키 이름은 JceMasterKey
및 RawMasterKey
의 공급자 ID(또는 공급자) 및 키 ID 필드와 동일합니다.
는 KMS aws-kms
키의 키 네임스페이스 값을 AWS Encryption SDK for C 예약합니다. Raw AES 키링 또는 Raw RSA 키링을 AWS Encryption SDK for C와 함께 사용하지 마세요.
특정 메시지를 암호화하고 복호화하기 위해 서로 다른 키링을 구성하는 경우 네임스페이스와 이름 값이 중요합니다. 복호화 키링의 키 네임스페이스와 키 이름이 대/소문자를 구분하여 암호화 키링의 키 네임스페이스와 키 이름이 정확히 일치하지 않으면 키가 동일한 키 페어에 속하더라도 복호화 키링이 사용되지 않습니다.
암호화 및 복호화 키링에 있는 키 자료의 키 네임스페이스와 키 이름은 키링에 RSA 퍼블릭 키, RSA 프라이빗 키 또는 키 페어의 두 키가 모두 포함되어 있는지 여부에 관계없이 동일해야 합니다. 예를 들어 키 네임스페이스 HSM_01
및 키 이름 RSA_2048_06
이 있는 RSA 퍼블릭 키에 대한 Raw RSA 키링으로 데이터를 암호화한다고 가정해 보겠습니다. 해당 데이터를 복호화하려면 프라이빗 키(또는 키 페어)와 동일한 키 네임스페이스 및 이름을 사용하여 Raw RSA 키링을 구성하세요.
패딩 모드
암호화 및 복호화에 사용되는 Raw RSA 키링의 패딩 모드를 지정하거나 해당 패딩 모드를 지정하는 언어 구현 기능을 사용해야 합니다.
는 각 언어의 제약 조건에 따라 다음과 같은 패딩 모드를 AWS Encryption SDK 지원합니다. OAEP 패딩 모드, 특히 SHA-256을 사용하는 OAEP와 SHA-256 패딩을 사용하는 MGF1을 추천합니다. PKCS1 패딩 모드는 이하 버전과의 호환성을 위해서만 지원됩니다.
-
SHA-1 패딩 모드가 있는 OAEP 및 MGF1
-
SHA-256 패딩 모드가 있는 OAEP 및 MGF1
-
SHA-384 패딩 모드가 있는 OAEP 및 MGF1
-
SHA-512 패딩 모드가 있는 OAEP 및 MGF1
-
PKCS1 v1.5 패딩
다음 예제는 SHA-256 패딩 모드가 있는 MGF1과 RSA 키 쌍의 공개 및 개인 키를 사용하여 원시 RSA 키링을 생성하는 방법을 보여줍니다. RSAPublicKey
및 RSAPrivateKey
변수는 사용자가 제공하는 키 자료를 나타냅니다.
- C
-
에서 Raw RSA 키링을 생성하려면를 AWS Encryption SDK for C사용합니다aws_cryptosdk_raw_rsa_keyring_new
.
에서 Raw RSA 키링을 구성할 때는 경로 또는 파일 이름이 아닌 null로 종료된 C-문자열로 각 키를 포함하는 PEM 파일의 내용을 제공해야 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 for .NET에서 Raw RSA 키링을 인스턴스화하려면 materialProviders.CreateRawRsaKeyring()
메서드를 사용합니다. 전체 예제는 RawRSAKeyringExample.cs를 참조하세요.
다음 예제에서는 AWS Encryption SDK for .NET 4.x 버전을 사용합니다.
// 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 라이브러리에서 암호화 프리미티브를 가져옵니다. 키링을 구성하기 전에 WebCrypto 백엔드로 원시 키 자료를 가져오는 데 importPublicKey()
또는 importPrivateKey()
를 사용해야 합니다. 이렇게 하면 WebCrypto에 대한 모든 호출이 비동기식이어도 키링이 완료됩니다. 가져오기 메서드가 사용하는 객체에는 래핑 알고리즘과 해당 패딩 모드가 포함됩니다.
키 자료를 가져온 후 RawRsaKeyringWebCrypto()
메서드를 사용하여 키링을 인스턴스화하세요. JavaScript에서 Raw RSA 키링을 구성하면 다른 언어 구현과 호환되지 않을 수 있습니다.
다음 예제에서는 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
-
Node.js AWS Encryption SDK for JavaScript 용에서 Raw RSA 키링을 인스턴스화하려면 RawRsaKeyringNode
클래스의 새 인스턴스를 생성합니다. wrapKey
파라미터는 퍼블릭 키를 보유합니다. unwrapKey
파라미터는 프라이빗 키를 보유합니다. 기본 패딩 모드를 지정할 수는 있지만 RawRsaKeyringNode
생성자가 기본 패딩 모드를 자동으로 계산합니다.
JavaScript에서 Raw RSA 키링을 구성하면 다른 언어 구현과 호환되지 않을 수 있습니다.
다음 예제에서는 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
. 전체 예제는 GitHub의 AWS Encryption SDK for Python 리포지토리에서 raw_rsa_keyring_example.py를 참조하세요.
# 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
)
- Rust
-
// Instantiate the AWS Encryption SDK client
let esdk_config = AwsEncryptionSdkConfig::builder().build()?;
let esdk_client = esdk_client::Client::from_conf(esdk_config)?;
// Optional: Create an encryption context
let encryption_context = HashMap::from([
("encryption".to_string(), "context".to_string()),
("is not".to_string(), "secret".to_string()),
("but adds".to_string(), "useful metadata".to_string()),
("that can help you".to_string(), "be confident that".to_string()),
("the data you are handling".to_string(), "is what you think it is".to_string()),
]);
// Define the key namespace and key name
let key_namespace: &str = "HSM_01
";
let key_name: &str = "RSA_2048_06
";
// Instantiate the material providers library
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;
// Create Raw RSA keyring
let raw_rsa_keyring = mpl
.create_raw_rsa_keyring()
.key_name(key_name)
.key_namespace(key_namespace)
.padding_scheme(PaddingScheme::OaepSha256Mgf1
)
.public_key(aws_smithy_types::Blob::new(RSAPublicKey
))
.private_key(aws_smithy_types::Blob::new(RSAPrivateKey
))
.send()
.await?;
- Go
-
// Instantiate the material providers library
matProv, err := awscryptographymaterialproviderssmithygenerated.NewClient(awscryptographymaterialproviderssmithygeneratedtypes.MaterialProvidersConfig{})
// Create Raw RSA keyring
rsaKeyRingInput := awscryptographymaterialproviderssmithygeneratedtypes.CreateRawRsaKeyringInput{
KeyName: "rsa",
KeyNamespace: "rsa-keyring",
PaddingScheme: awscryptographymaterialproviderssmithygeneratedtypes.PaddingSchemePkcs1,
PublicKey: pem.EncodeToMemory(publicKeyBlock),
PrivateKey: pem.EncodeToMemory(privateKeyBlock),
}
rsaKeyring, err := matProv.CreateRawRsaKeyring(context.Background(), rsaKeyRingInput)
- Go
-
import (
"context"
mpl "aws/aws-cryptographic-material-providers-library/releases/go/mpl/awscryptographymaterialproviderssmithygenerated"
mpltypes "aws/aws-cryptographic-material-providers-library/releases/go/mpl/awscryptographymaterialproviderssmithygeneratedtypes"
client "github.com/aws/aws-encryption-sdk/awscryptographyencryptionsdksmithygenerated"
esdktypes "github.com/aws/aws-encryption-sdk/awscryptographyencryptionsdksmithygeneratedtypes"
)
// Instantiate the AWS Encryption SDK client
encryptionClient, err := client.NewClient(esdktypes.AwsEncryptionSdkConfig{})
if err != nil {
panic(err)
}
// Optional: Create an encryption context
encryptionContext := map[string]string{
"encryption": "context",
"is not": "secret",
"but adds": "useful metadata",
"that can help you": "be confident that",
"the data you are handling": "is what you think it is",
}
// Define the key namespace and key name
var keyNamespace = "HSM_01
"
var keyName = "RSA_2048_06
"
// Instantiate the material providers library
matProv, err := mpl.NewClient(mpltypes.MaterialProvidersConfig{})
if err != nil {
panic(err)
}
// Create Raw RSA keyring
rsaKeyRingInput := mpltypes.CreateRawRsaKeyringInput{
KeyName: keyName,
KeyNamespace: keyNamespace,
PaddingScheme: mpltypes.PaddingSchemeOaepSha512Mgf1
,
PublicKey: (RSAPublicKey
),
PrivateKey: (RSAPrivateKey
),
}
rsaKeyring, err := matProv.CreateRawRsaKeyring(context.Background(), rsaKeyRingInput)
if err != nil {
panic(err)
}