기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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 버전 지원을 참조하세요.
다음 예제에서는 DynamoDB Encryption Client for Java를 사용하여 애플리케이션에서 DynamoDB 테이블 항목을 보호하는 방법을 보여줍니다. GitHub의 aws-database-encryption-sdk-dynamodb
DynamoDBEncryptor 사용
이 예제에서는 Direct KMS Provider와 함께 하위 수준 DynamoDBEncryptor
에서 호환되는 암호화 자료 공급자(CMP)를 사용할 수 있습니다DynamoDBEncryptor.
전체 코드 샘플 보기: AwsKmsEncryptedItem.java
- 1단계: Direct KMS Provider 생성
-
지정된 리전으로 AWS KMS 클라이언트의 인스턴스를 생성합니다. 그런 다음 클라이언트 인스턴스를 사용하여 원하는 AWS KMS key로 Direct KMS Provider의 인스턴스를 생성합니다.
이 예제에서는 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 KmsClient kms = KmsClient.builder().region(Region.of(region)).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms,keyArn); - 2단계: 항목 생성
-
이 예제는 샘플 테이블 항목을 나타내는
recordHashMap을 정의합니다.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단계: DynamoDBEncryptor 생성
-
Direct KMS Provider를 사용하여
DynamoDBEncryptor인스턴스를 생성합니다.final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); - 4단계: DynamoDB 암호화 컨텍스트 생성
-
DynamoDB 암호화 컨텍스트에는 테이블 구조와 암호화 및 서명 방법에 대한 정보가 포함되어 있습니다.
final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build(); - 5단계: 속성 작업 객체 생성
-
속성 작업은 암호화 및 서명되는 항목 속성, 서명되기만 하는 속성, 암호화 및 서명되지 않는 속성을 결정합니다.
Java에서 속성 작업을 지정하려면 속성 이름 및
EncryptionFlags값 페어로 구성된 HashMap을 생성합니다.예를 들어, 다음 Java 코드는 서명되었지만 암호화되지 않은 파티션 키 및 정렬 키 속성과 서명되거나 암호화되지 않은
test속성을 제외한record항목의 모든 속성을 암호화하고 서명하는actionsHashMap을 생성합니다.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 DynamoDbClient ddb = DynamoDbClient.builder().region(Region.of(region)).build(); ddb.putItem(tableName, encrypted_record);