

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

# AWS CloudHSM 클라이언트 SDK 3에 지원되는 Java 키 속성
<a name="java-lib-attributes"></a>

이 주제에서는 Java 라이브러리 버전 3.1의 독점 확장을 사용하여 AWS CloudHSM 클라이언트 SDK 3의 키 속성을 설정하는 방법을 설명합니다. 이 확장을 사용하여 다음 작업 중에 지원되는 키 속성 및 해당 값을 설정할 수 있습니다:
+ 키 생성
+ 키 가져오기
+ 키 언래핑

**참고**  
사용자 지정 키 속성을 설정하기 위한 확장은 선택적 기능입니다. Java 라이브러리 버전 3.0에서 작동하는 코드가 이미 있으면 해당 코드를 수정할 필요가 없습니다. 사용자가 만든 키는 이전과 동일한 속성을 계속 포함합니다.

**Topics**
+ [속성 이해](#java-understanding-attributes)
+ [지원되는 속성](#java-attributes)
+ [키에 대한 속성 설정](#java-setting-attributes)
+ [모두 통합](#java-attributes-summary)

## 속성 이해
<a name="java-understanding-attributes"></a>

키 속성을 사용하여 공개 키, 개인 키 또는 보안 키를 포함하여 키 객체에 허용되는 작업을 지정합니다. 키 객체 생성 작업 중에 키 속성과 값을 정의합니다.

그러나 자바 암호화 확장 (JCE)는 키 속성에 대한 값을 설정하는 방법을 지정하지 않으므로 대부분의 작업이 기본적으로 허용되었습니다. 이와 반대로 PKCS\$1 11 표준은 더 제한적인 기본값을 가진 포괄적인 속성 집합을 정의합니다. Java 라이브러리 버전 3.1부터 CloudHSM은 일반적으로 사용되는 속성에 대해 보다 제한적인 값을 설정할 수 있는 독점적 확장을 제공합니다.

## 지원되는 속성
<a name="java-attributes"></a>

아래 표에 나열된 속성에 대한 값을 설정할 수 있습니다. 제한적으로 만들려는 속성의 값만 설정하는 것이 좋습니다. 값을 지정하지 않으면 CloudHSM은 아래 표에 지정된 기본값을 사용합니다. 기본값 열의 빈 셀은 속성에 할당된 특정 기본값이 없음을 나타냅니다.


****  

| 속성 | 기본 값 | 참고 | 
| --- | --- | --- | 
|  | 대칭 키 | 키 페어의 공개 키 | 키 페어의 개인 키 |  | 
| CKA\$1TOKEN | FALSE | FALSE | FALSE | 클러스터의 모든 HSM에 복제되고 백업에 포함된 영구 키입니다. CKA\$1TOKEN = FALSE는 HSM 하나에만 로드되고 HSM에 대한 연결이 끊어지면 자동으로 지워지는 세션 키를 의미합니다. | 
| CKA\$1LABEL |   |  |  | 사용자 정의 문자열입니다. 이를 통해 HSM에서 키를 편리하게 식별할 수 있습니다. | 
| CKA\$1EXTRACTABLE | TRUE |  | TRUE | True는 이 키를 HSM에서 내보낼 수 있음을 나타냅니다. | 
| CKA\$1ENCRYPT | TRUE | TRUE |  | True는 키를 사용하여 버퍼를 암호화할 수 있음을 나타냅니다. | 
| CKA\$1DECRYPT | TRUE |  | TRUE | True는 키를 사용하여 버퍼의 암호를 해독할 수 있음을 나타냅니다. 일반적으로 CKA\$1WRAP이 true로 설정된 키의 경우 FALSE로 설정됩니다. | 
| CKA\$1WRAP | TRUE | TRUE |  | True는 키를 사용하여 다른 키를 래핑할 수 있음을 나타냅니다. 일반적으로 개인 키의 경우 FALSE로 설정됩니다. | 
| CKA\$1UNWRAP | TRUE |  | TRUE | True는 키를 사용하여 다른 키를 언래핑(가져오기)할 수 있음을 나타냅니다. | 
| CKA\$1SIGN | TRUE |  | TRUE | True는 키를 사용하여 메시지 다이제스트에 서명할 수 있음을 나타냅니다. 일반적으로 아카이브 완료된 개인 키와 공개 키의 경우 FALSE로 설정됩니다. | 
| CKA\$1VERIFY | TRUE | TRUE |  | True는 키를 사용하여 서명을 확인할 수 있음을 나타냅니다. 일반적으로 개인 키의 경우 FALSE로 설정됩니다. | 
| CKA\$1PRIVATE | TRUE | TRUE | TRUE | True는 사용자가 인증될 때까지 사용자가 키에 액세스할 수 없음을 나타냅니다. 이해를 돕기 위해 설명하자면 사용자는 인증될 때까지 CloudHSM의 키에 액세스할 수 없습니다. 이 속성이 FALSE로 설정되는 경우에도 마찬가지입니다. | 

**참고**  
PKCS \$111 라이브러리의 속성에 대한 광범위한 지원을 받을 수 있습니다. 자세한 내용은 [지원되는 PKCS \$111 속성](pkcs11-attributes.md)을 참조하십시오.

## 키에 대한 속성 설정
<a name="java-setting-attributes"></a>

`CloudHsmKeyAttributesMap`은 [Java Map](https://devdocs.io/openjdk~8/java/util/map)과 유사한 객체로, 키 객체에 대한 속성 값을 설정하는 데 사용할 수 있습니다. `CloudHsmKeyAttributesMap` 함수에 대한 메서드는 Java Map 조작에 사용되는 메서드와 비슷합니다.

속성에 대한 사용자 지정 값을 설정하기 위해 다음 두 가지 옵션이 제공됩니다.
+ 다음 표에 나열된 메서드 사용
+ 이 문서 뒷부분에 설명된 빌더 패턴 사용

속성 맵 객체는 속성을 설정하기 위한 다음과 같은 메서드를 지원합니다:


****  

| 연산 | 반환 값 | `CloudHSMKeyAttributesMap` 메서드 | 
| --- | --- | --- | 
| 기존 키에 대한 키 속성 값 가져오기 | 객체(값 포함) 또는 null |  **get**(keyAttribute)  | 
| 키 속성 하나의 값 채우기  | 키 속성과 연결된 이전 값 또는 키 속성에 대한 매핑이 없는 경우에는 null |  **put**(keyAttribute, 값)  | 
| 여러 키 속성에 대한 값 채우기 | 해당 사항 없음 |  **putAll**(keyAttributesMap)  | 
| 속성 맵에서 키-값 페어 제거 |  키 속성과 연결된 이전 값 또는 키 속성에 대한 매핑이 없는 경우에는 *null*  |  **remove**(keyAttribute)  | 

**참고**  
명시적으로 지정하지 않은 속성은 [지원되는 속성](#java-attributes)의 이전 표에 나열된 기본값으로 설정됩니다.

### 빌더 패턴 예시
<a name="java-setting-attributes-builder-example"></a>

개발자는 일반적으로 빌더 패턴을 통해 더 편리하게 클래스를 활용합니다. 예를 들면 다음과 같습니다.

```
import com.amazonaws.cloudhsm.CloudHsmKeyAttributes;
import com.amazonaws.cloudhsm.CloudHsmKeyAttributesMap;
import com.amazonaws.cloudhsm.CloudHsmKeyPairAttributesMap;

CloudHsmKeyAttributesMap keyAttributesSessionDecryptionKey = 
   new CloudHsmKeyAttributesMap.Builder()
      .put(CloudHsmKeyAttributes.CKA_LABEL, "ExtractableSessionKeyEncryptDecrypt")
      .put(CloudHsmKeyAttributes.CKA_WRAP, false)
      .put(CloudHsmKeyAttributes.CKA_UNWRAP, false)
      .put(CloudHsmKeyAttributes.CKA_SIGN, false)
      .put(CloudHsmKeyAttributes.CKA_VERIFY, false)
      .build();

CloudHsmKeyAttributesMap keyAttributesTokenWrappingKey = 
   new CloudHsmKeyAttributesMap.Builder()
      .put(CloudHsmKeyAttributes.CKA_LABEL, "TokenWrappingKey")
      .put(CloudHsmKeyAttributes.CKA_TOKEN, true)
      .put(CloudHsmKeyAttributes.CKA_ENCRYPT, false)
      .put(CloudHsmKeyAttributes.CKA_DECRYPT, false)
      .put(CloudHsmKeyAttributes.CKA_SIGN, false)
      .put(CloudHsmKeyAttributes.CKA_VERIFY, false)
      .build();
```

개발자는 사전 정의된 속성 집합을 키 템플릿에서 모범 사례를 적용하는 편리한 방법으로 활용할 수도 있습니다. 예를 들면 다음과 같습니다.

```
//best practice template for wrapping keys

CloudHsmKeyAttributesMap commonKeyAttrs = new CloudHsmKeyAttributesMap.Builder()
    .put(CloudHsmKeyAttributes.CKA_EXTRACTABLE, false)
    .put(CloudHsmKeyAttributes.CKA_DECRYPT, false)
    .build();

// initialize a new instance of CloudHsmKeyAttributesMap by copying commonKeyAttrs
// but with an appropriate label

CloudHsmKeyAttributesMap firstKeyAttrs = new CloudHsmKeyAttributesMap(commonKeyAttrs);
firstKeyAttrs.put(CloudHsmKeyAttributes.CKA_LABEL, "key label");

// alternatively, putAll() will overwrite existing values to enforce conformance

CloudHsmKeyAttributesMap secondKeyAttrs = new CloudHsmKeyAttributesMap();
secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_DECRYPT, true);
secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_ENCRYPT, true);
secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_LABEL, “safe wrapping key”);
secondKeyAttrs.putAll(commonKeyAttrs); // will overwrite CKA_DECRYPT to be FALSE
```

### 키 페어에 대한 속성 설정
<a name="java-setting-attributes-key-pair"></a>

Java 클래스 `CloudHsmKeyPairAttributesMap`을 사용하여 키 페어에 대한 키 속성을 처리합니다. `CloudHsmKeyPairAttributesMap`은 두 개의 `CloudHsmKeyAttributesMap` 객체를 캡슐화합니다. 하나는 퍼블릭 키용이고 다른 하나는 개인 키용입니다.

퍼블릭 키와 개인 키에 대해 별도로 개별 속성을 설정하려면 키의 해당하는 `CloudHsmKeyAttributes` 맵 객체에 `put()` 메서드를 사용하면 됩니다. `getPublic()` 메서드를 사용하여 공개 키에 대한 속성 맵을 검색하고 `getPrivate()`을 사용하여 개인 키에 대한 속성 맵을 검색합니다. 키 페어 속성 맵에 `putAll()`을 인수로 사용하여 퍼블릭 및 개인 키 페어에 대한 여러 키 속성 값을 함께 채웁니다.

### 빌더 패턴 예시
<a name="java-setting-attributes-key-pair-builder-example"></a>

개발자는 일반적으로 빌더 패턴을 통해 더 편리하게 키 속성을 설정합니다. 예제:

```
import com.amazonaws.cloudhsm.CloudHsmKeyAttributes;
import com.amazonaws.cloudhsm.CloudHsmKeyAttributesMap;
import com.amazonaws.cloudhsm.CloudHsmKeyPairAttributesMap;

//specify attributes up-front 
CloudHsmKeyAttributesMap keyAttributes = 
    new CloudHsmKeyAttributesMap.Builder()
        .put(CloudHsmKeyAttributes.CKA_SIGN, false)
        .put(CloudHsmKeyAttributes.CKA_LABEL, "PublicCertSerial12345")
        .build();

CloudHsmKeyPairAttributesMap keyPairAttributes =
    new CloudHsmKeyPairAttributesMap.Builder()
        .withPublic(keyAttributes)
        .withPrivate(
            new CloudHsmKeyAttributesMap.Builder() //or specify them inline 
                .put(CloudHsmKeyAttributes.CKA_LABEL, "PrivateCertSerial12345")
                .put (CloudHSMKeyAttributes.CKA_WRAP, FALSE)
                .build()
        )
        .build();
```

**참고**  
이 독점적 확장에 대한 자세한 내용은 GitHub의 [Javadoc](https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/Docs/CloudHsm_CustomKeyAttributes_Javadoc.zip) 아카이브 및 [샘플](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/CustomKeyAttributesRunner.java)을 참조하십시오. Javadoc을 탐색하려면 아카이브를 다운로드하고 확장합니다.

## 모두 통합
<a name="java-attributes-summary"></a>

키 작업을 사용하여 키 속성을 지정하려면 다음 단계를 수행합니다.

1. 대칭 키의 경우 `CloudHsmKeyAttributesMap`을, 키 페어의 경우 `CloudHsmKeyPairAttributesMap`을 인스턴스화합니다.

1. 필수 키 속성 및 값을 사용하여 1단계의 속성 객체를 정의합니다.

1. 특정 키 유형에 해당하는 `Cavium*ParameterSpec` 클래스를 인스턴스화하고 이 구성된 속성 객체를 생성자에게 전달합니다.

1. 이 `Cavium*ParameterSpec` 객체를 해당하는 암호화 클래스 또는 메서드에 전달합니다.

참고로 다음 표에는 사용자 지정 키 속성을 지원하는 `Cavium*ParameterSpec` 클래스 및 메서드가 포함되어 있습니다.


****  

| 키 유형 | 파라미터 사양 클래스 | 예제 생성자 | 
| --- | --- | --- | 
| 기본 클래스 | CaviumKeyGenAlgorithmParameterSpec | CaviumKeyGenAlgorithmParameterSpec(CloudHsmKeyAttributesMap keyAttributesMap) | 
| DES | CaviumDESKeyGenParameterSpec | CaviumDESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap) | 
| RSA | CaviumRSAKeyGenParameterSpec | CaviumRSAKeyGenParameterSpec(int keysize, BigInteger publicExponent, CloudHsmKeyPairAttributesMap keyPairAttributesMap) | 
| Secret | CaviumGenericSecretKeyGenParameterSpec | CaviumGenericSecretKeyGenParameterSpec(int size, CloudHsmKeyAttributesMap keyAttributesMap) | 
| AES | CaviumAESKeyGenParameterSpec | CaviumAESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap) | 
| EC | CaviumECGenParameterSpec | CaviumECGenParameterSpec(String stdName, CloudHsmKeyPairAttributesMap keyPairAttributesMap) | 

### 샘플 코드: 키 생성 및 래핑
<a name="example-generate-wrap-key"></a>

다음 간단한 코드 샘플은 키 생성과 키 래핑의 두 가지 작업 단계를 보여줍니다.

```
// Set up the desired key attributes

KeyGenerator keyGen = KeyGenerator.getInstance("AES", "Cavium");
CaviumAESKeyGenParameterSpec keyAttributes = new CaviumAESKeyGenParameterSpec(
    256,
    new CloudHsmKeyAttributesMap.Builder()
        .put(CloudHsmKeyAttributes.CKA_LABEL, "MyPersistentAESKey")
        .put(CloudHsmKeyAttributes.CKA_EXTRACTABLE, true)
        .put(CloudHsmKeyAttributes.CKA_TOKEN, true)
        .build()
);

// Assume we already have a handle to the myWrappingKey
// Assume we already have the wrappedBytes to unwrap

// Unwrap a key using Custom Key Attributes

CaviumUnwrapParameterSpec unwrapSpec = new CaviumUnwrapParameterSpec(myInitializationVector, keyAttributes);

Cipher unwrapCipher = Cipher.getInstance("AESWrap", "Cavium");
unwrapCipher.init(Cipher.UNWRAP_MODE, myWrappingKey, unwrapSpec);
Key unwrappedKey = unwrapCipher.unwrap(wrappedBytes, "AES", Cipher.SECRET_KEY);
```