

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

# 암호화 자료 공급자
<a name="crypto-materials-providers"></a>

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

DynamoDB Encryption Client를 사용할 때 내려야 하는 가장 중요한 결정 중 하나는 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)를 선택하는 것입니다. CMP는 암호화 자료를 조합하여 항목 암호화 도구에 반환합니다. 또한 암호화 및 서명 키의 생성 방법, 각 항목에 대해 새로운 키 자료를 생성하거나 재사용할지 여부, 사용되는 암호화 및 서명 알고리즘도 결정합니다.

DynamoDB Encryption Client 라이브러리에 제공된 구현에서 CMP를 선택하거나 호환 가능한 사용자 지정 CMP를 구축할 수 있습니다. CMP 선택은 사용하는 [프로그래밍 언어](programming-languages.md)에 따라 달라질 수도 있습니다.

이 주제에서는 가장 일반적인 CMP를 설명하고 애플리케이션에 가장 적합한 CMP를 선택하는 데 도움이 되는 몇 가지 조언을 제공합니다.

**Direct KMS Materials Provider**  
Direct KMS Materials Provider는 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS)를 암호화되지 않은 상태로 두는 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)에 따라 테이블 항목을 보호합니다. 애플리케이션에서 암호화 자료를 생성하거나 관리할 필요가 없습니다. AWS KMS key 를 사용하여 각 항목에 대한 고유한 암호화 및 서명 키를 생성하기 때문에이 공급자는 항목을 암호화하거나 해독할 AWS KMS 때마다를 호출합니다.  
 AWS KMS 를 사용하고 트랜잭션당 하나의 AWS KMS 호출이 애플리케이션에 유용한 경우이 공급자가 좋은 선택입니다.  
자세한 내용은 [Direct KMS Materials Provider](direct-kms-provider.md)을 참조하세요.

**래핑된 자료 공급자(래핑된 CMP)**  
래핑된 자료 공급자(래핑된 CMP)는 DynamoDB Encryption Client 외부에서 래핑 및 서명 키를 생성 및 관리할 수 있도록 해줍니다.  
래핑된 CMP는 각 항목에 대해 고유한 암호화 키를 생성합니다. 그런 다음 사용자가 제공한 래핑(또는 언래핑) 및 서명 키를 사용합니다. 따라서 래핑 및 서명 키의 생성 방법과 각 항목에 고유한지 또는 재사용되는지를 결정합니다. 래핑된 CMP는 암호화 자료를 사용하지 않고 안전하게 관리할 AWS KMS 수 있는 애플리케이션을 위한 [Direct KMS Provider](direct-kms-provider.md)의 안전한 대안입니다.  
자세한 내용은 [Wrapped Materials Provider](wrapped-provider.md)을 참조하세요.

**Most Recent Provider**  
*Most Recent Provider*는 [공급자 스토어](DDBEC-legacy-concepts.md#provider-store)와 함께 작동하도록 설계된 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)입니다. 공급자 스토어에서 CMP를 가져오고 CMP에서 반환한 암호화 자료를 가져옵니다. Most Recent Provider는 일반적으로 각각의 CMP를 사용하여 암호화 자료에 대한 여러 요청을 충족하지만, 공급자 스토어의 기능을 사용하여 자료의 재사용 범위를 제어하고, CMP 교체 빈도를 결정하며, Most Recent Provider를 변경하지 않고 사용되는 CMP 유형도 변경합니다.  
호환되는 모든 공급자 스토어에서 Most Recent Provider를 사용할 수 있습니다. DynamoDB Encryption Client에는 래핑된 CMP를 반환하는 공급자 스토어인 MetaStore가 포함됩니다.  
Most Recent Provider는 관련 암호화 소스에 대한 호출을 최소화해야 하는 애플리케이션과, 보안 요구 사항을 위반하지 않으면서 일부 암호화 자료를 재사용할 수 있는 애플리케이션에 적합합니다. 예를 들어 항목을 암호화하거나 해독할 AWS KMS 때마다를 호출하지 않고 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS)의 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)에서 암호화 자료를 보호할 수 있습니다.  
자세한 내용은 [Most Recent Provider](most-recent-provider.md)을 참조하세요.

**Static Materials Provider**  
Static Materials Provider는 테스트, 개념 증명 데모 및 레거시 호환성 목적으로 설계되었습니다. 각 항목에 대해 고유한 암호화 자료를 생성하지는 않습니다. 입력한 것과 동일한 암호화 및 서명 키를 반환하며, 이러한 키는 테이블 항목을 암호화, 복호화 및 서명하는 데 직접 사용됩니다.  
Java 라이브러리의 [Asymmetric Static Provider](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html)는 Static Provider가 아닙니다. 단순히 [Wrapped CMP](wrapped-provider.md)에 대한 대체 생성자를 제공할 뿐입니다. 프로덕션 환경에서는 안전하지만 가능하면 래핑된 CMP를 직접 사용해야 합니다.

**Topics**
+ [Direct KMS Materials Provider](direct-kms-provider.md)
+ [Wrapped Materials Provider](wrapped-provider.md)
+ [Most Recent Provider](most-recent-provider.md)
+ [Static Materials Provider](static-provider.md)

# Direct KMS Materials Provider
<a name="direct-kms-provider"></a>

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

*Direct KMS Materials Provider*(Direct KMS Provider)는 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS)을 암호화되지 않은 상태로 유지하지 않는 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)에 따라 테이블 항목을 보호합니다. 이 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)는 각 테이블 항목에 대해 고유한 암호화 키 및 서명 키를 반환합니다. 이를 위해 항목을 암호화하거나 해독할 AWS KMS 때마다가 호출됩니다.

DynamoDB 항목을 높은 빈도로 대규모로 처리하는 경우 AWS KMS [requests-per-second 수 제한을](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second) 초과하여 처리가 지연될 수 있습니다. 제한을 초과해야 하는 경우 [AWS Support 센터](https://console.aws.amazon.com/support/home)에서 사례를 생성합니다. [Most Recent Provider](most-recent-provider.md)와 같이 키 재사용이 제한된 암호화 자료 공급자를 사용하는 것도 고려해 볼 수 있습니다.

Direct KMS Provider를 사용하려면 호출자에게 [에서 AWS 계정](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) AWS KMS key및 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 작업을 호출할 수 있는 하나 이상의 및 권한이 있어야 합니다 AWS KMS key. AWS KMS key 는 대칭 암호화 키여야 합니다. DynamoDB Encryption Client는 비대칭 암호화를 지원하지 않습니다. [DynamoDB 글로벌 테이블](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)을 사용하는 경우 [AWS KMS 다중 리전 키](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)를 지정하는 것이 좋습니다. 자세한 내용은 [사용 방법](#provider-kms-how-to-use)을 참조하세요.

**참고**  
Direct KMS Provider를 사용하면 기본 키 속성의 이름과 값이 [AWS KMS 암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) 및 관련 AWS KMS 작업 AWS CloudTrail 로그에 일반 텍스트로 표시됩니다. 그러나 DynamoDB Encryption Client는 암호화된 어떤 속성 값도 일반 텍스트로 노출하지 않습니다.

Direct KMS Provider는 DynamoDB Encryption Client가 지원하는 여러 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP) 중 하나입니다. 기타 CMP에 대한 자세한 내용은 [암호화 자료 공급자](crypto-materials-providers.md) 섹션을 참조하세요.

**예제 코드는 다음을 참조하십시오.**
+ Java: [AwsKmsEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AwsKmsEncryptedItem.java)
+ Python: [aws-kms-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_table.py), [aws-kms-encrypted-item](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/aws_kms_encrypted_item.py)

**Topics**
+ [사용 방법](#provider-kms-how-to-use)
+ [작동 방식](#provider-kms-how-it-works)

## 사용 방법
<a name="provider-kms-how-to-use"></a>

Direct KMS Provider를 생성하려면 키 ID 파라미터를 사용하여 계정에 대칭 암호화 [KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)를 지정합니다. 키 ID 파라미터의 값은 AWS KMS key의 키 ID, 키 ARN, 별칭 이름 또는 별칭 ARN일 수 있습니다. 키 식별자에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 식별자](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)를 참조하세요.

Direct KMS Provider에는 대칭 암호화 KMS 키가 필요합니다. 비대칭 KMS 키를 사용할 수 없습니다. 그러나 다중 리전 KMS 키, 가져온 키 자료가 있는 KMS 키 또는 사용자 지정 키 스토어의 KMS 키를 사용할 수 있습니다. KMS 키에 대한 [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 및 [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 권한이 있어야 합니다. 따라서 관리형 또는 AWS 소유 KMS 키가 아닌 고객 AWS 관리형 키를 사용해야 합니다.

DynamoDB Encryption Client for Python은 키 ID 파라미터 값이 포함된 경우 해당 리전 AWS KMS 에서 호출할 리전을 결정합니다. 그렇지 않으면 AWS KMS 클라이언트에서 리전을 지정하거나에서 구성하는 리전을 사용합니다 AWS SDK for Python (Boto3). Python의 리전 선택에 대한 자세한 내용은 Python용 AWS SDK(Boto3) API 참조의 [구성을](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) 참조하세요.

지정한 클라이언트에 리전이 포함된 경우 Java용 DynamoDB 암호화 클라이언트는 클라이언트의 리전 AWS KMS AWS KMS 에서 호출할 리전을 결정합니다. 그렇지 않으면 AWS SDK for Java에서 구성한 리전을 사용합니다. 의 리전 선택에 대한 자세한 내용은 AWS SDK for Java 개발자 안내서의 [AWS 리전 선택을](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-region-selection.html) AWS SDK for Java참조하세요.

------
#### [ Java ]

```
// Replace the example key ARN and Region with valid values for your application
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);
```

------
#### [ Python ]

다음 예에서는 ARN 키를 사용하여 AWS KMS key를 지정합니다. 키 식별자에이 포함되지 않은 경우 AWS 리전 DynamoDB Encryption Client는 구성된 Botocore 세션에서 리전을 가져오거나 Boto 기본값에서 리전을 가져옵니다.

```
# Replace the example key ID with a valid value
kms_key = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key)
```

------

[Amazon DynamoDB 글로벌 테이블](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)을 사용하는 경우 AWS KMS 다중 리전 키로 데이터를 암호화하는 것이 좋습니다. 다중 리전 키는 키 ID와 키 구성 요소가 동일하기 때문에 서로 교환하여 사용할 수 AWS 리전 있는 다른 AWS KMS keys 에 있습니다. 자세한 내용을 알아보려면 *AWS Key Management Service 개발자 안내서*의 [다중 리전 키 사용](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)을 참조하세요.

**참고**  
글로벌 테이블 [버전 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html)를 사용하는 경우 예약된 복제 필드가 암호화되거나 서명되지 않도록 속성 작업을 설정해야 합니다. 자세한 내용은 [이전 버전 글로벌 테이블 관련 문제](troubleshooting.md#fix-global-tables)을 참조하세요.

DynamoDB Encryption Client에서 다중 리전 키를 사용하려면 다중 리전 키를 생성하여 애플리케이션이 실행되는 리전에 복제합니다. 그런 다음 DynamoDB Encryption Client가 AWS KMS을 호출하는 리전의 다중 리전 키를 사용하도록 Direct KMS Provider를 구성합니다.

다음 예제에서는 다중 리전 키를 사용하여 미국 동부(버지니아 북부)(us-east-1) 리전의 데이터를 암호화하고 미국 서부(오레곤)(us-west-2) 리전에서 이를 복호화하도록 DynamoDB Encryption Client를 구성합니다.

------
#### [ Java ]

이 예제에서 DynamoDB Encryption Client는 AWS KMS 클라이언트의 리전 AWS KMS 에서 호출할 리전을 가져옵니다. 이 `keyArn` 값은 동일한 리전의 다중 리전 키를 식별합니다.

```
// Encrypt in us-east-1

// Replace the example key ARN and Region with valid values for your application
final String usEastKey = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
final String region = 'us-east-1'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usEastKey);
```

```
// Decrypt in us-west-2

// Replace the example key ARN and Region with valid values for your application
final String usWestKey = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
final String region = 'us-west-2'
      
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usWestKey);
```

------
#### [ Python ]

이 예제에서 DynamoDB Encryption Client는 키 ARN의 리전 AWS KMS 에서 호출할 리전을 가져옵니다.

```
# Encrypt in us-east-1

# Replace the example key ID with a valid value
us_east_key = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_east_key)
```

```
# Decrypt in us-west-2

# Replace the example key ID with a valid value
us_west_key = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab'
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_west_key)
```

------

## 작동 방식
<a name="provider-kms-how-it-works"></a>

Direct KMS Provider는 다음 다이어그램에서처럼 사용자가 지정하는 AWS KMS key 에 의해 보호되는 암호화 및 서명 키를 반환합니다.

![\[DynamoDB Encryption Client에서 Direct KMS Provider의 입력, 처리 및 출력\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/directKMS.png)

+ 암호화 자료를 생성하기 위해 Direct KMS Provider는 AWS KMS key 사용자가 지정한 [를 사용하여 각 항목에 대해 고유한 데이터 키를 생성](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) AWS KMS 하도록 요청합니다. 이 공급자는 [데이터 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)의 일반 텍스트 복사본에서 항목의 암호화 및 서명 키를 추출한 다음 항목의 [자료 설명 속성](DDBEC-legacy-concepts.md#legacy-material-description)에 저장된 암호화된 데이터 키와 함께 암호화 및 서명 키를 반환합니다.

  항목 암호화기는 암호화 및 서명 키를 사용하여 가능한 한 빨리 메모리에서 암호화 및 서명 키를 제거합니다. 파생된 데이터 키의 암호화된 복사본만 암호화된 항목에 저장됩니다.
+ 복호화 자료를 생성하기 위해 Direct KMS Provider는 암호화된 데이터 키를 복호화 AWS KMS 하도록 요청합니다. 그런 다음 일반 텍스트 데이터 키에서 확인 및 서명 키를 추출하여 항목 암호화 도구에 반환합니다.

  항목 암호화기는 항목을 확인하고 확인에 성공하면 암호화된 값을 복호화합니다. 그런 다음 가능한 빨리 메모리에서 키를 제거합니다.

### 암호화 자료 가져오기
<a name="direct-kms-get-encryption-materials"></a>

이 단원에서는 [항목 암호화 도구](DDBEC-legacy-concepts.md#item-encryptor)에서 암호화 자료 요청 수신 시 Direct KMS Provider의 입력, 출력 및 처리에 대해 자세히 설명합니다.

**입력**(애플리케이션에서)
+ 의 키 ID입니다 AWS KMS key.

**입력**(항목 암호화 도구에서)
+ [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)

**출력**(항목 암호화 도구로)
+ 암호화 키(일반 텍스트)
+ 서명 키
+ [실제 자료 설명](DDBEC-legacy-concepts.md#legacy-material-description): 이러한 값은 클라이언트가 항목에 추가하는 자료 설명 속성에 저장됩니다.
  + amzn-ddb-env-key: 로 암호화된 Base64-encoded 데이터 키 AWS KMS key
  + amzn-ddb-env-alg: 암호화 알고리즘, 기본값은 [AES/256](https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/archived-crypto-projects/aes-development)
  + amzn-ddb-sig-alg: 서명 알고리즘, 기본값은 [HmacSHA256/256](https://en.wikipedia.org/wiki/HMAC)
  + amzn-ddb-wrap-alg: kms

**처리**

1. 다이렉트 KMS 공급자는 지정된 AWS KMS 를 사용하여 항목에 대한 고유한 데이터 키를 AWS KMS key 생성하라는 요청을 보냅니다. [https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 이 작업은 일반 텍스트 키와 AWS KMS key로 암호화된 복사본을 반환합니다. 이 자료를 *초기 키 자료*라고 합니다.

   이 요청은 [AWS KMS 암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)에 다음 값을 일반 텍스트로 포함합니다. 이러한 비밀이 아닌 값은 암호화된 개체에 암호화 방식으로 바인딩되므로 복호화 시 동일한 암호화 컨텍스트가 필요합니다. 이러한 값을 사용하여 [AWS CloudTrail 로그](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-overview.html)에서에 대한 호출을 식별할 수 AWS KMS 있습니다.
   + amzn-ddb-env-alg – 암호화 알고리즘, 기본값은 AES/256
   + amzn-ddb-sig-alg – 서명 알고리즘, 기본값은 HmacSHA256/256
   + (선택 사항) aws-kms-table – *테이블 이름*
   + (선택 사항) *파티션 키 이름* – *파티션 키 값*(이진 값은 Base64로 인코딩됨)
   + (선택 사항) *정렬 키 이름* – *정렬 키 값*(이진 값은 Base64로 인코딩됨)

   Direct KMS Provider는 항목의 DynamoDB AWS KMS 암호화 컨텍스트에서 암호화 컨텍스트 값을 가져옵니다. [DynamoDB ](concepts.md#encryption-context) DynamoDB 암호화 컨텍스트에 테이블 이름과 같은 값이 포함되지 않은 경우 해당 이름-값 페어는 AWS KMS 암호화 컨텍스트에서 생략됩니다.

1. Direct KMS Provider는 데이터 키에서 대칭 암호화 키 및 서명 키를 추출합니다. 기본적으로 [Secure Hash Algorithm(SHA) 256](https://en.wikipedia.org/wiki/SHA-2) 및 [RFC5869 HMAC 기반 키 추출 함수](https://tools.ietf.org/html/rfc5869)를 사용하여 256비트 AES 대칭 암호화 키 및 256비트 HMAC-SHA-256 서명 키를 추출합니다.

1. Direct KMS Provider는 출력을 항목 암호화 도구로 반환합니다.

1. 항목 암호화기는 암호화 키를 사용하여 지정된 속성을 암호화하고 서명 키를 사용하여 실제 자료 설명에 지정된 알고리즘을 사용하여 서명합니다. 가능한 한 빨리 메모리에서 일반 텍스트 키를 제거합니다.

### 복호화 자료 가져오기
<a name="direct-kms-get-decryption-materials"></a>

이 단원에서는 [항목 암호화 도구](DDBEC-legacy-concepts.md#item-encryptor)에서 복호화 자료 요청 수신 시 Direct KMS Provider의 입력, 출력 및 처리를 자세히 설명합니다.

**입력**(애플리케이션에서)
+ 의 키 ID입니다 AWS KMS key.

  키 ID의 값은 AWS KMS key의 키 ID, 키 ARN, 별칭 이름 또는 별칭 ARN일 수 있습니다. 리전과 같이 키 ID에 포함되지 않은 모든 값은 [AWS 명명된 프로필](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-using-profiles)에서 사용할 수 있어야 합니다. 키 ARN은 에 AWS KMS 서 필요로 하는 모든 값을 제공합니다.

**입력**(항목 암호화 도구에서)
+ 자료 설명 속성의 내용을 포함하는 [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)의 복사본입니다.

**출력**(항목 암호화 도구로)
+ 암호화 키(일반 텍스트)
+ 서명 키

**처리**

1. Direct KMS Provider는 암호화된 항목의 자료 설명 속성에서 암호화된 데이터 키를 가져옵니다.

1. 지정된를 사용하여 암호화된 데이터 키를 AWS KMS key [해독](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) AWS KMS 하도록 요청합니다. 이 작업은 일반 텍스트 키를 반환합니다.

   이 요청은 데이터 키를 생성 및 암호화하는 데 사용된 것과 동일한 [AWS KMS 암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)를 사용해야 합니다.
   + aws-kms-table – *테이블 이름*
   + *파티션 키 이름* – *파티션 키 값*(이진 값은 Base64로 인코딩됨)
   + (선택 사항) *정렬 키 이름* – *정렬 키 값*(이진 값은 Base64로 인코딩됨)
   + amzn-ddb-env-alg – 암호화 알고리즘, 기본값은 AES/256
   + amzn-ddb-sig-alg – 서명 알고리즘, 기본값은 HmacSHA256/256

1. Direct KMS Provider는 [Secure Hash Algorithm(SHA) 256](https://en.wikipedia.org/wiki/SHA-2) 및 [RFC5869 HMAC 기반 키 파생 기능](https://tools.ietf.org/html/rfc5869)을 사용하여 데이터 키에서 256비트 AES 대칭 암호화 키와 256비트 HMAC-SHA-256 서명 키를 파생합니다.

1. Direct KMS Provider는 출력을 항목 암호화 도구로 반환합니다.

1. 항목 암호화기는 서명 키를 사용하여 항목을 확인합니다. 성공하면 대칭 암호화 키를 사용하여 암호화된 속성 값을 복호화합니다. 이러한 작업은 실제 자료 설명에 지정된 암호화 및 서명 알고리즘을 사용합니다. 항목 암호화 도구는 가능한 한 빨리 메모리에서 일반 텍스트 키를 제거합니다.

# Wrapped Materials Provider
<a name="wrapped-provider"></a>

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

*래핑된 자료 공급자*(래핑된 CMP)를 사용하면 DynamoDB Encryption Client를 통해 모든 소스의 래핑 및 서명 키를 사용할 수 있습니다. 래핑된 CMP는 AWS 서비스에 종속되지 않습니다. 그러나 항목을 확인하고 복호화하기 위해 올바른 키를 제공하는 것을 포함하여 클라이언트 외부에서 래핑 및 서명 키를 생성하고 관리해야 합니다.

래핑된 CMP는 각 항목에 대해 고유한 항목 암호화 키를 생성합니다. 사용자가 제공하는 래핑 키와 항목 암호화 키를 래핑하여 래핑된 항목 암호화 키를 항목의 [자료 설명 속성](DDBEC-legacy-concepts.md#legacy-material-description)에 저장합니다. 래핑 및 서명 키를 제공하므로 래핑 및 서명 키가 생성되는 방법과 해당 키가 각 항목에 고유한지 또는 재사용되는지 여부를 결정합니다.

래핑된 CMP는 안전한 구현이며 암호화 자료를 관리할 수 있는 애플리케이션에 적합한 선택입니다.

래핑된 CMP는 DynamoDB Encryption Client가 지원하는 여러 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP) 중 하나입니다. 기타 CMP에 대한 자세한 내용은 [암호화 자료 공급자](crypto-materials-providers.md) 섹션을 참조하세요.

**예제 코드는 다음을 참조하십시오.**
+ Java: [AsymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java)
+ Python: [wrapped-rsa-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_rsa_encrypted_table.py), [wrapped-symmetric-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_symmetric_encrypted_table.py)

**Topics**
+ [사용 방법](#wrapped-cmp-how-to-use)
+ [작동 방식](#wrapped-cmp-how-it-works)

## 사용 방법
<a name="wrapped-cmp-how-to-use"></a>

래핑된 CMP를 생성하려면 래핑 키(암호화에 필요), 래핑 해제 키(복호화에 필요) 및 서명 키를 지정합니다. 항목을 암호화하고 복호화할 때 키를 제공해야 합니다.

래핑, 래핑 해제 및 서명 키는 대칭 키 또는 비대칭 키 페어일 수 있습니다.

------
#### [ Java ]

```
// This example uses asymmetric wrapping and signing key pairs
final KeyPair wrappingKeys = ...
final KeyPair signingKeys = ...

final WrappedMaterialsProvider cmp = 
    new WrappedMaterialsProvider(wrappingKeys.getPublic(),
                                 wrappingKeys.getPrivate(),
                                 signingKeys);
```

------
#### [ Python ]

```
# This example uses symmetric wrapping and signing keys
wrapping_key = ...
signing_key  = ...

wrapped_cmp = WrappedCryptographicMaterialsProvider(
    wrapping_key=wrapping_key,
    unwrapping_key=wrapping_key,
    signing_key=signing_key
)
```

------

## 작동 방식
<a name="wrapped-cmp-how-it-works"></a>

래핑된 CMP는 모든 항목에 대해 새 항목 암호화 키를 생성합니다. 다음 다이어그램과 같이 사용자가 제공하는 래핑, 래핑 해제 및 서명 키를 사용합니다.

![\[DynamoDB Encryption Client에서 래핑된 자료 공급자의 입력, 처리 및 출력\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/wrappedCMP.png)


### 암호화 자료 가져오기
<a name="wrapped-cmp-get-encryption-materials"></a>

이 단원에서는 암호화 자료 요청 수신 시 래핑된 자료 공급자(래핑된 CMP)의 입력, 출력 및 처리에 대해 자세히 설명합니다.

**입력**(애플리케이션에서)
+ 래핑 키: [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)(AES) 대칭 키 또는 [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) 퍼블릭 키. 속성 값이 암호화된 경우 필수입니다. 그렇지 않으면 선택 사항이며 무시됩니다.
+ 래핑 해제 키: 선택 사항이며 무시됩니다.
+ 서명 키

**입력**(항목 암호화 도구에서)
+ [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)

**출력**(항목 암호화 도구로):
+ 일반 텍스트 항목 암호화 키
+ 서명 키(변경되지 않음)
+ [실제 자료 설명](DDBEC-legacy-concepts.md#legacy-material-description): 이러한 값은 클라이언트가 항목에 추가하는 [자료 설명 속성](DDBEC-legacy-concepts.md#legacy-material-description)에 저장됩니다.
  + `amzn-ddb-env-key`: Base64로 인코딩되고 래핑된 항목 암호화 키
  + `amzn-ddb-env-alg`: 항목을 암호화하는 데 사용되는 암호화 알고리즘입니다. 기본값은 AES-256-CBC입니다.
  + `amzn-ddb-wrap-alg`: 래핑된 CMP가 항목 암호화 키를 래핑하는 데 사용한 래핑 알고리즘입니다. 래핑 키가 AES 키인 경우 [RFC 3394](https://tools.ietf.org/html/rfc3394.html)에 정의된 대로 패딩되지 않은 `AES-Keywrap`를 사용하여 키가 래핑됩니다. 래핑 키가 RSA 키인 경우 MGF1 패딩이 포함된 RSA OAEP를 사용하여 키가 암호화됩니다.

**처리**

항목을 암호화할 때 래핑 키와 서명 키를 전달합니다. 래핑 해제 키는 선택 사항이며 무시됩니다.

1. 래핑된 CMP는 테이블 항목에 대한 고유한 대칭 항목 암호화 키를 생성합니다.

1. 항목 암호화 키를 래핑하기 위해 지정한 래핑 키를 사용합니다. 그런 다음 가능한 한 빨리 메모리에서 제거합니다.

1. Wrapped CMP는 일반 텍스트 항목 암호화 키, 제공한 서명 키, 그리고 래핑된 항목 암호화 키와 암호화 및 래핑 알고리즘을 포함하는 [실제 자료 설명](DDBEC-legacy-concepts.md#legacy-material-description)을 반환합니다.

1. 항목 암호화 도구는 일반 텍스트 암호화 키를 사용하여 항목을 암호화합니다. 항목에 서명하기 위해 제공한 서명 키를 사용합니다. 그런 다음 가능한 한 빨리 메모리에서 일반 텍스트 키를 제거합니다. 래핑된 암호화 키(`amzn-ddb-env-key`)를 포함하여 실제 자료 설명의 필드를 항목의 자료 설명 속성에 복사합니다.

### 복호화 자료 가져오기
<a name="wrapped-cmp-get-decryption-materials"></a>

이 단원에서는 복호화 자료 요청 수신 시 래핑된 자료 공급자(래핑된 CMP)의 입력, 출력 및 처리에 대해 자세히 설명합니다.

**입력**(애플리케이션에서)
+ 래핑 키: 선택 사항이며 무시됩니다.
+ 언래핑 키: 암호화하는 데 사용되는 RSA 퍼블릭 키에 해당하는 동일한 [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)(AES) 대칭 키 또는 [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) 프라이빗 키입니다. 속성 값이 암호화된 경우 필수입니다. 그렇지 않으면 선택 사항이며 무시됩니다.
+ 서명 키

**입력**(항목 암호화 도구에서)
+ 자료 설명 속성의 내용을 포함하는 [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)의 복사본입니다.

**출력**(항목 암호화 도구로)
+ 일반 텍스트 항목 암호화 키
+ 서명 키(변경되지 않음)

**처리**

항목의 암호를 복호화할 때 래핑 해제 키와 서명 키를 전달합니다. 래핑 키는 선택 사항이며 무시됩니다.

1. 래핑된 CMP는 항목의 자료 설명 속성에서 래핑된 항목 암호화 키를 가져옵니다.

1. 래핑 해제 키와 알고리즘을 사용하여 항목 암호화 키를 래핑 해제합니다.

1. 일반 텍스트 항목 암호화 키, 서명 키, 암호화 및 서명 알고리즘을 항목 암호화 도구에 반환합니다.

1. 항목 암호화기는 서명 키를 사용하여 항목을 확인합니다. 성공하면 항목 암호화 키를 사용하여 항목의 암호를 복호화합니다. 그런 다음 가능한 한 빨리 메모리에서 일반 텍스트 키를 제거합니다.

# Most Recent Provider
<a name="most-recent-provider"></a>

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

*Most Recent Provider*는 [공급자 스토어](DDBEC-legacy-concepts.md#provider-store)와 함께 작동하도록 설계된 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)입니다. 공급자 스토어에서 CMP를 가져오고 CMP에서 반환한 암호화 자료를 가져옵니다. 일반적으로 각 CMP를 사용하여 암호화 자료에 대한 여러 요청을 충족합니다. 하지만 공급자 스토어의 기능을 사용하여 자료가 재사용되는 범위를 제어하고 CMP 교체 빈도를 결정할 수 있으며, Most Recent Provider를 변경하지 않고 사용하는 CMP 유형을 변경할 수도 있습니다.

**참고**  
Most Recent Provider의 `MostRecentProvider` 기호와 연관된 코드는 프로세스 수명 동안 암호화 자료를 메모리에 저장할 수 있습니다. 호출자가 더 이상 사용 권한이 없는 키를 사용하도록 허용할 수도 있습니다.  
`MostRecentProvider` 기호는 지원되는 이전 버전의 DynamoDB Encryption Client에서 더 이상 사용되지 않으며 버전 2.0.0에서 제거되었습니다. `CachingMostRecentProvider` 기호로 대체됩니다. 자세한 내용은 [Most Recent Provider 업데이트](#mrp-versions)을 참조하세요.

Most Recent Provider는 공급자 스토어 및 관련 암호화 소스에 대한 호출을 최소화해야 하는 애플리케이션과, 보안 요구 사항을 위반하지 않으면서 일부 암호화 자료를 재사용할 수 있는 애플리케이션에 적합합니다. 예를 들어 항목을 암호화하거나 해독할 AWS KMS 때마다를 호출하지 않고 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS)의 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)에서 암호화 자료를 보호할 수 있습니다.

선택하는 공급자 스토어는 Most Recent Provider에서 사용하는 CMP 유형과 새 CMP를 가져오는 빈도를 결정합니다. 사용자가 설계한 사용자 정의 공급자 저장소를 포함하여 Most Recent Provider와 호환되는 모든 공급자 스토어를 사용할 수 있습니다.

DynamoDB Encryption Client에는 [래핑된 자료 공급자](wrapped-provider.md)(래핑된 CMP)를 생성하고 반환하는 MetaStore가 포함되어 있습니다.** MetaStore는 생성한 래핑된 CMP의 여러 버전을 내부 DynamoDB 테이블에 저장하고 DynamoDB Encryption Client의 내부 인스턴스를 통한 클라이언트측 암호화로 이를 보호합니다.

모든 유형의 내부 CMP를 사용하여 테이블의 자료를 보호하도록 MetaStore를 구성할 수 있습니다. 여기에는 로 보호되는 암호화 자료를 생성하는 [다이렉트 KMS 공급자](direct-kms-provider.md) AWS KMS key, 사용자가 제공하는 래핑 및 서명 키를 사용하는 래핑된 CMP 또는 사용자가 설계하는 호환되는 사용자 지정 CMP가 포함됩니다.

**예제 코드는 다음을 참조하십시오.**
+ Java: [MostRecentEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/MostRecentEncryptedItem.java)
+ Python: [most\$1recent\$1provider\$1encrypted\$1table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/most_recent_provider_encrypted_table.py)

**Topics**
+ [사용 방법](#mrp-how-to-use-it)
+ [작동 방식](#mrp-how-it-works)
+ [Most Recent Provider 업데이트](#mrp-versions)

## 사용 방법
<a name="mrp-how-to-use-it"></a>

Most Recent Provider를 생성하려면 공급자 저장소를 생성 및 구성한 다음 공급자 스토어를 사용하는 Most Recent Provider를 생성해야 합니다.

다음 예제에서는 MetaStore를 사용하고 [Direct KMS Provider](direct-kms-provider.md)의 암호화 자료로 내부 DynamoDB 테이블의 버전을 보호하는 Most Recent Provider를 생성하는 방법을 보여줍니다. 이 예제에서는 [`CachingMostRecentProvider`](#mrp-versions) 기호를 사용합니다.

각 Most Recent Provider에는 MetaStore 테이블에서 CMP를 식별하는 이름, [time-to-live](#most-recent-provider-ttl)(TTL) 설정, 캐시가 보유할 수 있는 항목 수를 결정하는 캐시 크기 설정이 있습니다. 이 예제에서는 캐시 크기를 항목 1,000개와 TTL 한 개를 60초로 설정합니다.

------
#### [ Java ]

```
// Set the name for MetaStore's internal table
final String keyTableName = 'metaStoreTable'

// Set the Region and AWS KMS key
final String region = 'us-west-2'
final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

// Set the TTL and cache size
final long ttlInMillis = 60000;
final long cacheSize = 1000;

// Name that identifies the MetaStore's CMPs in the provider store
final String materialName = 'testMRP'

// Create an internal DynamoDB client for the MetaStore
final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build();

// Create an internal Direct KMS Provider for the MetaStore
final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build();
final DirectKmsMaterialProvider kmsProv = new DirectKmsMaterialProvider(kms, keyArn);

// Create an item encryptor for the MetaStore,
// including the Direct KMS Provider
final DynamoDBEncryptor keyEncryptor = DynamoDBEncryptor.getInstance(kmsProv);

// Create the MetaStore
final MetaStore metaStore = new MetaStore(ddb, keyTableName, keyEncryptor);

//Create the Most Recent Provider
final CachingMostRecentProvider cmp = new CachingMostRecentProvider(metaStore, materialName, ttlInMillis, cacheSize);
```

------
#### [ Python ]

```
# Designate an AWS KMS key
kms_key_id = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

# Set the name for MetaStore's internal table
meta_table_name = 'metaStoreTable'

# Name that identifies the MetaStore's CMPs in the provider store
material_name = 'testMRP'

# Create an internal DynamoDB table resource for the MetaStore
meta_table = boto3.resource('dynamodb').Table(meta_table_name)

# Create an internal Direct KMS Provider for the MetaStore
kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
    
# Create the MetaStore with the Direct KMS Provider
meta_store = MetaStore(
    table=meta_table,
    materials_provider=kms_cmp
)

# Create a Most Recent Provider using the MetaStore
#    Sets the TTL (in seconds) and cache size (# entries)
most_recent_cmp = MostRecentProvider(
    provider_store=meta_store,
    material_name=material_name,
    version_ttl=60.0,
    cache_size=1000
)
```

------

## 작동 방식
<a name="mrp-how-it-works"></a>

Most Recent Provider는 공급자 스토어에서 CMP를 가져옵니다. 그런 다음 CMP를 사용하여 항목 암호화 도구에 반환되는 암호화 자료를 생성합니다.

### 최신 제공자 정보
<a name="about-mrp"></a>

Most Recent Provider는 [공급자 스토어](DDBEC-legacy-concepts.md#provider-store)에서 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)를 가져옵니다. 그런 다음 CMP를 사용하여 반환되는 암호화 자료를 생성합니다. 각 Most Recent Provider는 하나의 공급자 스토어와 연결되어 있지만 공급자 스토어는 여러 호스트에 걸쳐 여러 공급자에게 CMP를 제공할 수 있습니다.

Most Recent Provider는 모든 공급자 스토어의 호환되는 CMP와 함께 사용할 수 있습니다. CMP에서 암호화 또는 복호화 자료를 요청하고 출력을 항목 암호화 도구로 반환합니다. 어떠한 암호화 작업도 수행하지 않습니다.

Most Recent Provider는 공급자 스토어에서 CMP를 요청하기 위해 관련 자료 이름과 사용할 기존 CMP의 버전을 제공합니다. 암호화 자료의 경우 Most Recent Provider는 항상 최대("최신") 버전을 요청합니다. 복호화 자료의 경우 다음 다이어그램과 같이 암호화 자료를 생성하는 데 사용된 CMP 버전을 요청합니다.

![\[Most Recent Provider\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/most-recent-provider-1.png)


Most Recent Provider는 공급자 스토어에서 반환하는 CMP의 버전을 메모리의 로컬 Least Recently Used(LRU) 캐시에 저장합니다. 이 캐시에서는 Most Recent Provider가 모든 항목에 대해 공급자 스토어를 호출하지 않고 필요한 CMP를 가져올 수 있습니다. 요청 시 캐시를 지울 수 있습니다.

Most Recent Provider는 애플리케이션의 특성에 따라 조정할 수 있는 구성 가능한 [time-to-live 값](#most-recent-provider-ttl)을 사용합니다.

### MetaStore 정보
<a name="about-metastore"></a>

호환되는 사용자 지정 공급자 스토어를 비롯하여 모든 공급자 스토어와 함께 Most Recent Provider를 사용할 수 있습니다. DynamoDB Encryption Client에는 구성하고 사용자 지정할 수 있는 보안 구현인 MetaStore가 포함되어 있습니다.

MetaStore는 래핑된 CMP에 필요한 래핑 키, 언래핑 키, 서명 키로 구성된 [래핑된 CMP](wrapped-provider.md)를 생성하고 반환하는 [공급자 스토어](DDBEC-legacy-concepts.md#provider-store)입니다.** 래핑된 CMP는 항상 모든 항목에 대해 고유한 항목 암호화 키를 생성하므로 MetaStore는 Most Recent Provider를 위한 안전한 옵션입니다. 항목 암호화 키와 서명 키를 보호하는 래핑 키만 재사용됩니다.

다음 다이어그램은 MetaStore의 구성 요소, 그리고 이러한 구성 요소가 Most Recent Provider와 어떻게 상호 작용하는지를 보여줍니다.

![\[MetaStore\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/most-recent-provider-2.png)


MetaStore는 래핑된 CMP를 생성한 다음 이를 암호화된 형식으로 내부 DynamoDB 테이블에 저장합니다. 파티션 키는 Most Recent Provider 자료의 이름입니다. 정렬 키의 버전 번호입니다. 테이블의 자료는 항목 암호화 도구 및 내부 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)를 포함한 내부 DynamoDB Encryption Client에 의해 보호됩니다.

[Direct KMS Provider](wrapped-provider.md), Wrapped CMP(사용자가 제공하는 암호화 자료 포함) 또는 호환되는 사용자 지정 CMP 등 MetaStore에서 원하는 내부 CMP 유형을 사용할 수 있습니다. MetaStore의 내부 CMP가 Direct KMS Provider인 경우 재사용 가능한 래핑 및 서명 키는 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS)의 [AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)에 따라 보호됩니다. MetaStore는 내부 테이블에 새 CMP 버전을 추가하거나 내부 테이블에서 CMP 버전을 가져올 AWS KMS 때마다를 호출합니다.

### time-to-live 값 설정
<a name="most-recent-provider-ttl"></a>

생성한 각 Most Recent Provider에 대해 time-to-live(TTL) 값을 설정할 수 있습니다. 일반적으로 애플리케이션에 실용적인 가장 낮은 TTL 값을 사용합니다.

Most Recent Provider에 대한 `CachingMostRecentProvider` 기호에서 TTL 값의 사용이 변경되었습니다.

**참고**  
Most Recent Provider에 대한 `MostRecentProvider` 기호는 지원되는 이전 버전의 DynamoDB Encryption Client에서 더 이상 사용되지 않으며 버전 2.0.0에서 제거됩니다. `CachingMostRecentProvider` 기호로 대체됩니다. 가능한 한 빨리 코드를 업데이트하는 것이 좋습니다. 자세한 내용은 [Most Recent Provider 업데이트](#mrp-versions)을 참조하세요.

**`CachingMostRecentProvider`**  
`CachingMostRecentProvider`는 TTL 값은 두 가지 다른 방식으로 사용됩니다.  
+ TTL은 Most Recent Provider가 공급자 스토어에서 CMP의 새 버전을 확인하는 빈도를 결정합니다. 새 버전을 사용할 수 있는 경우 Most Recent Provider는 CMP를 교체하고 암호화 자료를 새로 고칩니다. 그렇지 않으면 현재 CMP 및 암호화 자료를 계속 사용합니다.
+ TTL은 캐시의 CMP를 사용할 수 있는 기간을 결정합니다. Most Recent Provider는 암호화를 위해 캐시된 CMP를 사용하기 전에 캐시에 있는 시간을 평가합니다. CMP 캐시 시간이 TTL을 초과하면 CMP가 캐시에서 제거되고 Most Recent Provider는 해당 공급자 저장소에서 새로운 최신 버전의 CMP를 가져옵니다.

**`MostRecentProvider`**  
`MostRecentProvider`에서 TTL은 Most Recent Provider가 공급자 스토어에서 CMP의 새 버전을 확인하는 빈도를 결정합니다. 새 버전을 사용할 수 있는 경우 Most Recent Provider는 CMP를 교체하고 암호화 자료를 새로 고칩니다. 그렇지 않으면 현재 CMP 및 암호화 자료를 계속 사용합니다.

TTL은 새 CMP 버전이 생성되는 빈도를 결정하지 않습니다. [암호화 자료를 교체하여](#most-recent-provider-rotate) 새로운 CMP 버전을 생성합니다.

이상적인 TTL 값은 애플리케이션과 해당 지연 시간 및 가용성 목표에 따라 다릅니다. TTL이 낮을수록 암호화 자료가 메모리에 저장되는 시간이 줄어들어 보안 프로필이 향상됩니다. 또한 TTL이 낮을수록 중요한 정보가 더 자주 새로 고쳐집니다. 예를 들어 내부 CMP가 [Direct KMS Provider](direct-kms-provider.md)인 경우, 발신자가 여전히 AWS KMS key를 사용할 권한이 있는지 더 자주 확인합니다.

그러나 TTL이 너무 짧은 경우 공급자 스토어를 자주 호출하면 비용이 증가하고 공급자 스토어가 애플리케이션 및 서비스 계정을 공유하는 기타 애플리케이션의 요청을 제한할 수 있습니다. 암호화 자료를 회전하는 속도에 따라 TTL을 조정하면 이점을 얻을 수도 있습니다.

테스트하는 동안 애플리케이션과 보안 및 성능 표준에 적합한 구성을 찾을 때까지 다양한 작업 부하에 따라 TTL과 캐시 크기를 다양하게 변경합니다.

### 암호화 자료 교체
<a name="most-recent-provider-rotate"></a>

Most Recent Provider는 암호화 자료가 필요할 때 항상 자신이 알고 있는 CMP의 최신 버전을 사용합니다. 최신 버전을 확인하는 빈도는 가장 Most Recent Provider를 구성할 때 설정한 [time-to-live](#most-recent-provider-ttl)(TTL) 값에 따라 결정됩니다.

TTL이 만료되면 Most Recent Provider는 공급자 저장소에서 최신 버전의 CMP를 확인합니다. 사용 가능한 CMP가 있는 경우 Most Recent Provider는 이를 가져와 캐시의 CMP를 교체합니다. 공급자 스토어에 최신 버전이 있다는 것을 발견할 때까지 이 CMP와 해당 암호화 자료를 사용합니다.

공급자 스토어에 Most Recent Provider로 새 CMP 버전을 만들도록 알리려면 Most Recent Provider의 자료 이름을 사용하여 공급자 스토어의 새 공급자 만들기 작업을 호출합니다. 공급자 스토어는 새 CMP를 생성하고 더 높은 버전 번호로 내부 스토어에 암호화된 복사본을 저장합니다. (CMP도 반환하지만 삭제할 수 있습니다.) 결과적으로 Most Recent Provider는 다음 번에 공급자 스토어에 CMP의 최대 버전 번호를 쿼리할 때 더 큰 새로운 버전 번호를 얻고 이를 저장소에 대한 후속 요청에 사용하여 CMP의 새 버전이 생성되었는지 확인합니다.

시간, 처리된 항목이나 속성의 수, 애플리케이션에 적합한 기타 지표를 기준으로 새 공급자 생성 호출을 예약할 수 있습니다.

### 암호화 자료 가져오기
<a name="most-recent-provider-encrypt"></a>

Most Recent Provider는 이 다이어그램에 표시된 다음과 같은 프로세스를 통해 항목 암호화 도구로 반환되는 암호화 자료를 가져옵니다. 출력은 공급자 스토어가 반환하는 CMP 유형에 따라 달라집니다. Most Recent Provider는 DynamoDB Encryption Client에 포함된 MetaStore를 포함하여 호환되는 모든 공급자 스토어를 사용할 수 있습니다.

![\[DynamoDB Encryption Client에서 Most Recent Provider의 입력, 처리 및 출력\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/most-recent-provider-provider-store.png)


[`CachingMostRecentProvider` 기호](#mrp-versions)를 사용하여 Most Recent Provider를 생성할 때 공급자 스토어, Most Recent Provider의 이름 및 [time-to-live](#most-recent-provider-ttl)(TTL) 값을 지정합니다. 캐시에 존재할 수 있는 암호화 자료의 최대 수를 결정하는 캐시 크기를 선택적으로 지정할 수도 있습니다.

이 항목이 Most Recent Provider에 암호화 자료를 요청하면 Most Recent Provider는 캐시에서 CMP의 최신 버전을 검색하는 것부터 시작합니다.
+ 캐시에서 최신 버전의 CMP를 찾았고 CMP가 TTL 값을 초과하지 않은 경우 Most Recent Provider는 CMP를 사용하여 암호화 자료를 생성합니다. 그런 다음 암호화 자료를 항목 암호화 도구에 반환합니다. 이 작업에는 공급자 스토어를 호출할 필요가 없습니다.
+ 최신 버전의 CMP가 캐시에 없거나 캐시에 있지만 TTL 값을 초과한 경우 Most Recent Provider는 공급자 스토어에서 CMP를 요청합니다. 요청에는 Most Recent Provider 자료 이름과 알고 있는 최대 버전 번호가 포함됩니다.

  1. 공급자 스토어는 영구 스토리지에서 CMP를 반환합니다. 공급자 스토어가 MetaStore인 경우 가장 최근 공급자 자료 이름을 파티션 키로 사용하고, 버전 번호를 정렬 키로 사용하여 내부 DynamoDB 테이블에서 암호화되고 래핑된 CMP를 가져옵니다. MetaStore는 내부 항목 암호화 도구와 내부 CMP를 사용하여 래핑된 CMP를 복호화합니다. 그런 다음 일반 텍스트 CMP를 Most Recent Provider에 반환합니다. 내부 CMP가 [Direct KMS Provider](direct-kms-provider.md)이면 이 단계에는 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS)에 대한 호출이 포함됩니다.

  1. CMP 는 `amzn-ddb-meta-id` 필드를 [실제 자료 설명](DDBEC-legacy-concepts.md#legacy-material-description)에 추가합니다. 해당 값은 내부 테이블에 있는 CMP의 자료 이름과 버전입니다. 공급자 스토어는 CMP를 Most Recent Provider에게 반환합니다.

  1. Most Recent Provider는 CMP를 메모리에 캐시합니다.

  1. Most Recent Provider는 CMP를 사용하여 암호화 자료를 생성합니다. 그런 다음 암호화 자료를 항목 암호화 도구에 반환합니다.

### 복호화 자료 가져오기
<a name="most-recent-provider-decrypt"></a>

항목 암호화 도구가 Most Recent Provider에 복호화 자료를 요청하는 경우 Most Recent Provider는 다음 프로세스를 사용하여 이러한 자료를 가져와서 반환합니다.

1. Most Recent Provider는 공급자 스토어에 항목을 암호화하는 데 사용되었던 암호화 자료의 버전 번호를 요청합니다. Most Recent Provider는 항목의 [자료 설명 속성](DDBEC-legacy-concepts.md#legacy-material-description)에서 실제 자료 설명을 전달합니다.

1. 공급자 스토어는 실제 자료 설명의 `amzn-ddb-meta-id` 필드에서 암호화 CMP 버전 번호를 가져와서 Most Recent Provider로 반환합니다.

1. Most Recent Provider는 항목을 암호화 및 서명하는 데 사용되었던 CMP 버전을 캐시에서 검색합니다.
+ CMP의 일치하는 버전이 캐시에 있고 CMP가 [time-to-live(TTL) 값](#most-recent-provider-ttl)을 초과하지 않은 경우 Most Recent Provider는 CMP를 사용하여 복호화 자료를 생성합니다. 그런 다음 복호화 자료를 항목 암호화 도구에 반환합니다. 이 작업에는 공급자 스토어나 다른 CMP에 대한 호출이 필요하지 않습니다.
+ CMP의 일치하는 버전이 캐시에 없거나 캐시된 AWS KMS key 이 TTL 값을 초과한 경우 Most Recent Provider는 공급자 스토어에서 CMP를 요청합니다. 요청에 자료 이름과 암호화 CMP 버전 번호를 보냅니다.

  1. 공급자 스토어는 Most Recent Provider 이름을 파티션 키로 사용하고 버전 번호를 정렬 키로 사용하여 CMP에 대한 영구 스토리지를 검색합니다.
     + 이름과 버전 번호가 영구 스토리지에 없으면 공급자 스토어에서 예외가 발생합니다. 공급자 스토어를 사용하여 CMP를 생성한 경우 의도적으로 삭제하지 않는 한 CMP는 영구 스토리지에 저장되어야 합니다.
     + CMP와 해당 이름 및 버전 번호가 공급자 스토어의 영구 스토리지 안에 있으면 공급자 스토어가 지정된 CMP를 Most Recent Provider로 반환합니다.

       공급자 스토어가 MetaStore인 경우 DynamoDB 테이블에서 암호화된 CMP를 가져옵니다. 그런 다음 CMP를 Most Recent Provider로 반환하기 전에 내부 CMP의 암호화 자료를 사용하여 암호화된 CMP를 복호화합니다. 내부 CMP가 [Direct KMS Provider](direct-kms-provider.md)이면 이 단계에는 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS)에 대한 호출이 포함됩니다.

  1. Most Recent Provider는 CMP를 메모리에 캐시합니다.

  1. Most Recent Provider는 CMP를 사용하여 복호화 자료를 생성합니다. 그런 다음 복호화 자료를 항목 암호화 도구에 반환합니다.

## Most Recent Provider 업데이트
<a name="mrp-versions"></a>

Most Recent Provider의 기호가 `MostRecentProvider`에서 `CachingMostRecentProvider`로 변경되었습니다.

**참고**  
Most Recent Provider를 나타내는 `MostRecentProvider` 기호는 Java용 DynamoDB Encryption Client 버전 1.15 및 Python용 DynamoDB Encryption Client 버전 1.3에서 더 이상 사용되지 않으며 두 언어 구현 모두의 DynamoDB Encryption Client 버전 2.0.0에서 제거됩니다. 그 대신 `CachingMostRecentProvider`을 사용합니다.

`CachingMostRecentProvider`에서는 다음 변경 사항을 구현합니다.
+ `CachingMostRecentProvider`는 메모리 내 시간이 구성된 [time-to-live(TTL) 값](#most-recent-provider-ttl)을 초과하는 경우 메모리에서 암호화 자료를 주기적으로 제거합니다.

  `MostRecentProvider`는 프로세스 수명 동안 암호화 자료를 메모리에 저장할 수 있습니다. 결과적으로 Most Recent Provider는 인증 변경 사항을 인식하지 못할 수도 있습니다. 호출자의 암호화 키 사용 권한이 취소된 후 암호화 키를 사용할 수 있습니다.

  이 새 버전으로 업데이트할 수 없는 경우 주기적으로 캐시에서 `clear()` 방법를 호출하면 비슷한 효과를 얻을 수 있습니다. 이 방법를 사용하면 캐시 콘텐츠를 수동으로 플러시하고 Most Recent Provider가 새 CMP 및 새 암호화 자료를 요청해야 합니다.
+ 또한 `CachingMostRecentProvider`에는 캐시를 더 효과적으로 제어할 수 있는 캐시 크기 설정도 포함되어 있습니다.

`CachingMostRecentProvider`로 업데이트하려면 코드에서 기호 이름을 변경해야 합니다. 다른 모든 측면에서 `CachingMostRecentProvider`는 `MostRecentProvider`와 완전히 역호환됩니다. 테이블 항목을 다시 암호화할 필요가 없습니다.

그러나 `CachingMostRecentProvider`는 기본 키 인프라에 대한 더 많은 호출을 생성합니다. 각 time-to-live(TTL) 간격마다 공급자 스토어를 한 번 이상 호출합니다. 활성 CMP가 많은 애플리케이션(빈번한 교체로 인해) 또는 대규모 플릿이 있는 애플리케이션은 이러한 변화에 민감할 가능성이 높습니다.

업데이트된 코드를 릴리스하기 전에 철저히 테스트하여 더 빈번한 호출로 인해 애플리케이션이 손상되거나 AWS Key Management Service (AWS KMS) 또는 Amazon DynamoDB와 같이 공급자가 의존하는 서비스에 의한 제한이 발생하지 않는지 확인합니다. 성능 문제를 완화하려면 관찰한 성능 특성에 따라 캐시 크기와 `CachingMostRecentProvider`의 수명을 조정합니다. 자세한 지침은 [time-to-live 값 설정](#most-recent-provider-ttl)을 참조하세요.

# Static Materials Provider
<a name="static-provider"></a>

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

*Static Materials Provider*(정적 CMP)는 테스트, 개념 증명 데모 및 레거시 호환성을 위한 매우 간단한 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP)입니다.

Static CMP를 사용하여 테이블 항목을 암호화하려면 [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)(AES) 대칭 암호화 키 및 서명 키 또는 키 페어를 제공합니다. 암호화된 항목을 복호화하려면 동일한 키를 제공해야 합니다. 정적 CMP는 어떠한 암호화 작업도 수행하지 않습니다. 대신, 사용자가 제공한 암호화 키를 항목 암호화 도구에 변경되지 않은 상태로 전달합니다. 항목 암호화 도구는 암호화 키 바로 아래에 있는 항목을 암호화합니다. 그런 다음 서명 키를 직접 사용하여 서명합니다.

정적 CMP는 고유한 암호화 자료를 생성하지 않기 때문에 처리하는 모든 테이블 항목은 동일한 암호화 키로 암호화되고 동일한 서명 키로 서명됩니다. 동일한 키를 사용하여 수많은 항목의 속성 값을 암호화하거나 동일한 키 또는 키 페어를 사용하여 모든 항목에 서명하면 키의 암호화 제한을 초과할 위험이 있습니다.

**참고**  
Java 라이브러리의 [Asymmetric Static Provider](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html)는 Static Provider가 아닙니다. 단순히 [Wrapped CMP](wrapped-provider.md)에 대한 대체 생성자를 제공할 뿐입니다. 프로덕션 환경에서는 안전하지만 가능하면 래핑된 CMP를 직접 사용해야 합니다.

정적 CMP는 DynamoDB Encryption Client가 지원하는 여러 [암호화 자료 공급자](DDBEC-legacy-concepts.md#concept-material-provider)(CMP) 중 하나입니다. 기타 CMP에 대한 자세한 내용은 [암호화 자료 공급자](crypto-materials-providers.md) 섹션을 참조하세요.

**예제 코드는 다음을 참조하십시오.**
+ Java: [SymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java)

**Topics**
+ [사용 방법](#static-cmp-how-to-use)
+ [작동 방식](#static-cmp-how-it-works)

## 사용 방법
<a name="static-cmp-how-to-use"></a>

정적 공급자를 생성하려면 암호화 키 또는 키 페어와 서명 키 또는 키 페어를 제공합니다. 테이블 항목을 암호화하고 복호화하려면 키 자료를 제공해야 합니다.

------
#### [ Java ]

```
// To encrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Signing key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);

// To decrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Verification key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);
```

------
#### [ Python ]

```
# You can provide encryption materials, decryption materials, or both
encrypt_keys = EncryptionMaterials(
    encryption_key = ...,
    signing_key = ...
)

decrypt_keys = DecryptionMaterials(
    decryption_key = ...,
    verification_key = ...
)

static_cmp = StaticCryptographicMaterialsProvider(
    encryption_materials=encrypt_keys
    decryption_materials=decrypt_keys
)
```

------

## 작동 방식
<a name="static-cmp-how-it-works"></a>

정적 공급자는 항목 암호화 도구에 제공하는 암호화 및 서명 키를 전달합니다(암호화 및 서명 키가 테이블 항목을 암호화 및 서명하는 데 직접 사용된 경우). 각 항목에 대해 다른 키를 제공하지 않는 한 모든 항목에 동일한 키가 사용됩니다.

![\[DynamoDB Encryption Client에서 Static Materials Provider의 입력, 처리 및 출력\]](http://docs.aws.amazon.com/ko_kr/database-encryption-sdk/latest/devguide/images/staticCMP.png)


### 암호화 자료 가져오기
<a name="static-cmp-get-encryption-materials"></a>

이 단원에서는 암호화 자료 요청 수신 시 Static Materials Provider(정적 CMP)의 입력, 출력 및 처리에 대해 자세히 설명합니다.

**입력**(애플리케이션에서)
+ 암호화 키 –[ Advanced Encryption Standard](https://tools.ietf.org/html/rfc3394.html)(AES) 키와 같은 대칭 키여야 합니다.
+ 서명 키 – 대칭 키 또는 비대칭 키 페어일 수 있습니다.

**입력**(항목 암호화 도구에서)
+ [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)

**출력**(항목 암호화 도구로)
+ 암호화 키가 입력으로 전달되었습니다.
+ 서명 키가 입력으로 전달되었습니다.
+ 실제 자료 설명: 변경되지 않은 [요청한 자료 설명](DDBEC-legacy-concepts.md#legacy-material-description)(있는 경우).

### 복호화 자료 가져오기
<a name="static-cmp-get-decryption-materials"></a>

이 단원에서는 복호화 자료 요청 수신 시 Static Materials Provider(정적 CMP)의 입력, 출력 및 처리에 대해 자세히 설명합니다.

암호화 자료를 가져오는 방법과 복호화 자료를 가져오는 방법이 별도로 포함되어 있지만 동작은 동일합니다.

**입력**(애플리케이션에서)
+ 암호화 키 –[ Advanced Encryption Standard](https://tools.ietf.org/html/rfc3394.html)(AES) 키와 같은 대칭 키여야 합니다.
+ 서명 키 – 대칭 키 또는 비대칭 키 페어일 수 있습니다.

**입력**(항목 암호화 도구에서)
+ [DynamoDB 암호화 컨텍스트](concepts.md#encryption-context)(사용되지 않음)

**출력**(항목 암호화 도구로)
+ 암호화 키가 입력으로 전달되었습니다.
+ 서명 키가 입력으로 전달되었습니다.