Halo, Habr! Saya mempersembahkan untuk Anda terjemahan artikel 9 dari "Java KeyStore" oleh Jakob Jenkov dari serangkaian artikel untuk pemula yang ingin mempelajari dasar-dasar kriptografi di Jawa.
Daftar isi:
- Kriptografi Jawa
- Java cipher
- Pesan pesan
- Mac
- Tanda tangan
- Keypair
- Keygenerator
- KeyPairGenerator
- Keystore
- Keytool
- Sertifikat
- Pabrik Sertifikat
- CertPath
Keystore
Java KeyStore adalah penyimpanan kunci tipe database yang diwakili oleh kelas KeyStore ( java.security.KeyStore ). Penyimpanan dapat ditulis ke disk dan dibaca lagi, dapat dilindungi kata sandi, dan setiap catatan kunci di penyimpanan kunci dapat dilindungi dengan kata sandi sendiri, yang menjadikan kelas KeyStore
mekanisme yang berguna untuk bekerja dengan kunci enkripsi dengan aman. Keystore dapat berisi kunci dari jenis berikut:
- Kunci pribadi
- Kunci dan sertifikat publik (Kunci publik + sertifikat)
- Kunci rahasia
Kunci privat dan publik digunakan dalam enkripsi asimetris. Kunci publik mungkin memiliki sertifikat terkait. Sertifikat adalah dokumen yang membuktikan identitas seseorang, organisasi, atau perangkat yang mengklaim memiliki kunci publik. Sertifikat biasanya ditandatangani secara digital oleh pihak yang bersandar sebagai bukti. Kunci pribadi digunakan dalam enkripsi simetris. Dalam kebanyakan kasus, ketika mengatur koneksi yang aman, kunci simetris lebih rendah daripada yang asimetris, sehingga paling sering Anda akan menyimpan kunci publik dan pribadi di keystore.
Membuat keystore
Anda dapat membuat instance KeyStore
dengan memanggil metode getInstance()
. Berikut adalah contoh membuat instance kelas:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
Contoh ini membuat instance KeyStore
default. Anda juga dapat membuat instance KeyStore dengan format penyimpanan kunci yang berbeda dengan meneruskan parameter ke metode getInstance()
. Misalnya, membuat instance dari keystore PKCS12
:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
Unduh keystore
Sebelum Anda dapat menggunakan instance dari keystore, Anda harus mengunduhnya. Contoh kelas KeyStore
sering ditulis ke disk atau penyimpanan lain untuk digunakan nanti, karena kelas KeyStore
mengasumsikan bahwa Anda harus membaca datanya sebelum dapat menggunakannya. Namun, Anda dapat menginisialisasi instance KeyStore
kosong tanpa data, seperti yang akan Anda lihat nanti.
Data diambil dari file atau penyimpanan lain dengan memanggil metode load()
, yang mengambil dua parameter:
InputStream
dari mana data akan dimuat.char[]
Larik karakter yang berisi kata sandi dari keystore.
Berikut ini contoh memuat keystore:
char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); }
Contoh ini memuat file keystore.ks keystore. Jika Anda tidak ingin memuat data apa pun ke dalam keystore, masukkan saja null
untuk parameter InputStream
. Ini adalah bagaimana memuat keystore kosong terlihat seperti:
keyStore3.load(null, keyStorePassword);
Sebuah instance dari kelas KeyStore
selalu dimuat dengan data atau null
. Kalau tidak, keystore tidak diinisialisasi, dan semua panggilan ke metodenya akan mengeluarkan pengecualian.
Menerima kunci
Anda bisa mendapatkan kunci turunan dari kelas KeyStore
melalui metode getEntry()
. Catatan keystore dipetakan ke alias yang mengidentifikasi kunci dan dilindungi kata sandi. Jadi, untuk mengakses kunci, Anda harus meneruskan alias kunci dan kata sandi ke metode getEntry()
. Berikut adalah contoh akses tulis ke instance KeyStore
:
char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);
Jika Anda tahu bahwa catatan yang ingin Anda akses adalah kunci pribadi, Anda bisa mengonversi instance KeyStore.Entry
ke KeyStore.PrivateKeyEntry
. Begini tampilannya:
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword);
Setelah melakukan casting ke KeyStore.PrivateKeyEntry
Anda dapat mengakses kunci pribadi, sertifikat, dan rantai sertifikat menggunakan metode berikut:
getPrivateKey()
getCertificate()
getCertificateChain()
Penyimpanan kunci
Anda juga bisa meletakkan kunci dalam instance dari kelas KeyStore
. Contoh menempatkan kunci rahasia (kunci simetris) dalam instance KeyStore
:
SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);
Penyimpanan
Terkadang Anda mungkin ingin menyimpan keystore ke beberapa jenis penyimpanan (disk, basis data, dll.) Sehingga Anda dapat memuatnya lagi di lain waktu. Sebuah instance dari kelas KeyStore
disimpan dengan memanggil metode store()
. Contoh:
char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); }