Sampai saat ini, banyak CMS telah mengimplementasikan / mengembangkan
menggunakan hash dan salt untuk metode penyimpanan password pada database.
Namun masih banyak aplikasi website lainnya yang masih menggunakan fungsi
MD5/SHA1 hash saja.
MD5/SHA1 itu sendiri banyak dirasa kurang aman. Karena begitu populernya
digunakan maka banyak yang menggunakan brute direktori list hash sampai ke
tingkat yang lebih kompleks yaitu rainbow table. Maka tidak heran
plaintext dari hash password-password umum dapat dengan mudah didapatkan.
Misalnya (md5):
admin:21232f297a57a5a743894a0e4a801fc3password:5f4dcc3b5aa765d61d8327deb882cf99
Kali ini saya ingin sedikit melakukan manipulasi MD5 hash menjadi seolah-olah sebuah SHA1 hash.
Seperti yang kita ketahui bahwa MD5 hash memiliki karakteristik hexadecimal sepanjang 32 karakter. Sedangkan SHA1 memiliki karakteristik hexadecimal sepanjang 40 karakter.
1md5 = ^[a-f0-9]{32}
2sha1 = ^[a-f0-9]{40}
maka supaya MD5 hash bisa menjadi seolah-olah sebuah SHA1 hash, kita perlu menambahkan lagi hexadecimal sepanjang 8 karakter ke MD5 hash.
1random code = ^[a-f0-9]{8}
Contoh Script PHP
fungsi php di bawah ini yang nanti akan kita gunakan untuk menciptakan
karakter acak:
1function randomCode($length=10) {
2 $chars = 'abcdef0123456789';
3 $randomString = '';
4 for ($i = 0; $i < $length; $i++)
5 $randomString .= $chars[rand(0, strlen($chars) - 1)];
6 return $randomString;
7}
kemudian kita buat fungsi lagi untuk melakukan ‘manipulasi’ password:
1function customPasswd ($action="check", $plain=0, $hash=0) {
2 if ( $action == "check" ) {
3 if ( !preg_match('/^[a-f0-9]{40}$/i', $hash) )
4 return false;
5 $split = str_split($hash, 16);
6 $randomCode = str_split($split[1], 8);
7 $newPass = md5($plain . $randomCode[0]);
8 $split2 = str_split($newPass, 16);
9 $newPwd = $split2[0] . $randomCode[0] . $split2[1];
10 return $newPwd == $hash ? true : false;
11 }
12 else {
13 $randomCode = randomCode(8);
14 $hash = md5($plain . $randomCode);
15 $split = str_split($hash, 16);
16 $hash = $split[0] . $randomCode . $split[1];
17 return $hash;
18 }
19 return FALSE;
20}
Dari fungsi tersebut, dapat digunakan untuk menggenerate password dan melakukan pengecekan password sesuai dengan metode manipulasi password yang telah kita buat.
Sebelumnya saya akan mencoba menjelaskan bagaimana berjalannya fungsi tersebut.
Generate Password
Contoh penggunaan :
1$password = customPasswd('generate', 'passwordnya');
Kita pelajari terlebih dahulu metode generate passwordnya yang berada pada
block else { }.
1// snip
2else {
3 $randomCode = randomCode(8);
4 $hash = md5($plain . $randomCode);
5 $split = str_split($hash, 16);
6 $hash = $split[0] . $randomCode . $split[1];
7 return $hash;
8}
Dimana :
1$randomCode = randomCode(8);
Nilai yang nantinya kita ditambahkan dibelakang plain password yang kemudian kita enkripsi dengan MD5. (string 8 char length).
1$hash = md5($plain . $randomCode);
$hash diatas adalah hasil MD5 dari plaintext password + kode random
yang tadi kita ciptakan.
1$split = str_split($hash, 16);
2$hash = $split[0] . $randomCode . $split[1];
Tepat setelah karakter ke 16 pada hasil MD5 hash, kita sisipkan kode random yang sebelumnya sudah kita siapkan.
Misalnya kita mendapatkan nilai kode random ‘77979b20’, sedangkan plaintext
password adalah ‘rahasia’.
Maka hasil hash pertama (rahasia77979b20) adalah
dc236dbb5b9d3f6f672957167a5375d2.
Setelah itu dari hasil hash dc236dbb5b9d3f6f672957167a5375d2 kita sisipkan
kode random tadi setelah karakter ke 16, sehingga menjadi:
dc236dbb5b9d3f6f77979b20672957167a5375d2.
nilai itulah yang kita simpan pada database.
Check Password
Contoh penggunaan :
1if ( customPasswd('check', 'password', '22d1df7893539061bdee309156ce1530b913a6f6' ) ) {
2 echo 'Password valid' . "\n";
3}
4else {
5 echo 'Password invalid' . "\n";
6}
Untuk metode pengecekan passwordnya, lihat pada block
if ( $action == "check" ) { }:
1if ( !preg_match('/^[a-f0-9]{40}$/i', $hash) )
2 return false;
3$split = str_split($hash, 16);
4$randomCode = str_split($split[1], 8);
5$newPass = md5($plain . $randomCode[0]);
6$split2 = str_split($newPass, 16);
7$newPwd = $split2[0] . $randomCode[0] . $split2[1];
8return $newPwd == $hash ? true : false;
Dimana :
1if ( !preg_match('/^[a-f0-9]{40}$/i', $hash) )
2 return false;
Digunakan untuk pengecekan format password (karena sebelumnya sudah kita
tentukan untuk memanipulasi sehingga mirip dengan SHA1, maka regular
expression yang digunakan adalah [a-f0-9]{40}).
Jika format password dirasa benar, maka kita ambil nilai kode random yang kita sisipkan :
1$split = str_split($hash, 16);
2$randomCode = str_split($split[1], 8);
Setelah itu kita lanjutkan ke proses berikutnya dengan melakukan metode yang sama saat kita menggenerate password. Cocokan hasilnya dengan yang ada pada database. Jika nilainya sama, maka passwordnya valid, jika tidak password tidak valid.
1$newPass = md5($plain . $randomCode[0]);
2$split2 = str_split($newPass, 16);
3$newPwd = $split2[0] . $randomCode[0] . $split2[1];
4return $newPwd == $hash ? true : false;
Menggunakan MD5 dan SHA1 hanyalah sebuah contoh, dan peletakan kode random di tengah-tengah hash MD5 juga sebuah contoh. Anda dapat mengembangkan sesuai dengan kreatifitas masing-masing.

![spys[dot]ru Proxy Checker [PHP]](/blog/2013/02/spysdotru-proxy-checker-php/feature-spysruproxy_hu_78808465b710f59.5bcb844d03741749c376347a02d0a5d4.png)








