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

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

AWS KMS ECDH 키링

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

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

AWS KMS ECDH키링은 비대칭 키 계약을 AWS KMS keys사용하여 양 당사자 간에 공유된 대칭 래핑 키를 도출합니다. 먼저 키링은 Elliptic Curve Diffie-Hellman (ECDH) 키 계약 알고리즘을 사용하여 발신자 키 쌍의 개인 키와 수신자의 공개 키에서 공유 암호를 도출합니다. KMS 그러면 키링은 공유 암호를 사용하여 데이터 암호화 키를 보호하는 공유 래핑 키를 추출합니다. AWS 데이터베이스 암호화에서 공유 래핑 키를 추출하기 위해 (KDF_CTR_HMAC_SHA384) 를 SDK 사용하는 키 파생 함수는 키 파생 권장 사항을 준수합니다. NIST

키 파생 함수는 64바이트의 키 자료를 반환합니다. 양 당사자가 올바른 키 자료를 사용할 수 있도록 AWS 데이터베이스 SDK 암호화에서는 처음 32바이트를 약정 키로 사용하고 마지막 32바이트를 공유 래핑 키로 사용합니다. 암호 해독 시 암호화된 레코드의 자료 설명 필드에 저장된 것과 동일한 약정 키 및 공유 래핑 키를 키링으로 복제할 수 없는 경우 작업이 실패합니다. 예를 들어 Alice의 개인 키와 Bob의 공개 키로 구성된 키링으로 레코드를 암호화하는 경우 Bob의 개인 키와 Alice의 공개 키로 구성된 키링은 동일한 커밋 키와 공유 래핑 키를 재생하고 레코드를 해독할 수 있습니다. Bob의 공개 키가 KMS 키 쌍에서 가져온 것이 아닌 경우 Bob은 Raw ECDH 키링을 생성하여 레코드를 해독할 수 있습니다.

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

AWS KMS ECDH 키링에 필요한 권한

AWS 데이터베이스 암호화에는 AWS 계정이 SDK 필요하지 않으며 서비스에 종속되지 않습니다. AWS 하지만 AWS KMS ECDH 키링을 사용하려면 AWS 계정이 있어야 하며 키링에 다음과 같은 최소 권한이 있어야 합니다. AWS KMS keys 사용 권한은 사용하는 키 계약 스키마에 따라 달라집니다.

  • KmsPrivateKeyToStaticPublicKey키 계약 스키마를 사용하여 레코드를 암호화 및 복호화하려면 발신자의 비대칭 키 DeriveSharedSecret 쌍에 GetPublicKeykms:와 kms:가 필요합니다. KMS 키링을 인스턴스화할 때 발신자의 DER 인코딩된 공개 키를 직접 제공하는 경우 발신자의 비대칭 키 쌍에 대한 kms: DeriveSharedSecret 권한만 있으면 됩니다. KMS

  • KmsPublicKeyDiscovery키 계약 스키마를 사용하여 레코드를 복호화하려면 지정된 비대칭 키 쌍에 대한 kms: DeriveSharedSecretkms: GetPublicKey 권한이 필요합니다. KMS

AWS KMS ECDH 키링 생성

데이터를 암호화하고 해독하는 AWS KMS ECDH 키링을 생성하려면 키 계약 스키마를 사용해야 합니다. KmsPrivateKeyToStaticPublicKey KmsPrivateKeyToStaticPublicKey키 계약 스키마를 사용하여 AWS KMS ECDH 키링을 초기화하려면 다음 값을 제공하십시오.

  • 발신자 ID AWS KMS key

    값이 인 비대칭 NIST 권장 타원 곡선 () KMS 키 ECC 쌍을 식별해야 합니다. KeyUsage KEY_AGREEMENT 보낸 사람의 개인 키는 공유 암호를 추출하는 데 사용됩니다.

  • (선택 사항) 발신자의 공개 키

    5280에 DER 정의된 대로 X.509로 인코딩된 공개 키 SubjectPublicKeyInfo (SPKI) 라고도 함) 여야 합니다. RFC

    이 AWS KMS GetPublicKey작업은 비대칭 키 쌍의 공개 KMS 키를 필수 DER -encoded 형식으로 반환합니다.

    AWS KMS 발신자의 공개 키를 직접 제공하면 키링으로 걸려오는 호출 횟수를 줄일 수 있습니다. 발신자의 퍼블릭 키에 값을 제공하지 않으면 키링이 AWS KMS 호출하여 발신자의 퍼블릭 키를 검색합니다.

  • 수신자의 공개 키

    DER5280에 정의된 대로 수신자의 인코딩된 X.509 공개 키 SubjectPublicKeyInfo (SPKI) 라고도 함) 를 제공해야 합니다. RFC

    이 AWS KMS GetPublicKey작업은 비대칭 키 쌍의 공개 KMS 키를 필수 DER -encoded 형식으로 반환합니다.

  • 커브 사양

    지정된 키 페어의 타원 곡선 사양을 식별합니다. 발신자와 수신자의 키 페어 모두 동일한 커브 사양을 가져야 합니다.

    유효한 값: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

  • (선택 사항) 권한 부여 토큰 목록

    권한 부여로 키링의 KMS AWS KMS ECDH 키에 대한 액세스를 제어하는 경우 키링을 초기화할 때 필요한 모든 부여 토큰을 제공해야 합니다.

C# / .NET

다음 예제에서는 보낸 사람의 AWS KMS ECDH 키, 보낸 사람의 공개 KMS 키, 받는 사람의 공개 키를 사용하여 키링을 만듭니다. 이 예제에서는 선택적 senderPublicKey 파라미터를 사용하여 발신자의 공개 키를 제공합니다. 발신자의 공개 키를 제공하지 않으면 키링이 AWS KMS 호출하여 발신자의 공개 키를 검색합니다. 발신자와 수신자의 키 페어가 모두 순조롭게 진행되고 있습니다. ECC_NIST_P256

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Must be DER-encoded X.509 public keys var BobPublicKey = new MemoryStream(new byte[] { }); var AlicePublicKey = new MemoryStream(new byte[] { }); // Create the AWS KMS ECDH static keyring var staticConfiguration = new KmsEcdhStaticConfigurations { KmsPrivateKeyToStaticPublicKey = new KmsPrivateKeyToStaticPublicKeyInput { SenderKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", SenderPublicKey = BobPublicKey, RecipientPublicKey = AlicePublicKey } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = staticConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

다음 예제에서는 발신자 AWS KMS ECDH 키, 발신자 공개 KMS 키, 수신자 공개 키를 사용하여 키링을 생성합니다. 이 예제에서는 선택적 senderPublicKey 파라미터를 사용하여 발신자의 공개 키를 제공합니다. 발신자의 공개 키를 제공하지 않으면 키링이 AWS KMS 호출하여 발신자의 공개 키를 검색합니다. 발신자와 수신자의 키 페어가 모두 순조롭게 진행되고 있습니다. ECC_NIST_P256

// Retrieve public keys // Must be DER-encoded X.509 public keys ByteBuffer BobPublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"); ByteBuffer AlicePublicKey = getPublicKeyBytes("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"); // Create the AWS KMS ECDH static keyring final CreateAwsKmsEcdhKeyringInput senderKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPrivateKeyToStaticPublicKey( KmsPrivateKeyToStaticPublicKeyInput.builder() .senderKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab") .senderPublicKey(BobPublicKey) .recipientPublicKey(AlicePublicKey) .build()).build()).build();

AWS KMS ECDH디스커버리 키링 만들기

복호화할 때는 AWS 데이터베이스 암호화가 사용할 수 있는 키를 지정하는 것이 가장 좋습니다. SDK 이 모범 사례를 따르려면 키 계약 스키마와 함께 AWS KMS ECDH 키링을 사용하십시오. KmsPrivateKeyToStaticPublicKey 그러나 AWS KMS ECDH 검색 키링, 즉 지정된 키 쌍의 KMS 공개 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 공개 키와 일치하는 경우 레코드를 해독할 수 있는 AWS KMS ECDH 키링을 만들 수도 있습니다.

중요

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

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

  • 수신자 ID AWS KMS key

    값이 인 비대칭 NIST 권장 타원 곡선 () KMS 키 ECC 쌍을 식별해야 합니다. KeyUsage KEY_AGREEMENT

  • 커브 사양

    수신자의 키 페어에 KMS 있는 타원 곡선 사양을 식별합니다.

    유효한 값: ECC_NIST_P256, ECC_NIS_P384, ECC_NIST_P512

  • (선택 사항) 권한 부여 토큰 목록

    권한 부여를 통해 키링의 KMS 키에 대한 액세스를 제어하는 경우 AWS KMS ECDH 키링을 초기화할 때 필요한 모든 부여 토큰을 제공해야 합니다.

C# / .NET

다음 예제에서는 ECC_NIST_P256 곡선에 KMS 키 쌍이 있는 AWS KMS ECDH 검색 키링을 만듭니다. 지정된 KMS 키 쌍에 kms: GetPublicKeykms: DeriveSharedSecret 권한이 있어야 합니다. 이 키링은 지정된 키 쌍의 KMS 공개 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 공개 키와 일치하는 모든 레코드를 해독할 수 있습니다.

// Instantiate material providers var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Create the AWS KMS ECDH discovery keyring var discoveryConfiguration = new KmsEcdhStaticConfigurations { KmsPublicKeyDiscovery = new KmsPublicKeyDiscoveryInput { RecipientKmsIdentifier = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" } }; var createKeyringInput = new CreateAwsKmsEcdhKeyringInput { CurveSpec = ECDHCurveSpec.ECC_NIST_P256, KmsClient = new AmazonKeyManagementServiceClient(), KeyAgreementScheme = discoveryConfiguration }; var keyring = materialProviders.CreateAwsKmsEcdhKeyring(createKeyringInput);
Java

다음 예제에서는 ECC_NIST_P256 곡선에 KMS 키 쌍이 있는 AWS KMS ECDH 검색 키링을 만듭니다. 지정된 KMS 키 쌍에 kms: GetPublicKeykms: DeriveSharedSecret 권한이 있어야 합니다. 이 키링은 지정된 키 쌍의 KMS 공개 키가 암호화된 레코드의 자료 설명 필드에 저장된 수신자의 공개 키와 일치하는 모든 레코드를 해독할 수 있습니다.

// Create the AWS KMS ECDH discovery keyring final CreateAwsKmsEcdhKeyringInput recipientKeyringInput = CreateAwsKmsEcdhKeyringInput.builder() .kmsClient(KmsClient.create()) .curveSpec(ECDHCurveSpec.ECC_NIST_P256) .KeyAgreementScheme( KmsEcdhStaticConfigurations.builder() .KmsPublicKeyDiscovery( KmsPublicKeyDiscoveryInput.builder() .recipientKmsIdentifier("arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321").build() ).build()) .build();