BAB IV IMPLEMENTASI DAN PENGUJIAN
Pada Bab 4 ini akan dilakukan implementasi terhadap apa yang telah dianalisa dan dirancang pada bagian sebelumnya. Selain itu dilakukan pula penggujian dari aplikasi yang kita bangun ini terhadap aspek-aspek yang kita inginkan.
4.1.
Lingkungan Implementasi Untuk tujuan implementasi dan pengujian aplikasi ini, kita akan
melakukannya dengan menggunakan seperangkat komputer. 1.
Prosesor intel
2.
RAM 2 GB
3.
Hard disk 180 GB
Adapun perangkat lunak yang digunakan dalam melakukan implementasi dan pengujian ini adalah sebagai berikut.
4.2.
1.
Sistem Operasi Widows 7
2.
Netbean IDE 6.9.1
3.
Glassfish 3
4.
Maven 2
5.
Embeded Database Apache Derby versi 10.5.3.0 - (802917)
Implementasi Kelas Pada bagian sebelumnya, kita telah melakukan analisa dan kemudian
merancang aplikasi termasuk perancangan kelas.
Kelas-kalas yang telah di
rancang, akan diimplementasikan dengan menggunakan bahasa Java.
49
50
Nama
TokenAlgorithm
File
TokenAlgorithm.java
Atribut static char[] hex = "0123456789abcdef".toCharArray(); Operator public
static String createTokenFromPassword(String password,long challange,int
codeDigits) throws NoSuchAlgorithmException, InvalidKeyException public static String createTokenFromHashPassword(byte[] key,long challange,int codeDigits) throws NoSuchAlgorithmException, InvalidKeyException public static byte[] hasingPassword(byte[] pwd) throws NoSuchAlgorithmException public static int dynamicTruncation(byte[] pwd ) throws NoSuchAlgorithmException public static byte[] hexToBytes(String strHex) throws NoSuchAlgorithmException public static String byteToHex(byte[] bytes ) throws NoSuchAlgorithmException
Nama
AbstractToken
File
AbstractToken.java
Atribut /** * DIGITS POWER */ protected static final int[] DIGITS_POWER // 0 1 2 3 4 5 6 7 8 = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}; /** * Panjang token yang di implementasi */
private int tokenLength = 6; Operator protected static String conversion(int otp, int digits) public String generateNonce(String username, Integer tokenType) public boolean verifikasi(String username, String nonce, String response, Integer tokenType) protected abstract boolean isValidNonce(String username, Integer tokenType, String token)
51
protected abstract void removeNonceResponse(String username, Integer tokenType, String token) protected abstract void attemptNonceResponse(String username, Integer tokenType, String token) protected abstract void storeNonce(String username, Integer tokenType, String token, String response) protected abstract byte[] getTokenKey(String username, Integer tokenType) throws Exception protected abstract int getSeed(String username, Integer tokenType) throws Exception
Nama
UserSessionBean
File
UserSessionBean.java
Atribut @PersistenceContext private EntityManager entityManager; Operator public void save(UserToken userToken,String pwdLogin,String pwdTransaksi) public void changePassword(String username, String password,Integer typeToken)
Nama
TokenSessionBean
File
TokenSessionBean.java
Atribut @PersistenceContext private EntityManager entityManager; /** * Panjang token yang di implementasi */ private static int token_lenght = 6; /** * Max percobaan token */ private static int maxPercobaan = 10;
52
Operator public UserDto getUserDto(String username) protected void removeNonceResponse(String username, Integer tokenType, String nonce) protected void attemptNonceResponse(String username, Integer tokenType, String nonce) protected void storeNonce(String username, Integer tokenType, String token, String response) protected byte[] getTokenKey(String username, Integer tokenType) throws Exception protected UserToken getUserToken(String username) protected void persist(NonceToken nonceToken ) protected
NonceToken
getNonceToken(String username,
String nonce,
Integer
tokenType) protected boolean isValidNonce(String username, Integer tokenType, String token) protected int getSeed(String username, Integer tokenType)throws Exception
Nama
ChangePasswordController
File
ChangePasswordController.java
Atribut private Integer passwordType =0; private String password=""; private String passwordUlangi =""; Operator public String changePasswordAction()
Nama
RegisterController
File
RegisterController.java
Atribut private UserToken user = new UserToken(); private String pwdLogin=""; private String pwdLoginUlangi=""; private String pwdTransaksi=""; private String pwdTransaksiUlangi=""; Operator public String registerAction()
53
Nama
LoginController
File
LoginController.java
Atribut private String username = ""; private String challange = "0"; private String response ; Operator protected void setUserDto(UserDto userDto) public String challangeAction() public String verificationAction() public String logoutAction()
Nama
TransaksiController
File
TransaksiController.java
Atribut private String name = ""; private String username = ""; private String challange = ""; private String response; Operator public void generateChallange() public String verificationAction()
Nama
JDialogToken
File
JDialogToken.java
Atribut private javax.swing.JFormattedTextField challenge; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPasswordField password;
54
private javax.swing.JTextField response; Operator private void initComponents() private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
4.3.
Implementasi Modul Dibagian sebelumnya, kita telah implementasi kelas dari aplikasi yang
sedang dibangun. Berikut ini kita dapat melihat daftar implemantsi modul yang ada dalam aplikasi ini. Daftar tersebut dapat dilihat dalam tabel dibawah ini.
Tabel 4.1 DAFTAR IMPLEMENTASI MODUL Nama Modul
Nama Class yang Terlibat
Registrasi
RegisterController , UserSessionBean, dan TokenAlgorithm
Ganti Passaword
ChangePasswordController , UserSessionBean, dan TokenAlgorithm
Login
LoginController,
TokenSessionBean,
TokenAlgorithm
dan
OneTimePasswordAlgorithm Transaksi
TransaksiController,
Otentikasi
OneTimePasswordAlgorithm
Token Desktop
JDialogToken, TokenAlgorithm dan OneTimePasswordAlgorithm
4.4.
TokenSessionBean,
TokenAlgorithm
dan
Implementasi Antar Muka Implementasi Antar Muka didasari dari apa yang telah kita rancang pada
bagian sebelumnya.
55
Gambar 4.1 Layar-layar pada saat pendaftaran pengguna Pada Gambar 4.1 ditampilkan hasil layar-layar untuk pendaftaran pengguna. Sedangkan untuk Gambar 4.2 ditampilkan layar-layar pada saat login sebelum pengguna dapat menggunakan aplikasi.
Gambar 4.2 Layar-Layar Pada Saat Login
56
Gambar 4.3 Layar-Layar Pada Saat Transaksi Pada Gambar 4.3 ditampilkan layar-layar yang mungkin mucul pada saat pengguna melakukan Otentikasi untuk melakukan taransaksi. Sedangkan pada Gambar 4.4 ditampilkan layar-layar yang muncul pada saat pengguna melakukan penggantian password untuk login maupun password transaksi
Gambar 4.4. Layar-Layar Pada Saat Ganti Password
Gambar 4.5. Token desktop
57
Pada Gambar 4.5 ditampilkan token destop yang berguna untuk melakukan pembangkitan nilai response berdasarkan
nilai Challenge dengan
menggunakan password.
4.5.
Pengujian Aplikasi Pengujian aplikasi ini kita bagi menjadi dua bagia.
Pengujian pertama
dilakukan untuk mengukur performansi dari aplikasi ini. Pengujian kedua adalah pengujian terhadap hasil validasi token yang di hasilkan. 4.5.1. Pengujian hasil Token Pengujian hasil token ditujukan untuk melihat apakah proses melakukan hal dengan benar. Untuk kelas utama yaitu OneTimePasswordAlgoritma dan TokenAlgoritma di verifikasi menggunakan framework jUnit.
Dengan
mempergunakan framework tesebut maka akan dapat test yang lebih stabil.
Gambar 4.6. hasil jUnit Pada gambar 4.8 ditampilkan fungsi-fungsi utama mengunakan jUnit.
4.5.2. Test Token Simulasi Test token simulasi adalah pengetesan terhadap Kalss AbstractToken dimana Abstract token tersebut akan di implementasikan menjadi sebuah Class pengujian yang bernama Token.
58
import java.util.HashMap; import java.util.Map; import token.engine.AbstractToken; import token.engine.TokenAlgorithm;
public class Token extends AbstractToken{ private static Map<String,String> hashMap = new HashMap(); private String seedToken = "0";
@Override protected void removeNonceResponse(String username, Integer tokenType, String token) { hashMap.remove(username+"#"+token+"#"+tokenType); }
@Override protected void attemptNonceResponse(String username, Integer tokenType, String token) { }
@Override protected void storeNonce(String username, Integer tokenType, String token) { hashMap.put(username+"#"+token+"#"+tokenType,username+"#"+token+"#"+tokenType); this.seedToken =token; } @Override protected Exception {
byte[]
getTokenKey(String
username,
Integer
tokenType)
throws
if("ani".equals(username)){ return TokenAlgorithm.hasingPassword("passwordAni".getBytes()); }else{ return TokenAlgorithm.hasingPassword("passwordOrangLain".getBytes()); } }
@Override protected token) {
boolean
isValidNonce(String
username,
Integer
tokenType,
return hashMap.containsKey(username+"#"+token+"#"+tokenType); }
@Override protected int getSeed(String username, Integer tokenType) { return Integer.parseInt(seedToken); }
}
String
59
Kelas token di implentasikan dengan beberapa batasan. Pada penyimpanan nonce mengunakan memori itu bisa dilihat pada fungsi-fungsi getNonceResponse, removeNonceResponse dan storeNonce. Walaupun menggunakan penyimpanan data yang sederhana kelas tersebut mencerminkan kondisi sebenarnya. Pada kelas tersebut akan di ujikan beberapa skenario berikut ini: 1. Evi tidak mengetahui password Ani mencoba untuk menjadi Ani untuk otentikasi 2. Kondisi ada pengguna Ani melakukan otentikasi dan evi mencoba untuk melakukan otentikasi menggunakan response dan challenge Ani sebelumnya kirimkan ke server. (Replay Attack) 3. Evi memcoba mengenerate challenge dari Ani tanpa mengetahui password Ani. 4. Kondisi ada pengguna Ani melakukan otentikasi dan evi mencoba untuk melakukan otentikasi menggunakan Ani pada saat ani sedang akan online 5. Ani melakukan otentikasi dan berhasil
Scenario: Evi tidak menengetahui password Ani mencoba untuk menjadi Ani untuk otentikasi
Given Evi berpura-pura menjadi Ani When Evi meminta challenge And Evi generate response And Evi mengirimkan response ke server Then Evi gagal diotentikasi Hasil: berhasil
60
Scenario: Kondisi ada pengguna Ani melakukan otentikasi dan evi mencoba untuk melakukan otentikasi menggunakan response dan challenge Ani sebelumnya kirimkan ke server. (Replay Attack)
Given Ani meminta challenge And Evi berpura-pura menjadi Ani When Ani generate response And Ani mengirimkan response ke server And Evi memonitor challenge dan response Ani dan mengambil data tersebut And Evi mengirimkan response ke server Then Evi gagal diotentikasi And Ani berhasil diotentikasi Hasil: berhasil
Scenario: Evi memcoba mengenerate challege dari Ani tanpa mengetahui password Ani
Given Ani meminta challenge And Evi berpura-pura menjadi Ani When Evi memonitor dan mengetahui challenge Ani And Evi generate response And Evi mengirimkan response ke server And Ani generate response And Ani mengirimkan response ke server Then Evi gagal diotentikasi And Ani berhasil diotentikasi Hasil: berhasil
61
Scenario: Kondisi ada pengguna Ani melakukan otentikasi dan evi mencoba untuk melakukan otentikasi menggunakan Ani pada saat ani sedang akan online
Given Ani meminta challenge And Evi berpura-pura menjadi Ani When Evi meminta challenge And Evi generate response And Evi mengirimkan response ke server And Ani generate response And Ani mengirimkan response ke server Then Evi gagal diotentikasi And Ani berhasil diotentikasi Hasil: berhasil
Scenario: Ani melakukan otentikasi dan berhasil
Given Ani meminta challenge When Ani generate response And Ani mengirimkan response ke server Then Ani berhasil diotentikasi Hasil: berhasil
4.5.3. Test Token pada Aplikasi WEB Dalam melakukan test token terhadap aplikasi WEB kita mengunakan beberapa skenario yang dijalankan. Skenario tersebut diantaranya: 1.
Daftar pengguna Baru
2.
Login passsword salah
3.
Login
62
4.
Transaksi Gagal
5.
Transaksi
6.
Ganti password Login
7.
Ganti password Transaksi
Scenario: Daftar pengguna Baru
Given daftar Pengguna When isi username agusramdan And isi password login passwordlogin And isi password transaksi passwordtransaksi And isi data yang lainnya And klik daftar Then anda berhasil daftar Hasil: berhasil Halaman:
63
Scenario: Login passsword salah
Given Login page When set username agusramdan And request login challenge And generate response by passwordsalah And klik login Then login Gagal Hasil: berhasil Halaman:
64
Scenario: Login
Given Login page When set username agusramdan And request login challenge And generate response by passwordlogin And klik login Then login Berhasil Hasil: berhasil Halaman:
65
Scenario: Transaksi Gagal
Given Transaksi page When Generate Response Transaksi by passwordsalah Then transaksi Gagal Hasil: berhasil Halaman:
66
Scenario: Transaksi
Given Transaksi page When Generate Response Transaksi by passwordtransaksi Then transaksi Berhasil Hasil: berhasil Halaman:
67
Scenario: Ganti password Login
Given ganti password page When ganti password Login dengan password Then password berubah Hasil: berhasil Halaman :
Scenario: Ganti password Transaksi
Given ganti password page When ganti password Transaksi dengan password Then password berubah Hasil: berhasil
68
4.5.4. PenggujianPerformance Aplikasi Pengujian performansi ini lebih ditujukan untuk mengukur performansi dari algoritma token yang kita gunakan dalam aplikasi ini. Hasil dari pengujian performansi tanpa menggunakan database ini dapat dilihat pada table sebagai berikut: Tabel 4.2 PENGUJIAN PERFORMANSI TANPA DATABASE Kelas dan Method
Iterasi
Waktu exsekusi (milisecond)
org.openauthentication.otp.OneTimePasswordAlgorithm generateOTP
1000000
6330
hmac_sha1
1000000
6070
counter
1000000
30
dynamicTruncation
1000000
10
conversion
1000000
60
createTokenFromPassword
1000000
8630
createTokenFromHashPassword
1000000
6170
hasingPassword
1000000
1420
byteToHex
1000000
680
hexToBytes
1000000
1620
generateNonce
500000
7790
generateUnixNonce
500000
870
verifikasi
500000
1090
token.engine.TokenAlgorithm
com.ramdan.token.tokenweb.ejb.TokenSessionBean
69
Sedangkan performance diintegerasikan dengan database ditampilkan pada Tabel 4.3 . Tabel 4.3 PENGUJIAN PERFORMANSI DENGAN DATABASE Kelas dan Method
Iterasi
Waktu exsekusi (milisecond)
com.ramdan.token.tokenweb.controler.LoginController challengeAction
10000
72681
verificationAction
10000
65395
com.ramdan.token.tokenweb.controler.TransaksiController generateChallenge
10000
74381
verificationAction
10000
62915
Terlihat sekali bahwa menggunakan perbedaan performansi dari kedua penggujian ini. Penggunaan database pada kasus ini menjadi sangat lambat.
4.5.5. Analisa Hasil Pengujian Berdasarkan hasil pengujian yang dilakukan diatas, dapat dilihat bahwa aplikasi mampu mengangai bila terjadi sekenario replay-attack. Sedangkan untuk performansi yang ditampilkan oleh aplikasi ini cukup bagus. Dari sisi waktu pemrosesan, pengguna tidak terlalu merasakan perbedaan antara proses pembuatan token dan verifikasi token apakah menggunakan database untuk menyimpan nilai challenge atau di simpan di memory. Tapi secara system bila permintaan bisa mencapai lebih dari 5000 perdetik maka disarankan untuk mecari database yang biaya IO yang lebih kecil dibanding relasional database.
70
Halaman ini sengaja dikosongkan.