GNU/Linux >> Belajar Linux >  >> Linux

Instal SoftHSM dan Akses melalui Program Java

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 softhsm
Versi 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.


Linux
  1. Bagaimana Cara Menginstal Proxychains dan Mengakses Internet melalui Proxy di CentOS?

  2. LibreOffice 7.0 Dirilis – Instal Melalui PPA di Ubuntu dan Mint

  3. Cara menghapus Java versi lama dan menginstal versi baru

  1. Debian – Instal Java Jdk Dan Jre Di Debian 8?

  2. Cara Menginstal dan Mengelola Versi Java di Rocky Linux 8

  3. Izinkan proses non-root untuk mengikat ke port 80 dan 443?

  1. Cara Memasang dan Mengonfigurasi Server Akses OpenVPN

  2. Cara Menginstal Java (JDK dan JRE) di Debian 10

  3. Cara menginstal dan mengkonfigurasi Solr 5.5 di Ubuntu 14.04