

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

# 활성 브랜치 키 생성
<a name="create-branch-keys"></a>

*브랜치 키*는 AWS KMS 계층적 키링 AWS KMS key 이 호출 수를 줄이는 데 사용하는에서 파생된 데이터 키입니다 AWS KMS. *활성* 브랜치 키는 최신 버전의 브랜치 키입니다. 계층적 키링은 모든 암호화 요청에 대해 고유한 데이터 키를 생성하고 활성 브랜치 키에서 파생된 고유한 래핑 키로 각 데이터 키를 암호화합니다.

새 활성 브랜치 키를 생성하려면 키 스토어 작업을 [정적으로 구성](keystore-actions.md#static-keystore)해야 합니다. `CreateKey`는 키 스토어 작업 구성에 지정된 KMS 키 ARN을 키 스토어 허용 목록에 추가하는 권한 있는 작업입니다. 그런 다음 KMS 키를 사용하여 새 활성 브랜치 키를 생성합니다. KMS 키가 키 스토어에 추가되면 삭제할 수 없으므로이 작업에 대한 액세스를 제한하는 것이 좋습니다.

애플리케이션 컨트롤 플레인의 KeyStore Admin 인터페이스를 통해 `CreateKey` 작업을 사용하는 것이 좋습니다. 이 접근 방식은 키 관리 모범 사례에 부합합니다.

데이터 영역에 브랜치 키를 생성하지 마십시오. 이 방법은 다음과 같은 결과를 초래할 수 있습니다.
+ 에 대한 불필요한 호출 AWS KMS
+ 동시성이 높은 환경에서 AWS KMS 에 대한 여러 동시 호출
+ 백업 DynamoDB 테이블에 대한 여러 TransactWriteItems 호출입니다.

`CreateKey` 작업에는 기존 브랜치 키를 덮어쓰지 않도록 `TransactWriteItems` 호출에 조건 확인이 포함됩니다. 그러나 데이터 영역에서 키를 생성해도 리소스 사용량이 비효율적이고 잠재적인 성능 문제가 발생할 수 있습니다.

키 스토어에서 KMS 키 하나를 허용 목록에 추가하거나 키 스토어 작업 구성에서 지정한 KMS 키 ARN을 업데이트하고를 `CreateKey` 다시 호출하여 여러 KMS 키를 허용 목록에 추가할 수 있습니다. 여러 KMS 키를 허용 목록으로 표시하는 경우 키 스토어 사용자는 액세스 권한이 있는 키 스토어에서 허용 목록으로 지정된 키를 사용할 수 있도록 검색을 위해 키 스토어 작업을 구성해야 합니다. 자세한 내용은 [키 스토어 작업 구성](keystore-actions.md) 단원을 참조하십시오.

**필요한 권한**  
브랜치 키를 생성하려면 키 스토어 작업에 지정된 KMS 키에 대한 [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html) 및 [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) 권한이 필요합니다.

**브랜치 키 생성**  
다음 작업은 키 [스토어 작업 구성에서 지정한](keystore-actions.md#static-keystore) KMS 키를 사용하여 새 활성 브랜치 키를 생성하고 키 스토어 역할을 하는 DynamoDB 테이블에 활성 브랜치 키를 추가합니다.

`CreateKey`를 호출할 때 다음과 같은 선택적 값을 지정하도록 선택할 수 있습니다.
+ `branchKeyIdentifier`: 사용자 지정 `branch-key-id`를 정의합니다.

  사용자 지정 `branch-key-id`를 만들려면 `encryptionContext` 파라미터에 추가 암호화 컨텍스트도 포함해야 합니다.
+ `encryptionContext`: [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html) 호출에 포함된 암호화 컨텍스트에서 추가 인증 데이터(AAD)를 제공하는 선택적 비보안 키-값 페어 세트를 정의합니다.

  이 추가 암호화 컨텍스트는 `aws-crypto-ec:` 접두사와 표시됩니다.

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

```
final Map<String, String> additionalEncryptionContext = Collections.singletonMap("Additional Encryption Context for",
	         "custom branch key id");
	             
	 final String BranchKey = keystore.CreateKey(
	         CreateKeyInput.builder()
	                 .branchKeyIdentifier(custom-branch-key-id) //OPTIONAL
	                 .encryptionContext(additionalEncryptionContext) //OPTIONAL              
	                 .build()).branchKeyIdentifier();
```

------
#### [ C\$1 / .NET ]

```
var additionalEncryptionContext = new Dictionary<string, string>();
	 additionalEncryptionContext.Add("Additional Encryption Context for", "custom branch key id");
	         
	 var branchKeyId = keystore.CreateKey(new CreateKeyInput
	 {
	     BranchKeyIdentifier = "custom-branch-key-id", // OPTIONAL
	     EncryptionContext = additionalEncryptionContext // OPTIONAL
	 });
```

------
#### [ Rust ]

```
let additional_encryption_context = HashMap::from([
    ("Additional Encryption Context for".to_string(), "custom branch key id".to_string())
]);

let branch_key_id = keystore.create_key()
    .branch_key_identifier("custom-branch-key-id") // OPTIONAL
    .encryption_context(additional_encryption_context) // OPTIONAL
    .send()
    .await?
    .branch_key_identifier
    .unwrap();
```

------

먼저, `CreateKey` 작업은 다음 값을 생성합니다.
+ `branch-key-id`의 버전 4 [Universally Unique Identifier](https://www.ietf.org/rfc/rfc4122.txt)(UUID)(사용자 지정 `branch-key-id`를 지정하지 않은 경우).
+ 브랜치 키 버전의 버전 4 UUID
+ 협정 세계시(UTC)의 [ISO 8601 날짜 및 시간 형식](https://www.iso.org/iso-8601-date-and-time-format.html)의 `timestamp`.

그런 다음 `CreateKey` 작업은 다음 요청을 사용하여 [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)를 호출합니다.

```
{
	    "EncryptionContext": { 
	       "branch-key-id" : "branch-key-id",
	       "type" : "type",
	       "create-time" : "timestamp",
	       "tablename" : "the logical table name for your key store",
	       "kms-arn" : the KMS key ARN,
	       "hierarchy-version" : "1",
	       "aws-crypto-ec:contextKey": "contextValue"
	    },
	    "KeyId": "the KMS key ARN you specified in your key store actions",
	    "NumberOfBytes": "32"
	 }
```

**참고**  
데이터베이스를 [검색 가능한 암호화](searchable-encryption.md)로 구성하지 않았더라도 `CreateKey` 작업을 수행하면 활성 브랜치 키와 비컨 키가 생성됩니다. 두 키 모두 키 스토어에 저장됩니다. 자세한 내용은 검색 가능한 암호화를 위한 [계층적 키링 사용](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings)을 참조하세요.

다음으로 `CreateKey` 작업은 [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/AAPI_ReEncrypt.html)를 호출하여 암호화 컨텍스트를 업데이트하고 브랜치 키에 대한 활성 레코드를 생성합니다.

마지막으로 `CreateKey` 작업은 [ddb:TransactWriteItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html)를 호출하여 **2단계**에서 생성한 테이블의 브랜치 키를 유지할 새 항목을 작성합니다. 항목에는 다음 속성이 있습니다.

```
{
	     "branch-key-id" : branch-key-id,
	     "type" : "branch:ACTIVE",
	     "enc" : the branch key returned by the GenerateDataKeyWithoutPlaintext call,
	     "version": "branch:version:the branch key version UUID",
	     "create-time" : "timestamp",
	     "kms-arn" : "the KMS key ARN you specified in Step 1",
	     "hierarchy-version" : "1",
	     "aws-crypto-ec:contextKey": "contextValue"
 }
```