View a markdown version of this page

DynamoDB Encryption Client for Java 사용 - AWS 데이터베이스 암호화 SDK

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

DynamoDB Encryption Client for Java 사용

참고

클라이언트측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 다음 주제에서는 Java용 DynamoDB Encryption Client 버전 1.x~2.x 와 Python용 DynamoDB Encryption Client 버전 1.x~3.x에 대한 정보를 제공합니다. 자세한 내용은 AWS Database Encryption SDK for DynamoDB 버전 지원을 참조하세요.

이 주제에서는 다른 프로그래밍 언어 구현에서는 찾을 수 없는 Java의 DynamoDB Encryption Client 기능 중 일부를 설명합니다.

DynamoDB Encryption Client를 사용한 프로그래밍에 대한 자세한 내용은 Java 예제, GitHub에 대한 aws-dynamodb-encryption-java repository예제 및 DynamoDB Encryption Client용 Javadoc를 참조하세요.

항목 암호화 도구: DynamoDBEncryptor

Java의 DynamoDB Encryption Client에는 하위 수준 DynamoDBEncryptor라는 항목 암호화 도구가 하나 있습니다.

Java의 속성 작업

속성 작업은 암호화 및 서명되는 속성 값, 서명만 되는 속성 값 및 무시되는 속성 값을 결정합니다.

중요

속성 작업을 사용하여 테이블 항목을 암호화한 후 데이터 모델에서 속성을 추가하거나 제거하면 서명 검증 오류가 발생하여 데이터를 복호화하지 못할 수 있습니다. 자세한 내용은 데이터 모델 변경 단원을 참조하십시오.

DynamoDBEncryptor를 직접 사용하는 경우 속성 작업을 지정하려면 이름-값 페어가 속성 이름 및 지정한 작업을 표현하는 HashMap 객체를 만듭니다.

속성 작업에 유효한 값은 EncryptionFlags 열거 유형으로 정의되어 있습니다. ENCRYPTSIGN와 함께 사용하거나 SIGN 단독으로 사용하거나 둘 다 생략할 수 있습니다. 하지만 ENCRYPT 단독으로 사용하는 경우 DynamoDB Encryption Client에서 오류가 발생합니다. 서명하지 않은 속성은 암호화할 수 없습니다.

ENCRYPT SIGN
주의

기본 키 속성은 암호화하지 마십시오. 일반 텍스트로 남겨 두어야 DynamoDB에서 전체 테이블 스캔을 실행하지 않고 해당 항목을 찾을 수 있습니다.

암호화 컨텍스트에서 프라이머리 키를 지정하고 나서 프라이머리 키 속성에 대한 속성 작업에서 ENCRYPT를 지정하는 경우 DynamoDB Encryption Client에서 예외가 발생합니다.

예를 들어 다음 Java 코드는 record 항목의 모든 속성을 암호화하고 서명하는 actions HashMap을 만듭니다. 서명되었지만 암호화되지 않은 파티션 키 및 정렬 키 속성 및 서명되거나 암호화되지 않은 test 속성은 예외입니다.

final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN); final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN); final Map<String, Set<EncryptionFlags>> actions = new HashMap<>(); for (final String attributeName : record.keySet()) { switch (attributeName) { case partitionKeyName: // no break; falls through to next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Don't encrypt or sign break; default: // Encrypt and sign everything else actions.put(attributeName, encryptAndSign); break; } }

그런 다음 DynamoDBEncryptorencryptRecord 방법을 호출할 때 맵을 attributeFlags 파라미터의 값으로 지정합니다. 예를 들어, encryptRecord에 대한 이 호출은 actions 맵을 사용합니다.

// Encrypt the plaintext record final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);

테이블 이름 재정의

DynamoDB Encryption Client에서 DynamoDB 테이블의 이름은 암호화 및 복호화 메서드에 전달되는 DynamoDB 암호화 컨텍스트의 요소입니다. 테이블 항목을 암호화하거나 서명할 때 테이블 이름을 포함한 DynamoDB 암호화 컨텍스트는 암호화 텍스트에 암호로 바인딩됩니다. decrypt 방법에 전달된 DynamoDB 암호화 컨텍스트가 encrypt 방법에 전달된 DynamoDB 암호화 컨텍스트와 일치하지 않으면 복호화 작업이 실패합니다.

테이블을 백업하거나 특정 시점으로 복구를 수행할 때와 같이 테이블 이름이 변경되는 경우도 있습니다. 이러한 항목의 서명을 복호화하거나 확인할 때 원래 테이블 이름을 포함하여 항목을 암호화하고 서명하는 데 사용된 것과 동일한 DynamoDB 암호화 컨텍스트를 전달해야 합니다. 현재 테이블 이름은 필요하지 않습니다.

DynamoDBEncryptor를 사용하는 경우 DynamoDB 암호화 컨텍스트를 수동으로 결합합니다. 따라서를 사용하는 경우 테이블 이름 재정의 연산자를 사용하지 마십시오DynamoDBEncryptor. 대신 원래 테이블 이름으로 암호화 컨텍스트를 만들고 복호화 메서드에 제출하십시오.