DynamoDB용 Java 클라이언트측 암호화 라이브러리 사용 - AWS 데이터베이스 암호화 SDK

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

DynamoDB용 Java 클라이언트측 암호화 라이브러리 사용

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

이 주제에서는 DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.x의 일부 기능과 헬퍼 클래스에 대해 설명합니다.

DynamoDB용 Java 클라이언트 측 암호화 라이브러리를 사용한 프로그래밍에 대한 자세한 내용은 Java 예제, -dynamodb 리포지토리의 Java 예제를 참조하십시오. aws-database-encryption-sdk GitHub

항목 암호화 도구

SDKDynamoDB용 AWS 데이터베이스 암호화의 핵심은 항목 암호화기입니다. DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.x 를 사용하여 다음과 같은 방법으로 DynamoDB 테이블 항목을 암호화, 서명, 확인 및 복호화할 수 있습니다.

DynamoDB Enhanced Client

DynamoDbEncryptionInterceptor를 사용하여 DynamoDB PutItem 요청에 따라 클라이언트측에서 항목을 자동으로 암호화하고 서명하도록 DynamoDB Enhanced Client를 구성할 수 있습니다. DynamoDB Enhanced Client에서는 주석이 달린 데이터 클래스를 사용하여 속성 작업을 정의할 수 있습니다. 가능하면 DynamoDB Enhanced Client를 사용하는 것이 좋습니다.

DynamoDB Enhanced Client는 검색 가능한 암호화를 지원하지 않습니다.

하위 수준 DynamoDB API

를 사용하여 APIDynamoDB 요청에 따라 클라이언트 측에서 항목을 자동으로 암호화하고 서명하도록 하위 수준 DynamoDB를 구성할 수 있습니다. DynamoDbEncryptionInterceptor PutItem

검색 가능한 암호화를 사용하려면 하위 수준 API DynamoDB를 사용해야 합니다.

하위 수준 DynamoDbItemEncryptor

하위 수준 DynamoDbItemEncryptor에서는 DynamoDB를 호출하지 않고도 테이블 항목을 직접 암호화하고 서명 또는 복호화하고 확인합니다. DynamoDB PutItem 또는 GetItem 요청을 하지 않습니다. 예를 들어 하위 수준 DynamoDbItemEncryptor을 사용하여 이미 검색한 DynamoDB 항목을 직접 복호화하고 확인할 수 있습니다.

하위 수준 DynamoDbItemEncryptor검색 가능한 암호화를 지원하지 않습니다.

SDKDynamoDB용 AWS 데이터베이스 암호화의 속성 작업

속성 작업은 어떤 속성 값이 암호화되고 서명되는지, 어떤 속성 값이 서명만 되는지, 어떤 속성 값이 서명되고 암호화 컨텍스트에 포함되는지, 어떤 속성 값이 무시되는지를 결정합니다.

참고

SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT암호화 작업을 사용하려면 AWS 데이터베이스 암호화 SDK 버전 3.3 이상을 사용해야 합니다. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT포함하도록 데이터 모델을 업데이트하기 전에 모든 독자에게 새 버전을 배포하십시오.

하위 수준 API DynamoDB 또는 DynamoDbItemEncryptor 하위 수준을 사용하는 경우 속성 작업을 수동으로 정의해야 합니다. DynamoDB Enhanced Client를 사용하는 경우 속성 작업을 수동으로 정의하거나 주석이 달린 데이터 클래스를 사용하여 TableSchema을 생성할 수 있습니다. 구성 프로세스를 단순화하려면 주석이 달린 데이터 클래스를 사용하는 것이 좋습니다. 주석이 달린 데이터 클래스를 사용하는 경우 객체를 한 번만 모델링하면 됩니다.

참고

속성 작업을 정의한 후에는 서명에서 제외할 속성을 정의해야 합니다. 나중에 서명되지 않은 새 속성을 더 쉽게 추가할 수 있도록 서명되지 않은 속성을 식별할 고유한 접두사(예: ":“)를 선택하는 것이 좋습니다. DynamoDB 스키마와 속성 작업을 정의할 때 DO_NOTHING로 표시된 모든 속성의 속성 이름에 이 접두사를 포함합니다.

주석이 달린 데이터 클래스를 사용하여 DynamoDB Enhanced Client 및 DynamoDbEncryptionInterceptor에서 속성 작업을 지정합니다. SDKDynamoDB용 AWS 데이터베이스 암호화는 속성 유형을 정의하는 표준 DynamoDB 속성 주석을 사용하여 속성 보호 방법을 결정합니다. 기본적으로 기본 키(서명되지만 암호화되지 않음)를 제외하고는 모든 속성이 암호화 및 서명됩니다.

참고

암호화 작업을 사용하려면 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 데이터베이스 암호화 버전 3.3 이상을 사용해야 합니다. AWS SDK SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT포함하도록 데이터 모델을 업데이트하기 전에 모든 독자에게 새 버전을 배포하십시오.

DynamoDB 향상된 클라이언트 주석에 GitHub 대한 자세한 지침은 aws-database-encryption-sdk -dynamodb SimpleClass리포지토리의.java를 참조하십시오.

기본적으로 프라이머리 키 속성은 서명되지만 암호화되지는 않으며(SIGN_ONLY) 다른 모든 속성은 암호화되고 서명됩니다(ENCRYPT_AND_SIGN). 속성을 로 정의하는 경우 파티션 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 및 정렬 속성도 다음과 같아야 합니다. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 예외를 지정하려면 DynamoDB용 Java 클라이언트측 암호화 라이브러리에 정의된 암호화 주석을 사용합니다. 예를 들어, 특정 속성에 서명만 적용하려면 @DynamoDbEncryptionSignOnly 주석을 사용합니다. 특정 속성을 서명하여 암호화 컨텍스트에 포함시키려면 를 사용하십시오@DynamoDbEncryptionSignAndIncludeInEncryptionContext. 특정 속성에 서명되거나 암호화되지 않도록 하려면(DO_NOTHING) @DynamoDbEncryptionDoNothing 주석을 사용합니다.

참고

AWS 데이터베이스 암호화는 중첩된 속성에 대한 주석을 SDK 지원하지 않습니다.

다음 예제는 작업을 정의하고 ENCRYPT_AND_SIGN SIGN_ONLYDO_NOTHING, 속성을 지정하는 데 사용되는 주석을 보여줍니다. 정의하는 데 사용된 주석을 보여주는 예제는 4.java SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 를 참조하십시오SimpleClass.

@DynamoDbBean public class SimpleClass { private String partitionKey; private int sortKey; private String attribute1; private String attribute2; private String attribute3; @DynamoDbPartitionKey @DynamoDbAttribute(value = "partition_key") public String getPartitionKey() { return this.partitionKey; } public void setPartitionKey(String partitionKey) { this.partitionKey = partitionKey; } @DynamoDbSortKey @DynamoDbAttribute(value = "sort_key") public int getSortKey() { return this.sortKey; } public void setSortKey(int sortKey) { this.sortKey = sortKey; } public String getAttribute1() { return this.attribute1; } public void setAttribute1(String attribute1) { this.attribute1 = attribute1; } @DynamoDbEncryptionSignOnly public String getAttribute2() { return this.attribute2; } public void setAttribute2(String attribute2) { this.attribute2 = attribute2; } @DynamoDbEncryptionDoNothing public String getAttribute3() { return this.attribute3; } @DynamoDbAttribute(value = ":attribute3") public void setAttribute3(String attribute3) { this.attribute3 = attribute3; } }

주석이 달린 데이터 클래스를 사용하여 다음 코드 조각에 표시된 것처럼 TableSchema을 생성합니다.

final TableSchema<SimpleClass> tableSchema = TableSchema.fromBean(SimpleClass.class);

속성 작업을 수동으로 지정하려면 이름-값 페어가 속성 이름과 지정된 작업을 나타내는 Map 객체를 만듭니다.

속성을 암호화하고 서명하도록 ENCRYPT_AND_SIGN을 지정합니다. 속성을 서명하되 암호화하지 않도록 SIGN_ONLY을 지정합니다. 속성에 서명하고 이를 암호화 컨텍스트에 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 포함하도록 지정합니다. 서명하지 않으면 속성을 암호화할 수 없습니다. 속성을 무시하도록 DO_NOTHING을 지정합니다.

파티션 및 정렬 속성은 SIGN_ONLY 또는 여야 합니다SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT. 속성을 로 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 정의하는 경우 파티션 및 정렬 속성도 다음과 같아야 합니다SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT.

참고

SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT암호화 작업을 사용하려면 AWS 데이터베이스 암호화 SDK 버전 3.3 이상을 사용해야 합니다. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT포함하도록 데이터 모델을 업데이트하기 전에 모든 독자에게 새 버전을 배포하십시오.

final Map<String, CryptoAction> attributeActionsOnEncrypt = new HashMap<>(); // The partition attribute must be signed attributeActionsOnEncrypt.put("partition_key", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); // The sort attribute must be signed attributeActionsOnEncrypt.put("sort_key", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); attributeActionsOnEncrypt.put("attribute1", CryptoAction.ENCRYPT_AND_SIGN); attributeActionsOnEncrypt.put("attribute2", CryptoAction.SIGN_ONLY); attributeActionsOnEncrypt.put("attribute3", CryptoAction.SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT); attributeActionsOnEncrypt.put(":attribute4", CryptoAction.DO_NOTHING);

SDKDynamoDB용 AWS 데이터베이스 암호화의 암호화 구성

AWS 데이터베이스 암호화를 SDK 사용하는 경우 DynamoDB 테이블의 암호화 구성을 명시적으로 정의해야 합니다. 암호화 구성에 필요한 값은 속성 작업을 수동으로 정의했는지 아니면 주석이 달린 데이터 클래스를 사용하여 정의했는지에 따라 달라집니다.

다음 스니펫은 DynamoDB Enhanced Client TableSchema를 사용하는 DynamoDB 테이블 암호화 구성을 정의하고 고유한 접두사로 정의된 서명되지 않은 속성을 허용합니다.

final Map<String, DynamoDbEnhancedTableEncryptionConfig> tableConfigs = new HashMap<>(); tableConfigs.put(ddbTableName, DynamoDbEnhancedTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .schemaOnEncrypt(tableSchema) // Optional: only required if you use beacons .search(SearchConfig.builder() .writeVersion(1) // MUST be 1 .versions(beaconVersions) .build()) .build());
논리적 테이블 이름

DynamoDB 테이블의 논리적 테이블 이름.

논리적 테이블 이름은 테이블에 저장된 모든 데이터에 암호로 바인딩되어 DynamoDB 복원 작업을 간소화합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 항상 같은 논리적 테이블 이름을 지정해야 합니다. 복호화이 성공하려면 논리적 테이블 이름이 암호화에 지정된 이름과 일치해야 합니다. 백업에서 DynamoDB 테이블을 복원한 후 DynamoDB 테이블 이름이 변경되더라도 논리적 테이블 이름을 사용하면 복호화 작업에서 테이블을 계속 인식할 수 있습니다.

허용된 서명되지 않은 속성

속성 작업에 DO_NOTHING로 표시된 속성.

허용된 무서명 서명에서 제외되는 속성을 클라이언트에게 알려줍니다. 클라이언트는 다른 모든 속성이 서명에 포함되어 있다고 가정합니다. 그런 다음 레코드를 복호화할 때 클라이언트는 확인해야 할 속성과 지정한 허용된 무서명 속성 중에서 무시할 속성을 결정합니다. 허용된 무서명 속성에서는 속성을 제거할 수 없습니다.

모든 DO_NOTHING 속성을 나열하는 배열을 만들어 무서명 허용 속성을 명시적으로 정의할 수 있습니다. DO_NOTHING 속성의 이름을 지정할 때 고유한 접두사를 지정하고 이 접두사를 사용하여 무서명 속성을 클라이언트에게 알릴 수도 있습니다. 고유한 접두사를 지정하는 것이 좋습니다. 이렇게 하면 나중에 새 DO_NOTHING 속성을 추가하는 프로세스가 단순해지기 때문입니다. 자세한 내용은 데이터 모델 업데이트 단원을 참조하십시오.

모든 DO_NOTHING 속성에 접두사를 지정하지 않는 경우 클라이언트가 복호화 시 서명되지 않을 것으로 예상되는 모든 속성을 명시적으로 나열하는 allowedUnsignedAttributes 배열을 구성할 수 있습니다. 반드시 필요한 경우에만 허용된 서명되지 않은 속성을 명시적으로 정의해야 합니다.

검색 구성 (선택 사항)

SearchConfig비컨 버전을 정의합니다.

검색 가능한 암호화 또는 서명된 비컨을 사용하려면 SearchConfig를 지정해야 합니다.

알고리즘 스위트 (선택 사항)

AWS 데이터베이스 암호화가 SDK 사용하는 알고리즘 제품군을 algorithmSuiteId 정의합니다.

대체 알고리즘 세트를 명시적으로 지정하지 않는 한 AWS 데이터베이스 암호화는 기본 알고리즘 제품군을 SDK 사용합니다. 기본 알고리즘 모음은 키 도출, 디지털 서명 및 키 약속과 함께 AES - GCM 알고리즘을 사용합니다. 기본 알고리즘 제품군이 대부분의 애플리케이션에 적합할 가능성이 높지만 대체 알고리즘 제품군을 선택할 수도 있습니다. 예를 들어, 일부 신뢰 모델은 디지털 서명이 없는 알고리즘 제품군으로 충분할 수 있습니다. AWS 데이터베이스 암호화가 SDK 지원하는 알고리즘 제품군에 대한 자세한 내용은 을 참조하십시오. AWS 데이터베이스 암호화에서 지원되는 알고리즘 스위트 SDK

ECDSA디지털 서명이 없는 AES - GCM 알고리즘 제품군을 선택하려면 테이블 암호화 구성에 다음 스니펫을 포함하십시오.

.algorithmSuiteId( DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384)

데이터베이스 암호화로 항목 업데이트 AWS SDK

AWS 데이터베이스 암호화는 암호화되거나 서명된 항목에 UpdateItem 대해 ddb:를 SDK 지원하지 않습니다. 암호화되거나 서명된 항목을 업데이트하려면 ddb:를 사용해야 합니다. PutItem PutItem 요청에 기존 항목과 동일한 프라이머리 키를 지정하면 새 항목이 기존 항목을 완전히 대체합니다. 항목을 업데이트한 후 저장 시 모든 속성을 지우고 바꾸는 CLOBBER데 사용할 수도 있습니다.

서명된 집합 암호 해독

AWS 데이터베이스 암호화 SDK 버전 3.0.0 및 3.1.0에서는 집합 유형 속성을 로 SIGN_ONLY 정의하면 해당 집합의 값이 제공된 순서대로 정규화됩니다. DynamoDB는 집합의 순서를 보존하지 않습니다. 따라서 집합을 포함하는 항목의 서명 검증이 실패할 수 있습니다. 집합의 값이 AWS 데이터베이스 암호화에 SDK 제공된 순서와 다른 순서로 반환되면 집합 속성에 동일한 값이 포함되어 있더라도 서명 검증이 실패합니다.

참고

AWS 데이터베이스 암호화 버전 3.1.1 이상에서는 모든 세트 유형 속성의 값을 SDK 정규화하여 DynamoDB에 기록된 순서와 동일한 순서로 값을 읽습니다.

서명 검증이 실패하는 경우 암호 해독 작업이 실패하고 다음 오류 메시지가 반환됩니다.

소프트웨어.amazon.cryptography.dbencryptionsdk.structuredencryption.model. StructuredEncryptionException: 일치하는 수신자 태그가 없습니다.

위의 오류 메시지가 표시되고 해독하려는 항목에 버전 3.0.0 또는 3.1.0을 사용하여 서명된 세트가 포함되어 있다고 생각되면 세트를 성공적으로 검증하는 방법에 GitHub 대한 자세한 내용은 aws-database-encryption-sdk -dynamodb-java 저장소의 DecryptWithPermute디렉터리를 참조하십시오.