Rabu, 06 Agustus 2014

Menggunakan Bouncy Castle Cryptographic di poyek JSE pada NetBeans atau Eclipse

Bouncy Castle Crypto API Java menyediakan kriptografi API yang ringan (simple) yang dapat berfungsi mulai dari platform JME hingga JDK 1.7 yang juga sebuah provider untuk Java Cryptography Extension (JCE) dan Java Cryptography Architecture (JCA).

API Bouncy Castle dapat di download dari situs resmi Bouncy Castle (BC).

Jika anda ingin mengembangkan aplikasi java berbasis framework JSE yang menyediakan layanan kriptografi seperti:

  • membangkitkan angka hash untuk mengecek integritas pesan atau file;
  • enkripsi/dekripsi menggunakan algoritma kunci simetri;
  • enkripsi/dekripsi menggunakan sertifikat publik dalam sebuah publik key infrastructure;
  • membangkitkan kode-kode pesan otentifikasi untuk pesan;
maka anda harus menggunakan sebuah API kriptografi yang menyediakan class-class dan method-methode yang diperlukan.
API Bouncy Castle dapat digunakan didalam aplikasi JSE dalam dua cara:

  • sebagai sebuah Cryptographic Service Provider (CSP) untuk JCA;
  • sebagai sebuah standalone API yang berdiri sendiri;
Setiap cara tersebut memiliki masing-masing keuntunganmya yang akan dijelaskan dibawah berikut.

1. Apakah Java Cryptography Architecture (JCA), Java Cryptography Extension (JCE), dan Cryptographic Service Provider (CSP)

Penjelasan mengenai JCA, JCE, dan CSP maka dapat anda baca tulisan saya terdahulu mengenai JCA/JCE.

2. Bagaimana menginstall API Bouncy Castle sebagai CSP untuk JCA (NetBeans atau Eclipse)

Terdapat dua cara untuk menginstall sebuah provider security untuk JCE dan JCA;
  • konfigur Java Runtime (JRE) sehingga provider akan tersedia secara default untuk semua aplikasi java. Keuntungannya, anda hanya menginstallnya sekali pada mesin bersangkutan dan semua aplikasi java dapat menggunakannya (untuk mesin yang sudah terinstall provider security) tanpa modifikasi kode sumbernya. Kerugiannya, anda harus mengkonfigurasi Java Runtime, jika aplikasi ingin dijalankan pada mesin berbeda maka anda harus konfigurasi lagi JRE pada mesin tersebut.
  • menginstallnya secara dinamis saat runtime, melalui kode sumber aplikasi. Provider akan tersedia ketika aplikasi dijalankan. Keuntungannya, anda tidak perlu mengkonfigurasi Java Runtime (JRE). Kerugiannya, anda harus memodifikasi kode sumber aplikasi dengan memasukkannya diawal kode agar saat aplikasi dijalankan diawal maka API provider telah termuat di komputer.
Solusi yang kedua adalah lebih simple dibandingkan dengan solusi pertama dimana anda tidak perlu mengkonfigurasi JRE.

API Bouncy Castle tersedia dalam bentuk JAR file. Yang perlu anda perhatikan adalah bahwa anda mendownload API BC sesuai dengan versi JDK/JRE yang terinstall di komputer anda. API BC akan dinamai dengan nama file yang diikuti dengan versi JDK yang didukung. misalkan API BC bernama bcprov-jdk15on-151.jar maka adalah versi API yang ke-150 dengan dukungan JDK minimal versi 1.5,


Solusi 1. Menginstall provider Bouncy Castle untuk JCA dengan mengkonfigurasi Java Runtime.


Step 1. Download provider Bouncy Castle untuk JDK atau JRE yang sesuai (mis, bcprov-jdk15on-150.jar)

Step 2. Copy file .jar provider tersebut ke subfolder extensions Java Runtime (JRE); untuk mesin windows dengan JRE 1.7 (jika ada) biasanya di install (copy) ke
     C:\Program Files\Java\jre7\lib\ext    atau
Jika JRE 1.7 berada didalam JDK, maka di install (copy) ke
     C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext
(jika anda melihat ke subfolder ext, maka anda akan melihat provider SunJCE - sunjce_provider.jar)

Step 3. Tambahkan provider Bouncy Castle ke file java.security untuk meng-enable-kannya; file java.security berada di subfolder \lib\security\ dari lokasi JRE (Perhatian ! Edit kedua lokasi baik JRE standalone maupun yang berada di JDK); edit file dan tambahkan statement berikut

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider

(N harus nomor urut berikut) setelah deklarasi yang ada :
#
# List of providers and their preference orders (see above):
#
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI

Dalam contoh saya, saya menambahkan baris
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

Perhatian! 
nilai N haruslah nomor berikut dalam urutan yang ada (mungkin disetiap komputer berbeda) dan jangan merubah urutan nomor yang sudah ada dengan menambahkan (mengganti) provider BouncyCastle pada posisi pertama atau posisi tertentu ditengah urutan, karena jika itu dilakukan maka anda akan mengubah eksekusi aplikasi java lainnya. Jangan lupa untuk memodifikasi file java.security baik pada lokasi JRE yang berdiri sendiri maupun yang tergabung di folder JDK.


Menguji provider Bouncy Castle dengan NetBeans atau Eclipse

Jika instalasi sebelumnya dari provider Bouncy Castle telah dilakukan tanpa kesalahan, kemudian anda bisa membuka IDE NetBeans atau Eclipse dengan menuliskan project java seperti berikut,

import java.security.Security;

public class BCtestAvailability {
    public static void main(String[] args) {
        // BC adalah ID untuk provider Bouncy Castle
        if (Security.getProvider("BC") == null) {
            System.out.println("Bouncy Castle provider tidak tersedia");
        } else {
            System.out.println("Bouncy Castle provider tersedia");
        }
    }

}

Jika anda menjalankannya dan semuanya ok, maka anda akan melihat output keluaran program adalah:

Bouncy Castle provider tersedia

jika keluaran program bukan hal diatas maka anda harus memeriksa ulang step 1-3. Juga jangan menginstall banyak versi dari provider Bouncy Castle.


Solusi 2. Menginstall provider Bouncy Castle untuk JCA pada saat runtime untuk sebuah aplikasi JSE dengan NetBeans dan Eclipse

Dalam solusi ini anda tidak perlu untuk memodifikasi file java.security atau menambahkan file .jar ke library JRE. Anda harus mereferensikan file .jar Bouncy Castle dan menginstall provider saat runtime untuk setiap aplikasi java.

Step 1. Download provider Bouncy Castle untuk versi JDK atau JRE yang sesuai (mis, bcprov-jdk15on-150.jar);

Step 2. Copy file .jar provider ke folder aplikasi JSE atau pada sebuah lokasi tetap.

Step 3. Tambahkan referensi (libraries) file .jar ke project java:

Untuk NetBeans :
  1. Pilih proyek java anda dan buka dialog ProjectProperties (klik kanan pada panel nama proyek anda dan pilih Properties dari menu konteks yang tampil; cara lain adalah pilih proyek dan File --> Project Properties dari menu NetBeans) dan pilih kategori Libraries.
  2. Klik button Add JAR/Folder dan pilih .jar file yang dimaksud.

Untuk Eclipse :
  1. Pilih proyek java anda dan buka dialog ProjectProperties (pilih nama proyek dalam panel Project Explorer dan tekan Alt+Enter; cara lain adalah memilih project dan File --> Properties dari menu Eclipse) dan pilih kategori Java Build Path.
  2. Klik button Add External JARs... dan pilih file .jar yang dimaksud.


Test provider Bouncy Castle di NetBeans atau Eclipse dengan meng-install-nya saat runtime

Jika referensi file .jar Bouncy Castle sebelumnya telah ditambahkan tanpa ada masalah, kemudian buat aplikasi console java sederhana baik di NetBeans atau di Eclipse IDE untuk men-test nya seperti kode program dibawah ini.

Jika anda menjalankannya dan segala sesuatunya ok, maka anda akan melihat output program seperti dibawah ini.
       Bouncy Castle provider is available

jika tidak maka periksa kembali tahap 1-3 diatas. Juga jangan mereferensi banyak versi (lebih dari satu) provider Bouncy Castle.

3. Bagaimana meng-install lightweight Bouncy Castle API di NetBeans dan Eclipse IDE untuk aplikasi-aplikasi java JSE

Jika anda tidak menginginkan untuk menginstall Bouncy Castle sebagai sebuah Cryptographic Service Provider untuk JCA, maka anda dapat menggunakannya sebagai API simple (lightweight) yang independent seperti halnya external library lainnya.

Dalam kasus ini anda tidak dapat mengambil manfaat dari keuntungan yang ada di JCA, juga class-class antarmuka (interface) dan factory pada JCA. Sebagai contoh anda tidak dapat lagi menggunakan class Cipher dan anda harus membuat sendiri class-class yang didefinisikan untuk setiap mesin kriptografi (cryptographic engine), misal untuk AES terdapat 3 class. Gaya pemrograman adalah sama untuk penggunaan Bouncy Castle API di aplikasi-aplikasi J2ME.

Lightweight API untuk platform JSE tersedia di halaman release terakhir dari Bouncy Castle, di kategori Signed JAR Files. Anda dapat mengenalinya dengan arsip ekstensi file .jar (Perhatian! file .jar adalah untuk provider Bouncy Castle, tapi file tersebut juga berisi lightweight API) untuk versi JSE karena terdapat kata jdk, diikuti dengan versi nya. Dalam tulisan ini saya akan menggunakan Bouncy Castle lightweight API untuk platform java 6, sehingga saya membutuhkan file bcprov-jdk15-151.jar.

Juga, Bouncy Castle API akan tersedia untuk proyek java sekarang.

Jika anda menginginkan mem-build API kustomisasi anda sendiri, anda dapat mengambil file-file sumber dari Bouncy Castle lightweight API dan mengambil hanya algoritma-algoritma yang diperlukan. File sumber tersedia di bagian Sources and javadoc dari halaman Bouncy Castle latest releases page. Untuk JDK 1.5 sampai dengan 1.7 file-file sumber libhtwight API adalah lcrypto-jdk15on-151.zip atau lcrypto-jdk15on-151.tar.gz.

Langkahnya diperlukan penambahan lightweight API Bouncy Castle ke dalam aplikasi java, baik untuk IDE NetBeans maupun Eclipse adalah sama seperti di Solusi 2. Menginstall provider Bouncy Castle untuk JCA pada saat runtime untuk sebuah aplikasi JSE dengan NetBeans dan Eclipse (tanpa instalasi provider).

Berikut adalah langkah singkatnya (untuk gambar lihat diatas):

Step 1. Download lightweight API Bouncy Castle untuk JDK atau JRE anda yang sesuai (bcprov-jdk15-151.jar untuk JDK 1.5 hingga 1.7);
Step 2. Copy file .jar provider ke folder aplikasi JSE atau pada lokasi tertentu.
Step 3. Tambahkan referensi file .jar tersebut ke proyek java kita:

Untuk NetBeans:
  1. Pilih proyek java anda dan buka dialog ProjectProperties (Klik kanan di nama proyek pada panel Project dan pilih Properties dari menu contextual; cara lain adalah dengan memilih project dan File --> Project Properties dari menu NetBeans) dan lanjut ke Libraries category.
  2. Klik tombol Add Library... dan tunjuk (cari dan pilih) file .jar dimaksud.
Untuk Eclipse:
  1. Pilih proyek java anda dan buka dialog ProjectProperties (pilih nama proyek di panel Project Explorer dan tekan Alt+Enter; cara lain adalah dengan memilih project and File --> Properties dari menu Eclipse) dan lanjut ke Java Build Path category.
  2. Klik tombol Add Library... dan tunjuk file .jar dimaksud.

Test Bouncy Castle provider di NetBeans atau Eclipse

Jika referensi file .jar dari provider Bouncy Castle telah ditambahkan tanpa menemui masalah, kemudian buat sebuah aplikasi java console sederhana baik pada IDE NetBeans ataupun Eclipse sbb:

package org.aryo.security;

import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;

/**
 *
 * @author Aryo
 */
public class BCtestAvailability3 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // test the API by creating an AES cipher
        //  in CBC mode with padding
        BlockCipher engine = new AESEngine();
        PaddedBufferedBlockCipher encryptCipher;
        encryptCipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine));
        
        // run program ini. Maka jika tidak ada compile error maka BouncyCastle API
        //  sudah ditambahkan
    }
}

Jika tidak ada error saat compile, itu berarti bahwa API telah sukses ditambahkan.

Ketika menggunakan Bouncy Castle sebagai lightweight API dan bukan sebagai sebuah provider, anda harus mengetahui kelas-kelas dari setiap engine kriptografi BC dan anda tidak akan mendapatkan keuntungan dari framework JCA yang sederhana (mudah) dalam memprogramnya dimana JCA membungkus semua detail-detail nya. Semua dokumentasi dari API BC sangat membantu dan dapat diperoleh di Bouncy Castle latest releases page baik untuk sumber kode nya dan bagian javadoc nya.



Sumber dan referensi :
  • www.itcsolution.eu
  • www.bouncycastle.org