

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Atribut kunci Java yang didukung untuk AWS CloudHSM Klien SDK 3
<a name="java-lib-attributes"></a>

Topik ini menjelaskan cara menggunakan ekstensi proprietary untuk pustaka Java versi 3.1 untuk menetapkan atribut kunci untuk AWS CloudHSM Client SDK 3. Gunakan ekstensi ini untuk mengatur atribut kunci yang didukung dan nilai-nilainya selama operasi ini:
+ Pembuatan kunci
+ Impor kunci
+ Buka kunci

**catatan**  
Ekstensi untuk menetapkan atribut kunci kustom adalah fitur opsional. Jika Anda sudah memiliki kode yang berfungsi di pustaka Java versi 3.0, Anda tidak perlu memodifikasi kode itu. Kunci yang Anda buat akan terus berisi atribut yang sama seperti sebelumnya. 

**Topics**
+ [Memahami atribut](#java-understanding-attributes)
+ [Atribut yang didukung](#java-attributes)
+ [Menyetel atribut untuk kunci](#java-setting-attributes)
+ [Menyatukan semuanya](#java-attributes-summary)

## Memahami atribut
<a name="java-understanding-attributes"></a>

Anda menggunakan atribut kunci untuk menentukan tindakan apa yang diizinkan pada objek kunci, termasuk kunci publik, pribadi atau rahasia. Anda menentukan atribut kunci dan nilai-nilai selama operasi pembuatan objek kunci. 

Namun, Java Cryptography Extension (JCE) tidak menentukan bagaimana Anda harus menetapkan nilai pada atribut kunci, sehingga sebagian besar tindakan diizinkan secara default. Sebaliknya, PKCS \$1 11 standar menentukan satu set lengkap atribut dengan default lebih ketat. Dimulai dengan pustaka Java versi 3.1, CloudHSM menyediakan ekstensi proprietary yang memungkinkan Anda untuk mengatur nilai yang lebih ketat untuk atribut yang umum digunakan. 

## Atribut yang didukung
<a name="java-attributes"></a>

Anda dapat mengatur nilai untuk atribut yang tercantum dalam tabel di bawah ini. Sebagai praktik terbaik, tetapkan hanya nilai untuk atribut yang ingin Anda buat ketat. Jika Anda tidak menentukan nilai, CloudHSM menggunakan nilai default yang ditentukan dalam tabel di bawah ini. Sel kosong di kolom Nilai Default menunjukkan bahwa tidak ada nilai default tertentu yang ditetapkan untuk atribut.


****  

| Atribut | Nilai Default | Catatan | 
| --- | --- | --- | 
|  | Kunci Simetris | Kunci Publik dalam Pasangan Kunci | Kunci Pribadi dalam Pasangan Kunci |  | 
| CKA\$1TOKEN | FALSE | FALSE | FALSE | Kunci permanen yang direplikasi HSMs di semua klaster dan disertakan dalam cadangan. CKA\$1TOKEN = FALSE menyiratkan kunci sesi, yang hanya dimuat ke satu HSM dan secara otomatis dihapus ketika koneksi ke HSM rusak. | 
| CKA\$1LABEL |   |  |  | String yang ditentukan pengguna. Hal ini memungkinkan Anda untuk dengan mudah mengidentifikasi kunci pada HSM Anda.  | 
| CKA\$1EXTRACTABLE | TRUE |  | TRUE | Benar menunjukkan Anda dapat mengekspor kunci ini keluar dari HSM. | 
| CKA\$1ENCRYPT | TRUE | TRUE |  | Benar menunjukkan Anda dapat menggunakan kunci untuk mengenkripsi penyangga apa pun. | 
| CKA\$1DECRYPT | TRUE |  | TRUE | Benar menunjukkan Anda dapat menggunakan kunci untuk mendekripsi penyangga apa pun. Anda umumnya mengatur ini ke FALSE untuk kunci dengan CKA\$1WRAP diatur ke true.  | 
| CKA\$1WRAP | TRUE | TRUE |  | Benar menunjukkan Anda dapat menggunakan kunci untuk membungkus kunci lain. Anda biasanya akan mengatur ini ke FALSE untuk kunci privat. | 
| CKA\$1UNWRAP | TRUE |  | TRUE | Benar menunjukkan Anda dapat menggunakan kunci untuk membungkus kunci lain. | 
| CKA\$1SIGN | TRUE |  | TRUE | Benar menunjukkan Anda dapat menggunakan kunci untuk menandatangani digest pesan. Hal ini umumnya diatur ke FALSE untuk kunci publik dan kunci privat yang telah Anda arsipkan. | 
| CKA\$1VERIFY | TRUE | TRUE |  | Benar menunjukkan Anda dapat menggunakan kunci untuk menandatangani digest pesan. Hal ini umumnya diatur ke FALSE untuk kunci privat. | 
| CKA\$1PRIVATE | TRUE | TRUE | TRUE | Benar menunjukkan bahwa pengguna tidak dapat mengakses kunci sampai pengguna diautentikasi. Untuk kejelasan, pengguna tidak dapat mengakses kunci apa pun di CloudHSM sampai mereka diautentikasi, bahkan jika atribut ini diatur ke FALSE. | 

**catatan**  
Anda mendapatkan dukungan yang lebih luas untuk atribut di pustaka PKCS \$111. Untuk informasi lebih lanjut, lihat [Atribut PKCS \$111 yang Didukung](pkcs11-attributes.md).

## Menyetel atribut untuk kunci
<a name="java-setting-attributes"></a>

`CloudHsmKeyAttributesMap` adalah objek seperti [Peta Java](https://devdocs.io/openjdk~8/java/util/map), yang dapat Anda gunakan untuk mengatur nilai atribut untuk objek kunci. Metode untuk fungsi `CloudHsmKeyAttributesMap` yang mirip dengan metode yang digunakan untuk manipulasi peta Java. 

Untuk mengatur nilai kustom pada atribut, Anda memiliki dua opsi:
+ Gunakan metode yang tercantum dalam tabel berikut
+ Gunakan pola pembangun yang ditunjukkan kemudian dalam dokumen ini

Atribut peta objek mendukung metode berikut untuk mengatur atribut:


****  

| Operasi | Nilai Pengembalian | Metode `CloudHSMKeyAttributesMap` | 
| --- | --- | --- | 
| Dapatkan nilai atribut kunci untuk kunci yang ada | Obyek (berisi nilai) atau nol |  **get**(keyAttribute)  | 
| Isi nilai satu atribut kunci  | Nilai sebelumnya terkait dengan atribut kunci, atau nol jika tidak ada pemetaan untuk atribut kunci |  **put**(keyAttribute, value)  | 
| Isi nilai untuk beberapa atribut kunci | N/A |  **putAll** () keyAttributesMap  | 
| Hapus pasangan nilai kunci dari peta atribut |  Nilai sebelumnya terkait dengan atribut kunci, atau *nol* jika tidak ada pemetaan untuk atribut kunci  |  **remove**(keyAttribute)  | 

**catatan**  
Setiap atribut yang tidak secara eksplisit Anda tentukan diatur ke default yang tercantum dalam tabel sebelumnya di [Atribut yang didukung](#java-attributes). 

### Contoh pola pembangun
<a name="java-setting-attributes-builder-example"></a>

Developer umumnya akan merasa lebih nyaman untuk memanfaatkan kelas melalui pola Builder. Sebagai contoh:

```
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();
```

Developer juga dapat memanfaatkan set atribut yang telah ditetapkan sebagai cara yang mudah untuk menegakkan praktik terbaik dalam templat kunci. Sebagai contoh:

```
//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
```

### Menetapkan atribut untuk key pair
<a name="java-setting-attributes-key-pair"></a>

Gunakan kelas Java `CloudHsmKeyPairAttributesMap` untuk menangani atribut kunci untuk pasangan kunci. `CloudHsmKeyPairAttributesMap` merangkum dua objek `CloudHsmKeyAttributesMap`; satu untuk kunci publik dan satu untuk kunci privat.

Untuk mengatur atribut individu untuk kunci publik dan kunci privat secara terpisah, Anda dapat menggunakan metode `put()` pada objek peta `CloudHsmKeyAttributes` yang terkait untuk kunci itu. Gunakan metode `getPublic()` untuk mengambil peta atribut untuk kunci publik, dan gunakan `getPrivate()` untuk mengambil peta atribut untuk kunci privat. Isi nilai dari beberapa atribut kunci bersama-sama untuk kedua pasangan kunci publik dan privat menggunakan `putAll()` dengan peta atribut pasangan kunci sebagai argumen.

### Contoh pola pembangun
<a name="java-setting-attributes-key-pair-builder-example"></a>

Developer umumnya akan merasa lebih nyaman untuk mengatur atribut kunci melalui pola Builder. Contoh:

```
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();
```

**catatan**  
[Untuk informasi selengkapnya tentang ekstensi kepemilikan ini, lihat arsip [Javadoc](https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/Docs/CloudHsm_CustomKeyAttributes_Javadoc.zip) dan sampelnya.](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/CustomKeyAttributesRunner.java) GitHub Untuk menjelajahi Javadoc, unduh dan perluas arsip.

## Menyatukan semuanya
<a name="java-attributes-summary"></a>

Untuk menentukan atribut kunci dengan operasi kunci Anda, ikuti langkah berikut:

1. Instantiate `CloudHsmKeyAttributesMap` untuk kunci simetris atau `CloudHsmKeyPairAttributesMap` untuk pasangan kunci.

1. Tentukan objek atribut dari langkah 1 dengan atribut kunci dan nilai-nilai yang diperlukan.

1. Instantiate kelas `Cavium*ParameterSpec`, sesuai dengan jenis kunci tertentu Anda, dan masuk ke konstruktor objek atribut yang dikonfigurasi ini.

1. Masukkan objek `Cavium*ParameterSpec` ke kelas atau metode kripto yang sesuai.

Untuk referensi, tabel berikut berisi kelas dan metode `Cavium*ParameterSpec` yang mendukung atribut kunci kustom.


****  

| Tipe Kunci | Kelas Spesifikasi Parameter | Contoh Konstruktor | 
| --- | --- | --- | 
| Kelas Dasar | CaviumKeyGenAlgorithmParameterSpec | CaviumKeyGenAlgorithmParameterSpec(CloudHsmKeyAttributesMap keyAttributesMap) | 
| DES | CaviumDESKeyGenParameterSpec | CaviumDESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap) | 
| RSA | CaviumRSAKeyGenParameterSpec | CaviumRSAKeyGenParameterSpec(int keysize, BigInteger publicExponent, CloudHsmKeyPairAttributesMap keyPairAttributesMap) | 
| Rahasia | CaviumGenericSecretKeyGenParameterSpec | CaviumGenericSecretKeyGenParameterSpec(int size, CloudHsmKeyAttributesMap keyAttributesMap) | 
| AES | CaviumAESKeyGenParameterSpec | CaviumAESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap) | 
| EC | CaviumECGenParameterSpec | CaviumECGenParameterSpec(String stdName, CloudHsmKeyPairAttributesMap keyPairAttributesMap) | 

### Contoh kode: Buat dan bungkus kunci
<a name="example-generate-wrap-key"></a>

Contoh kode singkat ini menunjukkan langkah-langkah untuk dua operasi yang berbeda: Pembuatan Kunci dan Pembungkusan Kunci:

```
// 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);
```