로우 ECDH 키링 - AWS 데이터베이스 암호화 SDK

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

로우 ECDH 키링

클라이언트 측 암호화 라이브러리는 데이터베이스 암호화 SDK로 이름이 변경되었습니다. AWS 이 개발자 안내서는 여전히 DynamoDB Encryption Client에 대한 정보를 제공합니다.
중요

Raw ECDH 키링은 머티리얼 프로바이더 라이브러리 버전 1.5.0에서만 사용할 수 있습니다.

Raw ECDH 키링은 사용자가 제공한 타원 곡선 공개-개인 키 쌍을 사용하여 양 당사자 간의 공유 래핑 키를 도출합니다. 먼저, 키링은 발신자의 개인 키, 수신자의 공개 키, 타원 곡선 Diffie-Hellman (ECDH) 키 계약 알고리즘을 사용하여 공유 암호를 도출합니다. 그런 다음 키링은 공유 암호를 사용하여 데이터 암호화 키를 보호하는 공유 래핑 키를 추출합니다. 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은 ECDH 키링을 만들어 레코드를 해독할 수 있습니다.AWS KMS

원시 ECDH 키링은 AES-GCM을 사용하여 대칭 키로 레코드를 암호화합니다. 그런 다음 AES-GCM을 사용하여 파생된 공유 래핑 키로 데이터 키를 엔벨로프 암호화합니다. 각 Raw ECDH 키링에는 공유 래핑 키가 하나만 있을 수 있지만 여러 개의 Raw ECDH 키링을 단독으로 또는 다른 키링과 함께 다중 키링에 포함할 수 있습니다.

개인 키를 생성, 저장 및 보호하는 것은 사용자의 책임이며, 가급적이면 하드웨어 보안 모듈 (HSM) 또는 키 관리 시스템에서 개인 키를 생성, 저장 및 보호할 책임이 있습니다. 발신자와 수신자의 키 쌍은 같은 타원 곡선에 있어야 합니다. AWS 데이터베이스 암호화 SDK는 다음과 같은 타원 곡선 사양을 지원합니다.

  • ECC_NIST_P256

  • ECC_NIST_P384

  • ECC_NIST_P512

원시 ECDH 키링 생성

원시 ECDH 키링은 세 가지 주요 계약 스키마 (, 및) 를 지원합니다. RawPrivateKeyToStaticPublicKey EphemeralPrivateKeyToStaticPublicKey PublicKeyDiscovery 선택한 키 계약 스키마에 따라 수행할 수 있는 암호화 작업과 키 자료의 조합 방식이 결정됩니다.

RawPrivateKeyToStaticPublicKey

RawPrivateKeyToStaticPublicKey키 계약 스키마를 사용하여 키링에서 발신자의 개인 키와 수신자의 공개 키를 정적으로 구성할 수 있습니다. 이 키 계약 스키마는 레코드를 암호화하고 해독할 수 있습니다.

RawPrivateKeyToStaticPublicKey키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공하십시오.

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

EphemeralPrivateKeyToStaticPublicKey

EphemeralPrivateKeyToStaticPublicKey키 계약 스키마로 구성된 키링은 로컬에서 새 키 쌍을 생성하고 각 암호화 호출에 대해 고유한 공유 래핑 키를 생성합니다.

이 키 계약 스키마는 레코드만 암호화할 수 있습니다. EphemeralPrivateKeyToStaticPublicKey키 계약 스키마로 암호화된 레코드를 해독하려면 동일한 수신자의 공개 키로 구성된 검색 키 계약 스키마를 사용해야 합니다. 암호를 해독하려면 키 계약 알고리즘과 함께 Raw ECDH 키링을 사용하거나, 수신자의 공개 키가 비대칭 PublicKeyDiscovery키 계약 KMS 키 쌍에서 가져온 경우 키 계약 스키마와 함께 ECDH 키링을 사용할 AWS KMS 수 있습니다. KmsPublicKeyDiscovery

키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공하십시오. EphemeralPrivateKeyToStaticPublicKey

Java

다음 예시에서는 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. EphemeralPrivateKeyToStaticPublicKey 암호화 시 키링은 지정된 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); }

PublicKeyDiscovery

복호화할 때는 AWS 데이터베이스 암호화 SDK에서 사용할 수 있는 래핑 키를 지정하는 것이 좋습니다. 이 권장사항을 따르려면 보낸 사람의 개인 키와 받는 사람의 공개 키를 모두 지정하는 ECDH 키링을 사용하십시오. 하지만 원시 ECDH 검색 키링을 만들 수도 있습니다. 즉, 지정된 키의 공개 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 공개 키와 일치하는 경우 모든 레코드를 해독할 수 있는 원시 ECDH 키링을 만들 수도 있습니다. 이 키 계약 스키마는 레코드만 해독할 수 있습니다.

중요

PublicKeyDiscovery키 계약 스키마를 사용하여 레코드를 해독하면 소유자에 관계없이 모든 공개 키를 수락합니다.

PublicKeyDiscovery키 계약 스키마를 사용하여 원시 ECDH 키링을 초기화하려면 다음 값을 제공하십시오.

Java

다음 예에서는 키 계약 스키마를 사용하여 원시 ECDH 키링을 생성합니다. PublicKeyDiscovery 이 키링은 지정된 개인 키의 공개 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 공개 키와 일치하는 모든 레코드를 해독할 수 있습니다.

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