DynamoDB Encryption Client for Java의 예제 코드 - AWS 데이터베이스 암호화 SDK

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

DynamoDB Encryption Client for Java의 예제 코드

참고

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

다음 예제에서는 DynamoDB Encryption Client for Java를 사용하여 애플리케이션에서 DynamoDB 테이블 항목을 보호하는 방법을 보여줍니다. 리aws-dynamodb-encryption-java포지토리의 예제 디렉터리에서 더 많은 예제를 찾을 수 있습니다(자신의 예제도 제공). GitHub

D 사용ynamoDBEncryptor

이 예제는 다이렉트 KMS 공급자 에서 하위 수준 DynamoDBEncryptor를 사용하는 방법을 보여줍니다. 다이렉트 KMS 공급자는 사용자가 지정한 in AWS Key Management Service (AWS KMS)AWS KMS key에서 암호화 자료를 생성하고 보호합니다.

와 호환되는 암호화 자료 공급자(CMP)를 사용할 수 DynamoDBEncryptor있으며 DynamoDBMapper 및 와 함께 다이렉트 KMS 공급자를 사용할 수 있습니다AttributeEncryptor.

전체 코드 샘플 : .java 참조 AwsKmsEncryptedItem

1단계: 다이렉트 KMS 공급자 생성

지정된 리전으로 AWS KMS 클라이언트의 인스턴스를 생성합니다. 그런 다음 클라이언트 인스턴스를 사용하여 원하는 로 Direct KMS Provider의 인스턴스를 생성합니다 AWS KMS key.

이 예제에서는 Amazon 리소스 이름(ARN)을 사용하여 를 식별 AWS KMS key하지만 유효한 키 식별자 를 사용할 수 있습니다.

final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
2단계: 항목 생성

이 예제에서는 샘플 테이블 항목을 record HashMap 나타내는 를 정의합니다.

final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map<String, AttributeValue> record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("value1")); record.put(sortKeyName, new AttributeValue().withN("55")); record.put("example", new AttributeValue().withS("data")); record.put("numbers", new AttributeValue().withN("99")); record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); record.put("test", new AttributeValue().withS("test-value"));
3단계: D 생성ynamoDBEncryptor

Direct KMS Provider를 DynamoDBEncryptor 사용하여 의 인스턴스를 생성합니다.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
4단계: DynamoDB 암호화 컨텍스트 생성

DynamoDB 암호화 컨텍스트에는 테이블 구조와 암호화 및 서명 방법에 대한 정보가 포함되어 있습니다. DynamoDBMapper를 사용하는 경우 AttributeEncryptor에서 자동으로 암호화 컨텍스트를 생성합니다.

final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
5단계: 속성 작업 객체 생성

속성 작업은 암호화 및 서명되는 항목 속성, 서명되기만 하는 속성, 암호화 및 서명되지 않는 속성을 결정합니다.

Java에서 속성 작업을 지정하려면 속성 이름 및 EncryptionFlags 값 페어 HashMap 의 를 생성합니다.

예를 들어, 다음 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: // fall through to the next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Neither encrypted nor signed break; default: // Encrypt and sign all other attributes actions.put(attributeName, encryptAndSign); break; } }
6단계: 항목 암호화 및 서명

테이블 항목을 암호화하고 서명하려면 DynamoDBEncryptor의 인스턴스에서 encryptRecord 방법을 호출합니다. 테이블 항목(record), 속성 작업(actions) 및 암호화 컨텍스트(encryptionContext)를 지정합니다.

final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
7단계: DynamoDB 테이블에 항목 넣기

마지막으로 암호화되고 서명된 항목을 DynamoDB 테이블에 넣습니다.

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); ddb.putItem(tableName, encrypted_record);

D 사용ynamoDBMapper

다음 예제에서는 다이렉트 KMS 공급자 에서 DynamoDB 매퍼 헬퍼 클래스를 사용하는 방법을 보여줍니다. 다이렉트 KMS 공급자는 사용자가 지정한 in AWS Key Management Service (AWS KMS)AWS KMS key에서 암호화 자료를 생성하고 보호합니다.

와 호환되는 암호화 자료 공급자(CMP)를 사용할 수 DynamoDBMapper있으며 하위 수준 과 함께 Direct KMS Provider를 사용할 수 있습니다DynamoDBEncryptor.

전체 코드 샘플 : .java 참조 AwsKmsEncryptedObject

1단계: 다이렉트 KMS 공급자 생성

지정된 리전으로 AWS KMS 클라이언트의 인스턴스를 생성합니다. 그런 다음 클라이언트 인스턴스를 사용하여 원하는 로 Direct KMS Provider의 인스턴스를 생성합니다 AWS KMS key.

이 예제에서는 Amazon 리소스 이름(ARN)을 사용하여 를 식별 AWS KMS key하지만 유효한 키 식별자 를 사용할 수 있습니다.

final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
2단계: DynamoDB 암호화기 및 D 생성ynamoDBMapper

이전 단계에서 생성한 Direct KMS Provider를 사용하여 DynamoDB Encryptor의 인스턴스를 생성합니다. DynamoDB Mapper를 사용하려면 하위 수준의 DynamoDB Encryptor를 인스턴스화해야 합니다.

그런 다음 DynamoDB 데이터베이스 인스턴스와 매퍼 구성을 만들고 이를 사용하여 DynamoDB Mapper의 인스턴스를 만듭니다.

중요

DynamoDBMapper를 사용하여 서명된(또는 암호화 및 서명된) 항목을 추가하거나 편집하는 경우 다음 예와 같이 모든 속성을 포함하는 PUT와 같은 저장 동작을 사용하도록 구성합니다. 그렇지 않으면 데이터를 복호화하지 못할 수 있습니다.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp) final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
3단계: DynamoDB 테이블 정의

다음으로 DynamoDB 테이블을 정의합니다. 주석을 사용하여 속성 작업을 지정합니다. 이 예제에서는 DynamoDB 테이블, ExampleTable 및 테이블 항목을 나타내는 DataPoJo 클래스를 만듭니다.

이 샘플 테이블에서는 기본 키 속성이 서명되지만 암호화되지는 않습니다. 이는 @DynamoDBHashKey 주석이 달린 partition_attribute@DynamoDBRangeKey 주석이 달린 sort_attribute에 적용됩니다.

@DynamoDBAttribute 주석이 달린 속성(예: some numbers)은 암호화 및 서명됩니다. DynamoDB Encryption Client에서 정의한 @DoNotEncrypt(기호만 해당) 또는 @DoNotTouch(암호화 또는 서명 안 함) 암호화 주석을 사용하는 속성은 예외입니다. 예를 들어 leave me 속성에 @DoNotTouch 주석이 있으므로 암호화되거나 서명되지 않습니다.

@DynamoDBTable(tableName = "ExampleTable") public static final class DataPoJo { private String partitionAttribute; private int sortAttribute; private String example; private long someNumbers; private byte[] someBinary; private String leaveMe; @DynamoDBHashKey(attributeName = "partition_attribute") public String getPartitionAttribute() { return partitionAttribute; } public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } @DynamoDBRangeKey(attributeName = "sort_attribute") public int getSortAttribute() { return sortAttribute; } public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } @DynamoDBAttribute(attributeName = "example") public String getExample() { return example; } public void setExample(String example) { this.example = example; } @DynamoDBAttribute(attributeName = "some numbers") public long getSomeNumbers() { return someNumbers; } public void setSomeNumbers(long someNumbers) { this.someNumbers = someNumbers; } @DynamoDBAttribute(attributeName = "and some binary") public byte[] getSomeBinary() { return someBinary; } public void setSomeBinary(byte[] someBinary) { this.someBinary = someBinary; } @DynamoDBAttribute(attributeName = "leave me") @DoNotTouch public String getLeaveMe() { return leaveMe; } public void setLeaveMe(String leaveMe) { this.leaveMe = leaveMe; } @Override public String toString() { return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute=" + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]"; } }
4단계: 테이블 항목 암호화 및 저장

이제 테이블 항목을 만들고 DynamoDB Mapper를 사용하여 저장하면 항목이 테이블에 추가되기 전에 자동으로 암호화되고 서명됩니다.

이 예제에서는 record라는 테이블 항목을 정의합니다. 테이블에 저장되기 전에 해당 속성은 DataPoJo 클래스의 주석을 기반으로 암호화되고 서명됩니다. 이 경우 PartitionAttribute, SortAttributeLeaveMe를 제외한 모든 속성은 암호화되고 서명됩니다. PartitionAttributeSortAttributes는 서명만 됩니다. LeaveMe 속성은 암호화되거나 서명되지 않습니다.

record 항목을 암호화하고 서명한 다음 ExampleTable에 추가하려면 DynamoDBMapper 클래스의 save 메서드를 호출합니다. DynamoDB Mapper는 PUT 저장 동작을 사용하도록 구성되어 있으므로 항목을 업데이트하는 대신에 동일한 프라이머리 키로 항목을 대체합니다. 이렇게 하면 서명이 일치하고 테이블에서 항목을 가져올 때 해당 항목의 암호를 복호화할 수 있습니다.

DataPoJo record = new DataPoJo(); record.setPartitionAttribute("is this"); record.setSortAttribute(55); record.setExample("data"); record.setSomeNumbers(99); record.setSomeBinary(new byte[]{0x00, 0x01, 0x02}); record.setLeaveMe("alone"); mapper.save(record);