사용 방법 DynamoDB Encryption Client 자바용 - Amazon DynamoDB Encryption Client

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

사용 방법 DynamoDB Encryption Client 자바용

이 주제에서는 DynamoDB Encryption Client 다른 프로그래밍 언어 구현에서 찾을 수 없는 Java에서

DynamoDB Encryption Client를 사용한 프로그래밍에 대한 자세한 내용은 Java 예제, GitHub의 aws-dynamodb-encryption-java repository에 들어 있는 예제, DynamoDB Encryption Client용 Javadoc을 참조하십시오.

항목 암호화 도구 속성암호화기 및 DynamoDB암호화기

더 DynamoDB Encryption Client Java의 경우 두 가지 물품 암호기: 하위 레벨 DynamoDB암호화기 및 속성암호화기.

AttributeEncryptor는 DynamoDB Encryption Client의 DynamoDB Encryptor와 함께 AWS SDK for Java의 DynamoDBMapper를 사용하는 데 도움이 되는 헬퍼 클래스입니다. DynamoDBMapper와 함께 AttributeEncryptor를 사용하면 사용자가 항목을 저장할 때 항목을 사용자 모르게 암호화하고 서명합니다. 또한 사용자가 항목을 로드할 때 항목을 사용자 모르게 확인하고 해독합니다.

저장 동작 구성

AttributeEncryptorDynamoDBMapper를 사용하여 서명만 있거나 암호화 및 서명된 속성이 있는 테이블 항목을 추가하거나 편집할 수 있습니다. 이러한 작업의 경우 다음 예와 같이 PUT 저장 동작을 사용하도록 구성하는 것이 좋습니다. 그렇지 않으면 데이터를 해독하지 못할 수 있습니다.

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));

테이블 항목의 속성을 업데이트하는 기본 저장 동작을 사용하는 경우 변경된 속성만 서명에 포함됩니다. 이 서명은 해독에서 계산된 전체 항목의 서명과 일치하지 않을 수 있습니다.

CLOBBER 저장 동작을 사용할 수도 있습니다. 이 동작은 낙관적 잠금을 비활성화하고 테이블의 항목을 덮어쓴다는 점을 제외하면 PUT 저장 동작과 동일합니다.

예제에서 사용되는 이 코드를 보려면 DynamoDBMapper 사용 및 GitHub의 aws-dynamodb-encryption-java 리포지토리에 있는 AwsKmsEncryptedObject.java 예제를 참조하십시오.

Java의 속성 작업

속성 작업은 암호화 및 서명되는 속성 값, 서명만 되는 속성 값 및 무시되는 속성 값을 결정합니다. 속성 작업을 지정하는 데 사용하는 메서드는 DynamoDBMapperAttributeEncryptor, 또는 하위 수준 DynamoDBEncryptor 중 어느 것을 사용하는지에 따라 달라집니다.

중요

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

DynamoDBMapperAttributeEncryptor를 사용하는 경우 주석을 사용하여 속성 작업을 지정합니다. DynamoDB Encryption Client에서는 속성 유형을 정의하는 표준 DynamoDB 속성 주석을 사용하여 속성 보호 방법을 결정합니다. 기본적으로 기본 키(서명되지만 암호화되지 않음)를 제외하고는 모든 속성이 암호화 및 서명됩니다.

참고

서명할 수 있고 서명해야 하더라도 @DynamoDBVersionAttribute 주석을 사용하여 속성 값을 암호화하지 마십시오. 그렇지 않으면 해당 값을 사용하는 조건이 의도하지 않은 영향을 미칩니다.

// Attributes are encrypted and signed @DynamoDBAttribute(attributeName="Description") // Partition keys are signed but not encrypted @DynamoDBHashKey(attributeName="Title") // Sort keys are signed but not encrypted @DynamoDBRangeKey(attributeName="Author")

예외를 지정하려면 Java용 DynamoDB Encryption Client에 정의된 암호화 주석을 사용합니다. 클래스 수준에서 이들을 지정하면 클래스 의 기본값이 됩니다.

// Sign only @DoNotEncrypt // Do nothing; not encrypted or signed @DoNotTouch

예를 들어 이러한 주석은 PublicationYear 암호화하거나 서명하지 마십시오. ISBN 특성 값.

// Sign only (override the default) @DoNotEncrypt @DynamoDBAttribute(attributeName="PublicationYear") // Do nothing (override the default) @DoNotTouch @DynamoDBAttribute(attributeName="ISBN")

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 암호화 컨텍스트를 수동으로 결합합니다. 그러나 DynamoDBMapper를 사용하는 경우 AttributeEncryptor는 현재 테이블 이름을 포함하여 DynamoDB 암호화 컨텍스트를 만듭니다. AttributeEncryptor에서 다른 테이블 이름으로 암호화 컨텍스트를 만들도록 지정하려면 EncryptionContextOverrideOperator를 사용합니다.

예를 들어, 다음 코드는 암호화 자료 제공자(CMP)의 인스턴스를 생성하고 DynamoDBEncryptor. 그런 다음 setEncryptionContextOverrideOperator 의 방법 DynamoDBEncryptor. 이 시스템은 overrideEncryptionContextTableName 연산자를 사용하여 하나의 테이블 이름보다 우선합니다. 이렇게 구성되면 AttributeEncryptor 은(는) DynamoDB 암호화 컨텍스트는 newTableName 다음 위치 oldTableName. 전체 예는 다음을 참조하십시오. DynamoDBMapper.java를 사용하여 암호화 컨텍스트 재정의.

final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, cmkArn); final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName( oldTableName, newTableName));

항목을 해독하고 확인하는 DynamoDBMapper의 load 메서드를 호출할 때 원래 테이블 이름을 지정합니다.

mapper.load(itemClass, DynamoDBMapperConfig.builder() .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName)) .build());

여러 테이블 이름을 재정의하는 overrideEncryptionContextTableNameUsingMap 연산자를 사용할 수도 있습니다.

테이블 이름 재정의 연산자는 일반적으로 데이터를 해독하고 서명을 확인할 때 사용됩니다. 그러나 암호화 및 서명 시 DynamoDB 암호화 컨텍스트의 테이블 이름을 다른 값으로 설정하는 데 사용할 수 있습니다.

를 사용하는 경우 테이블 이름 재정의 연산자를 사용하지 마십시오. DynamoDBEncryptor. 대신, 원래 테이블 이름으로 암호화 컨텍스트를 만들어 복호화 방법으로 제출합니다.