

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

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

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

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

키 스토어에서 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
	 });
```

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

```
additional_encryption_context = {"Additional Encryption Context for": "custom branch key id"}

branch_key_id: str = keystore.create_key(
    CreateKeyInput(
        branch_key_identifier = "custom-branch-key-id", # OPTIONAL
        encryption_context = additional_encryption_context, # 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();
```

------
#### [ Go ]

```
encryptionContext := map[string]string{
    "Additional Encryption Context for": "custom branch key id",
}

branchKey, err := keyStore.CreateKey(context.Background(), keystoretypes.CreateKeyInput{
    BranchKeyIdentifier: &customBranchKeyId,
    EncryptionContext:   additional_encryption_context,
})
if err != nil {
    return "", err
}
```

------

먼저, `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",
	       "logical-key-store-name" : "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"
	 }
```

다음으로 `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"
 }
```