기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
원시 ECDH 키링
원시 ECDH 키링은 Material Providers Library 버전 1.5.0에서만 사용할 수 있습니다.
원시 ECDH 키링은 사용자가 제공하는 타원 곡선 퍼블릭-프라이빗 키 페어를 사용하여 두 당사자 간에 공유 래핑 키를 도출합니다. 먼저 키링은 발신자의 프라이빗 키, 수신자의 퍼블릭 키 및 ECDH(Elliptic Curve Diffie-Hellman) 키 계약 알고리즘을 사용하여 공유 보안 암호를 도출합니다. 그런 다음 키링은 공유 보안 암호를 사용하여 데이터 암호화 키를 보호하는 공유 래핑 키를 도출합니다. AWS Database Encryption SDK가 공유 래핑 키를 추출하기 위해 (KDF_CTR_HMAC_SHA384
)를 사용하는 키 도출 함수는 키 도출에 대한 NIST 권장 사항을 준수합니다.
키 파생 함수는 64바이트의 키 지정 구성 요소를 반환합니다. 양 당사자가 올바른 키 구성 요소를 사용하도록 AWS Database Encryption SDK는 처음 32바이트를 커밋 키로 사용하고 마지막 32바이트를 공유 래핑 키로 사용합니다. 복호화 시 키링이 암호화된 레코드의 재료 설명 필드에 저장된 동일한 커밋 키와 공유 래핑 키를 재현할 수 없는 경우 작업이 실패합니다. 예를 들어 Alice의 프라이빗 키와 Bob의 퍼블릭 키로 구성된 키링으로 레코드를 암호화하는 경우 Bob의 프라이빗 키와 Alice의 퍼블릭 키로 구성된 키링은 동일한 커밋 키와 공유 래핑 키를 재현하고 레코드를 해독할 수 있습니다. Bob의 퍼블릭 키가 페어에서 가져온 AWS KMS key 경우 Bob은 AWS KMS ECDH 키링을 생성하여 레코드를 복호화할 수 있습니다.
원시 ECDH 키링은 AES-GCM을 사용하여 대칭 키로 레코드를 암호화합니다. 그런 다음 AES-GCM을 사용하여 파생된 공유 래핑 키로 데이터 키를 암호화합니다. 각 Raw ECDH 키링에는 공유 래핑 키가 하나만 있을 수 있지만, 다중 키링에는 단독으로 또는 다른 키링과 함께 여러 Raw ECDH 키링을 포함할 수 있습니다.
사용자는 프라이빗 키를 생성, 저장 및 보호할 책임이 있으며, 가급적이면 하드웨어 보안 모듈(HSM) 또는 키 관리 시스템에서 보호해야 합니다. 발신자와 수신자의 키 페어는 동일한 타원 곡선에 많이 있습니다. AWS Database Encryption SDK는 다음과 같은 타원 큐브 사양을 지원합니다.
ECC_NIST_P256
ECC_NIST_P384
ECC_NIST_P512
원시 ECDH 키링 생성
원시 ECDH 키링은 RawPrivateKeyToStaticPublicKey
, 및 EphemeralPrivateKeyToStaticPublicKey
의 세 가지 키 계약 스키마를 지원합니다PublicKeyDiscovery
. 선택하는 키 계약 스키마에 따라 수행할 수 있는 암호화 작업과 키 지정 자료가 조합되는 방법이 결정됩니다.
RawPrivateKeyToStaticPublicKey
RawPrivateKeyToStaticPublicKey
키 계약 스키마를 사용하여 키링에서 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 정적으로 구성합니다. 이 키 계약 스키마는 레코드를 암호화하고 해독할 수 있습니다.
RawPrivateKeyToStaticPublicKey
키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공합니다.
-
발신자의 프라이빗 키
RFC 5958에 정의된 대로 발신자의 PEM 인코딩 프라이빗 키(PKCS #8 PrivateKeyInfo 구조)를 제공해야 합니다.
-
수신자의 퍼블릭 키
RFC 5280에 정의된 대로 SubjectPublicKeyInfo
(SPKI)라고도 하는 수신자의 DER 인코딩 X.509 퍼블릭 키를 제공해야 합니다. https://tools.ietf.org/html/rfc5280
비대칭 키 계약 KMS 키 페어의 퍼블릭 키 또는 외부에서 생성된 키 페어의 퍼블릭 키를 지정할 수 있습니다 AWS.
-
곡선 사양
지정된 키 페어에서 타원 곡선 사양을 식별합니다. 발신자와 수신자의 키 페어 모두 곡선 사양이 동일해야 합니다.
유효한 값: ECC_NIST_P256
, ECC_NIS_P384
, ECC_NIST_P512
- C# / .NET
-
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
var BobPrivateKey = new MemoryStream(new byte[] { });
var AlicePublicKey = new MemoryStream(new byte[] { });
// Create the Raw ECDH static keyring
var staticConfiguration = new RawEcdhStaticConfigurations()
{
RawPrivateKeyToStaticPublicKey = new RawPrivateKeyToStaticPublicKeyInput
{
SenderStaticPrivateKey = BobPrivateKey,
RecipientPublicKey = AlicePublicKey
}
};
var createKeyringInput = new CreateRawEcdhKeyringInput()
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256
,
KeyAgreementScheme = staticConfiguration
};
var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
- Java
-
다음 Java 예제에서는 RawPrivateKeyToStaticPublicKey
키 계약 스키마를 사용하여 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 정적으로 구성합니다. 두 키 페어 모두 ECC_NIST_P256
곡선에 있습니다.
private static void StaticRawKeyring() {
// Instantiate material providers
final MaterialProviders materialProviders =
MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
KeyPair senderKeys = GetRawEccKey();
KeyPair recipient = GetRawEccKey();
// Create the Raw ECDH static keyring
final CreateRawEcdhKeyringInput rawKeyringInput =
CreateRawEcdhKeyringInput.builder()
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
RawEcdhStaticConfigurations.builder()
.RawPrivateKeyToStaticPublicKey(
RawPrivateKeyToStaticPublicKeyInput.builder()
// Must be a PEM-encoded private key
.senderStaticPrivateKey(ByteBuffer.wrap(senderKeys.getPrivate().getEncoded()))
// Must be a DER-encoded X.509 public key
.recipientPublicKey(ByteBuffer.wrap(recipient.getPublic().getEncoded()))
.build()
)
.build()
).build();
final IKeyring staticKeyring = materialProviders.CreateRawEcdhKeyring(rawKeyringInput);
}
- Rust
-
다음 Python 예제에서는 raw_ecdh_static_configuration
키 계약 스키마를 사용하여 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 정적으로 구성합니다. 두 키 페어 모두 동일한 곡선에 있어야 합니다.
// Create keyring input
let raw_ecdh_static_configuration_input =
RawPrivateKeyToStaticPublicKeyInput::builder()
// Must be a UTF8 PEM-encoded private key
.sender_static_private_key(private_key_sender_utf8_bytes)
// Must be a UTF8 DER-encoded X.509 public key
.recipient_public_key(public_key_recipient_utf8_bytes)
.build()?;
let raw_ecdh_static_configuration = RawEcdhStaticConfigurations::RawPrivateKeyToStaticPublicKey(raw_ecdh_static_configuration_input);
// Instantiate the material providers library
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;
// Create raw ECDH static keyring
let raw_ecdh_keyring = mpl
.create_raw_ecdh_keyring()
.curve_spec(ecdh_curve_spec)
.key_agreement_scheme(raw_ecdh_static_configuration)
.send()
.await?;
EphemeralPrivateKeyToStaticPublicKey
EphemeralPrivateKeyToStaticPublicKey
키 계약 스키마로 구성된 키링은 로컬에서 새 키 페어를 생성하고 각 암호화 호출에 대해 고유한 공유 래핑 키를 도출합니다.
이 키 계약 스키마는 레코드만 암호화할 수 있습니다. EphemeralPrivateKeyToStaticPublicKey
키 계약 스키마로 암호화된 레코드를 복호화하려면 동일한 수신자의 퍼블릭 키로 구성된 검색 키 계약 스키마를 사용해야 합니다. 복호화하려면 PublicKeyDiscovery 키 계약 알고리즘과 함께 Raw ECDH 키링을 사용하거나, 수신자의 퍼블릭 키가 비대칭 키 계약 KMS 키 페어에서 가져온 경우 KmsPublicKeyDiscovery 키 계약 스키마와 함께 AWS KMS ECDH 키링을 사용할 수 있습니다.
EphemeralPrivateKeyToStaticPublicKey
키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공합니다.
-
수신자의 퍼블릭 키
RFC 5280에 정의된 대로 SubjectPublicKeyInfo
(SPKI)라고도 하는 수신자의 DER 인코딩 X.509 퍼블릭 키를 제공해야 합니다. https://tools.ietf.org/html/rfc5280
비대칭 키 계약 KMS 키 페어의 퍼블릭 키 또는 외부에서 생성된 키 페어의 퍼블릭 키를 지정할 수 있습니다 AWS.
-
곡선 사양
지정된 퍼블릭 키에서 타원 곡선 사양을 식별합니다.
암호화 시 키링은 지정된 곡선에 새 키 페어를 생성하고 새 프라이빗 키와 지정된 퍼블릭 키를 사용하여 공유 래핑 키를 도출합니다.
유효한 값: ECC_NIST_P256
, ECC_NIS_P384
, ECC_NIST_P512
- C# / .NET
-
다음 예제에서는 EphemeralPrivateKeyToStaticPublicKey
키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 암호화 시 키링은 지정된 ECC_NIST_P256
곡선에 로컬로 새 키 페어를 생성합니다.
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
var AlicePublicKey = new MemoryStream(new byte[] { });
// Create the Raw ECDH ephemeral keyring
var ephemeralConfiguration = new RawEcdhStaticConfigurations()
{
EphemeralPrivateKeyToStaticPublicKey = new EphemeralPrivateKeyToStaticPublicKeyInput
{
RecipientPublicKey = AlicePublicKey
}
};
var createKeyringInput = new CreateRawEcdhKeyringInput()
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256
,
KeyAgreementScheme = ephemeralConfiguration
};
var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
- Java
-
다음 예제에서는 EphemeralPrivateKeyToStaticPublicKey
키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 암호화 시 키링은 지정된 ECC_NIST_P256
곡선에 로컬로 새 키 페어를 생성합니다.
private static void EphemeralRawEcdhKeyring() {
// Instantiate material providers
final MaterialProviders materialProviders =
MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
ByteBuffer recipientPublicKey = getPublicKeyBytes();
// Create the Raw ECDH ephemeral keyring
final CreateRawEcdhKeyringInput ephemeralInput =
CreateRawEcdhKeyringInput.builder()
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
RawEcdhStaticConfigurations.builder()
.EphemeralPrivateKeyToStaticPublicKey(
EphemeralPrivateKeyToStaticPublicKeyInput.builder()
.recipientPublicKey(recipientPublicKey)
.build()
)
.build()
).build();
final IKeyring ephemeralKeyring = materialProviders.CreateRawEcdhKeyring(ephemeralInput);
}
- Rust
-
다음 예제에서는 ephemeral_raw_ecdh_static_configuration
키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 암호화 시 키링은 지정된 곡선에 로컬로 새 키 페어를 생성합니다.
// Create EphemeralPrivateKeyToStaticPublicKeyInput
let ephemeral_raw_ecdh_static_configuration_input =
EphemeralPrivateKeyToStaticPublicKeyInput::builder()
// Must be a UTF8 DER-encoded X.509 public key
.recipient_public_key(public_key_recipient_utf8_bytes)
.build()?;
let ephemeral_raw_ecdh_static_configuration =
RawEcdhStaticConfigurations::EphemeralPrivateKeyToStaticPublicKey(ephemeral_raw_ecdh_static_configuration_input);
// Instantiate the material providers library
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;
// Create raw ECDH ephemeral private key keyring
let ephemeral_raw_ecdh_keyring = mpl
.create_raw_ecdh_keyring()
.curve_spec(ecdh_curve_spec)
.key_agreement_scheme(ephemeral_raw_ecdh_static_configuration)
.send()
.await?;
PublicKeyDiscovery
복호화할 때 AWS Database Encryption SDK가 사용할 수 있는 래핑 키를 지정하는 것이 가장 좋습니다. 이 모범 사례를 따르려면 발신자의 프라이빗 키와 수신자의 퍼블릭 키를 모두 지정하는 ECDH 키링을 사용합니다. 그러나 Raw ECDH 검색 키링, 즉 지정된 키의 퍼블릭 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 퍼블릭 키와 일치하는 모든 레코드를 복호화할 수 있는 Raw ECDH 키링을 생성할 수도 있습니다. 이 키 계약 스키마는 레코드만 복호화할 수 있습니다.
PublicKeyDiscovery
키 계약 스키마를 사용하여 레코드를 복호화할 때 누가 소유하든 모든 퍼블릭 키를 수락합니다.
PublicKeyDiscovery
키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공합니다.
-
수신자의 정적 프라이빗 키
RFC 5958에 정의된 대로 수신자의 PEM 인코딩 프라이빗 키(PKCS #8 PrivateKeyInfo 구조)를 제공해야 합니다.
-
곡선 사양
지정된 프라이빗 키에서 타원 곡선 사양을 식별합니다. 발신자와 수신자의 키 페어 모두 곡선 사양이 동일해야 합니다.
유효한 값: ECC_NIST_P256
, ECC_NIS_P384
, ECC_NIST_P512
- C# / .NET
-
다음 예제에서는 PublicKeyDiscovery
키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 이 키링은 지정된 프라이빗 키의 퍼블릭 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 퍼블릭 키와 일치하는 모든 레코드를 복호화할 수 있습니다.
// Instantiate material providers
var materialProviders = new MaterialProviders(new MaterialProvidersConfig());
var AlicePrivateKey = new MemoryStream(new byte[] { });
// Create the Raw ECDH discovery keyring
var discoveryConfiguration = new RawEcdhStaticConfigurations()
{
PublicKeyDiscovery = new PublicKeyDiscoveryInput
{
RecipientStaticPrivateKey = AlicePrivateKey
}
};
var createKeyringInput = new CreateRawEcdhKeyringInput()
{
CurveSpec = ECDHCurveSpec.ECC_NIST_P256,
KeyAgreementScheme = discoveryConfiguration
};
var keyring = materialProviders.CreateRawEcdhKeyring(createKeyringInput);
- Java
-
다음 예제에서는 PublicKeyDiscovery
키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 이 키링은 지정된 프라이빗 키의 퍼블릭 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 퍼블릭 키와 일치하는 모든 레코드를 복호화할 수 있습니다.
private static void RawEcdhDiscovery() {
// Instantiate material providers
final MaterialProviders materialProviders =
MaterialProviders.builder()
.MaterialProvidersConfig(MaterialProvidersConfig.builder().build())
.build();
KeyPair recipient = GetRawEccKey();
// Create the Raw ECDH discovery keyring
final CreateRawEcdhKeyringInput rawKeyringInput =
CreateRawEcdhKeyringInput.builder()
.curveSpec(ECDHCurveSpec.ECC_NIST_P256
)
.KeyAgreementScheme(
RawEcdhStaticConfigurations.builder()
.PublicKeyDiscovery(
PublicKeyDiscoveryInput.builder()
// Must be a PEM-encoded private key
.recipientStaticPrivateKey(ByteBuffer.wrap(sender.getPrivate().getEncoded()))
.build()
)
.build()
).build();
final IKeyring publicKeyDiscovery = materialProviders.CreateRawEcdhKeyring(rawKeyringInput);
}
- Rust
-
다음 예제에서는 discovery_raw_ecdh_static_configuration
키 계약 스키마를 사용하여 Raw ECDH 키링을 생성합니다. 이 키링은 지정된 프라이빗 키의 퍼블릭 키가 메시지 암호 텍스트에 저장된 수신자의 퍼블릭 키와 일치하는 모든 메시지를 복호화할 수 있습니다.
// Create PublicKeyDiscoveryInput
let discovery_raw_ecdh_static_configuration_input =
PublicKeyDiscoveryInput::builder()
// Must be a UTF8 PEM-encoded private key
.recipient_static_private_key(private_key_recipient_utf8_bytes)
.build()?;
let discovery_raw_ecdh_static_configuration =
RawEcdhStaticConfigurations::PublicKeyDiscovery(discovery_raw_ecdh_static_configuration_input);
// Create raw ECDH discovery private key keyring
let discovery_raw_ecdh_keyring = mpl
.create_raw_ecdh_keyring()
.curve_spec(ecdh_curve_spec)
.key_agreement_scheme(discovery_raw_ecdh_static_configuration)
.send()
.await?;