SoftHSM adalah implementasi perangkat lunak dari HSM (Hardware Security Module) yang bertujuan untuk melakukan semua fungsi yang akan dilakukan oleh HSM yang tepat tanpa memberikan perlindungan keamanan perangkat keras yang diberikan oleh HSM yang sebenarnya. Jika Anda adalah pengguna yang tidak ingin berinvestasi dalam perangkat keras baru, Anda dapat menggunakan SoftHSM yang merupakan toko kriptografi yang dapat diakses melalui antarmuka PKCS#11. Ini dikembangkan sebagai bagian dari proyek OpenDNSSEC yang dirancang untuk memenuhi persyaratan OpenDNSSEC, tetapi juga dapat bekerja sama dengan produk kriptografi lainnya karena antarmuka PKCS#11-nya. Artikel ini akan membantu Anda menginstal SoftHSM.
Cara menginstal SoftHSM
Anda dapat menginstal SoftHSM menggunakan beberapa cara. Pertama, mari kita lihat manajer paket seperti apt-get
untuk Ubuntu dan yum
untuk CentOS.
SoftHSM bergantung pada pustaka kriptografi di bawah dan versi yang diperlukan:
Botan 2.0.0 (Use at least 2.6.0 for better performance) or OpenSSL 1.0.0
Cara menginstal SoftHSM di Ubuntu
Gunakan perintah di bawah ini untuk menginstal SoftHSM
# sudo apt-get install softhsmVersi SoftHSM lama
Jika versi SoftHSM sudah lama dan jika Anda membutuhkan versi terbaru, ikuti instalasi sumber di bawah ini.
Cara menginstal SoftHSM di CentOS
Gunakan YUM untuk menginstal SoftHSM
$ sudo yum install softhsm
Anda juga dapat mengunduh paket rpm SoftHSM dan menginstalnya seperti di bawah ini:
$ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/softhsm-2.1.0-3.el7.x86_64.rpm
$ sudo yum install softhsm-2.1.0-3.el7.x86_64.rpm -y or $ sudo rpm -Uvh softhsm-2.1.0-3.el7.x86_64.rpm
Cara menginstal SoftHSM melalui kompilasi sumber
Pastikan Anda memiliki GNU Autotools (Autoconf, Automake, Libtool) untuk membangun perangkat lunak. Disarankan juga untuk menginstal pkg-config
sehingga skrip configure dapat menemukan perangkat lunak yang diinstal. Anda juga memerlukan libp11-kit-dev
untuk menginstal SoftHSM sebagai modul PKCS#11 pada sistem.
Langkah 1: Pastikan Anda telah menginstal paket automake, autoconf, libtool, pkg-config git
Langkah 2: Unduh paket SoftHSM
# git clone https://github.com/opendnssec/SoftHSMv2.git # cd SoftHSMv2
Langkah 3: Konfigurasikan skrip instalasi
$ ./configure
Ikuti jika Anda menemukan perpustakaan OpenSSL tidak memiliki dukungan GOST
Langkah 4: Kompilasi
$ make
Langkah 5: Instal SoftHSM
$ sudo make install
Cara menggunakan SoftHSM
Setelah menginstal SoftHSM, Anda dapat mengaksesnya melalui perintah SoftHSM Utility seperti yang ditunjukkan di bawah ini.
$ softhsm2-util
Untuk menginisialisasi token lunak, jalankan perintah di bawah ini:
$ softhsm2-util --init-token --slot 0 --label "encryptionkey"
Saat menginisialisasi token lunak, Anda akan diminta untuk mengatur Pin Pengguna dan PIN SO. Pin pengguna digunakan oleh aplikasi untuk berinteraksi dengan token dan SO pin untuk menginisialisasi ulang token. Jadi, Anda perlu mengingat pin yang akan Anda atur.
Perintah di bawah ini akan mencantumkan slot:
$ softhsm2-util --show-slots Available slots: Slot 462451351 Slot info: Description: SoftHSM slot ID 0x1b907297 Manufacturer ID: SoftHSM project Hardware version: 2.5 Firmware version: 2.5 Token present: yes Token info: Manufacturer ID: SoftHSM project Model: SoftHSM v2 Hardware version: 2.5 Firmware version: 2.5 Serial number: 360a5ad59b907297 Initialized: yes User PIN init.: yes Label: encryptionkey Slot 1 Slot info: Description: SoftHSM slot ID 0x1 Manufacturer ID: SoftHSM project Hardware version: 2.5 Firmware version: 2.5 Token present: yes Token info: Manufacturer ID: SoftHSM project Model: SoftHSM v2 Hardware version: 2.5 Firmware version: 2.5 Serial number: Initialized: no User PIN init.: no Label:
Itu saja, SoftHSM telah berhasil diinstal dan dikonfigurasi. Haruskah kita sekarang berkomunikasi dengannya secara terprogram?
Untuk berkomunikasi dengan SoftHSM, kita perlu membuat file konfigurasi yang harus disimpan di direktori root proyek.
name = SoftHSM library = /usr/local/lib/softhsm/libsofthsm2.so slot = 462451351 attributes(generate, *, *) = { CKA_TOKEN = true } attributes(generate, CKO_CERTIFICATE, *) = { CKA_PRIVATE = false } attributes(generate, CKO_PUBLIC_KEY, *) = { CKA_PRIVATE = false }Ganti slot
Anda perlu mengganti ID slot dengan milik Anda sendiri.
Biarkan saya membawa Anda melalui program Java untuk berkomunikasi dengan SoftHSM. Program akan mengambil string sebagai input, mengenkripsi dan mendekripsi kembali untuk kita.
package tg.blr; import java.io.FileWriter; import java.io.IOException; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.Provider; import java.security.Security; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.Scanner; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class SoftHsmTest { private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; public static String encodedString = new String(); static { Security.addProvider(new BouncyCastleProvider()); } static byte[] decryptbytes; public static void main(String[] args) { System.out.println("Enter the text to be encrypted: "); Scanner s = new Scanner(System.in); String inputtext = s.nextLine(); s.close(); try { String filePath = "/usr/local/lib/softhsm/libsofthsm2.so"; //To create softhsm.cfg FileWriter fw = new FileWriter("softhsm.cfg"); fw.write("name = SoftHSM\n" + "library = " + filePath); //Change the slot ID fw.write("\n slot = 462451351\n" + "attributes(generate, *, *) = {\n"); fw.write("\t CKA_TOKEN = true\n}\n" + "attributes(generate, CKO_CERTIFICATE, *) = {\n"); fw.write("\t CKA_PRIVATE = false\n}\n" + "attributes(generate, CKO_PUBLIC_KEY, *) = {\n"); fw.write("\t CKA_PRIVATE = false\n}\n"); fw.close(); } catch (IOException e2) { e2.printStackTrace(); } String pkcs11ConfigData = "softhsm.cfg"; Provider pkcs11Provider = Security.getProvider("SunPKCS11"); pkcs11Provider = pkcs11Provider.configure(pkcs11ConfigData); if (-1 == Security.addProvider(pkcs11Provider)) { throw new RuntimeException("could not add security provider"); } else { System.out.println("provider initialized !!!"); } Security.addProvider(pkcs11Provider); //User pin created while initializing soft token char[] pin = "sukumar123".toCharArray(); KeyStore keyStore; try { keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider); keyStore.load(null, pin); SecretKeySpec secretKeySpec = new SecretKeySpec("0123456789ABCDEF".getBytes(), 0, 16, "AES"); Key key = new SecretKeySpec(secretKeySpec.getEncoded(), 0, 16, "AES"); keyStore.setKeyEntry("AA", key, "sukumar123".toCharArray(), null); keyStore.store(null); SecretKey key1 = (SecretKey) keyStore.getKey("AA", "sukumar123".toCharArray()); System.out.println("the algorithm: "+key1.getAlgorithm()+", the key: "+key1.toString()+", format: "+key1.serialVersionUID); String encryptedString = performEncryption(key1, inputtext); System.out.println("encryptedString : "+encryptedString); performDecryption(key1, encryptedString); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private static String performEncryption(Key secretKey, String inputtext) throws Exception { String encryptedText = new String(); Cipher cipher; try { cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] cipherText = cipher.doFinal(inputtext.getBytes("utf-8")); encryptedText = java.util.Base64.getEncoder().encodeToString(cipherText); } catch (NoSuchAlgorithmException e) { System.out.println("No such algorithm exception"); e.printStackTrace(); } catch (NoSuchPaddingException e) { System.out.println("No such padding exception"); e.printStackTrace(); } catch (InvalidKeyException e) { System.out.println("Invalid key exception"); e.printStackTrace(); } catch (IllegalBlockSizeException e) { System.out.println("Illegal block size exception"); e.printStackTrace(); } catch (BadPaddingException e) { System.out.println("Bad padding exception"); e.printStackTrace(); } finally { } return encryptedText; } private static void performDecryption(Key key, String encryptedString) throws Exception { Key secretKey = key; Cipher cipher; try { cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] deciphered = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedString)); System.out.println("decrypted text: "+new String(deciphered)); } catch (NoSuchAlgorithmException e) { System.out.println("No such algorithm exception"); e.printStackTrace(); } catch (NoSuchPaddingException e) { System.out.println("No such padding exception"); e.printStackTrace(); } catch (InvalidKeyException e) { System.out.println("Invalid key exception"); e.printStackTrace(); } catch (IllegalBlockSizeException e) { System.out.println("Illegal block size exception"); e.printStackTrace(); } catch (BadPaddingException e) { System.out.println("Bad padding exception"); e.printStackTrace(); } finally { } } }
Contoh keluaran:
Jika Anda terjebak dengan kesalahan:Pengecualian ukuran blok ilegal – CKR_ENCRYPTED_DATA_LEN_RANGE, maka inilah solusi untuk memperbaikinya.