

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

# DynamoDB Encryption Client for Java 사용
<a name="java-using"></a>

**참고**  
클라이언트측 암호화 라이브러리의 [이름이 AWS Database Encryption SDK로 변경되었습니다](DDBEC-rename.md). 다음 주제에서는 Java용 DynamoDB Encryption Client 버전 1.*x*\~2.*x* 와 Python용 DynamoDB Encryption Client 버전 1.*x*\~3.*x*에 대한 정보를 제공합니다. 자세한 내용은 [AWS Database Encryption SDK for DynamoDB 버전 지원](legacy-dynamodb-encryption-client.md#legacy-support)을 참조하세요.

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

DynamoDB Encryption Client를 사용한 프로그래밍에 대한 자세한 내용은 [Java 예제](java-examples.md), GitHub에 대한 `aws-dynamodb-encryption-java repository`의 [예제](https://github.com/aws/aws-dynamodb-encryption-java/tree/master/examples) 및 DynamoDB Encryption Client용 [Javadoc](https://aws.github.io/aws-database-encryption-sdk-dynamodb/)를 참조하세요.



**Topics**
+ [항목 암호화 도구](#ddbec-item-encryptor)
+ [Java의 속성 작업](#attribute-actions-java)
+ [테이블 이름 재정의](#override-table-name)

## 항목 암호화 도구: DynamoDBEncryptor
<a name="ddbec-item-encryptor"></a>

Java의 DynamoDB Encryption Client에는 하위 수준 [DynamoDBEncryptor](https://aws.github.io/aws-database-encryption-sdk-dynamodb/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/encryption/DynamoDBEncryptor.html)라는 [항목 암호화 도구가](DDBEC-legacy-concepts.md#item-encryptor) 하나 있습니다.

## Java의 속성 작업
<a name="attribute-actions-java"></a>

[속성 작업](DDBEC-legacy-concepts.md#legacy-attribute-actions)은 암호화 및 서명되는 속성 값, 서명만 되는 속성 값 및 무시되는 속성 값을 결정합니다.

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

### DynamoDBEncryptor에 대한 속성 작업
<a name="attribute-action-default"></a>

[DynamoDBEncryptor](https://aws.github.io/aws-database-encryption-sdk-dynamodb/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/encryption/DynamoDBEncryptor.html)를 직접 사용하는 경우 속성 작업을 지정하려면 이름-값 페어가 속성 이름 및 지정한 작업을 표현하는 `HashMap` 객체를 만듭니다.

속성 작업에 유효한 값은 `EncryptionFlags` 열거 유형으로 정의되어 있습니다. `ENCRYPT` 및 `SIGN`와 함께 사용하거나 `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;
  }
}
```

그런 다음 `DynamoDBEncryptor`의 [encryptRecord](https://aws.github.io/aws-database-encryption-sdk-dynamodb/com/amazonaws/services/dynamodbv2/datamodeling/sdkv2/encryption/DynamoDBEncryptor.html#encryptRecord-java.util.Map-java.util.Map-com.amazonaws.services.dynamodbv2.datamodeling.sdkv2.encryption.EncryptionContext-) 방법을 호출할 때 맵을 `attributeFlags` 파라미터의 값으로 지정합니다. 예를 들어, `encryptRecord`에 대한 이 호출은 `actions` 맵을 사용합니다.

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

## 테이블 이름 재정의
<a name="override-table-name"></a>

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

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

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