i (am) Blogger and U?

from X-periment to X-perience

Profile / Portofolio Pro 1

Aplikasi Profil / Portofolio Pro 1, software berbasis web untuk pengelolaan portofolio atau untuk menampilkan profil baik perusahaan maupun perseorangan. Selain itu software ini dapat p [...]

Toko Online Barang Digital 1

Toko Online Barang Digital 1 adalah paket full-features aplikasi toko online khusus untuk benda/barang digital seperti aplikasi/software atau ebook pdf, doc dkk yang dapat digunakan unt [...]

Template: ANIME-MAX

ANIME-MAX adalah HTML template (menggunakan Bootstrap 3.3.6) yang ditujukan untuk situs yang menyediakan link download atau nonton online video dalam kasus ini contohnya adalah anime ta [...]

Aplikasi Web: Forum Mirip Twitter

Aplikasi ini merupakan aplikasi layaknya forum pada umumnya. Hal spesial dari aplikasi ini adalah adanya tambahan yang mirip dengan Twitter. Fitur-fitur yang dimiliki antara lain: foll [...]

Online Shop Basic 2

Online Shop Basic 2 adalah paket minimalis aplikasi toko online instan yang dapat digunakan untuk menjalankan bisnis secara online. Aplikasi ini adalah aplikasi toko online yang "sudah [...]

Web Profil / Portofolio Basic 1

Web Profil/Portofolio Basic 1, aplikasi/software untuk mengelola portofolio (atau bisa juga dijadikan sebagai photo/image gallery) atau untuk menampilkan profil perusahaan maupun perseo [...]

2010
15Sept

Tips Memperpanjang (Mengamankan) Password dengan Hashing

Post category: Tips dan Trik

Mungkin dulu password dengan panjang karakter 6 digit sudah cukup handal untuk mengamankan data-data penting. Semakin lama dengan semakin murahnya biaya komputasi maka 6 digit sudah dianggap tidak aman dan kemudian ditingkatkan menjadi 8 digit. Perkembangan selanjutnya adalah mengkombinasikan apa yang biasa disebut 'salt' untuk 'memperpanjang' digit password. Dengan penambahan salt maka password yang tadinya memiliki panjang n maka sekarang setelah ditambahi salt maka panjangnya "menjadi bertambah". Satu hal lagi yang perlu diingat adalah jangan menyimpan password user ke database dalam bentuk "plain text" tanpa dilakukan hashing terlebih dahulu (jadi yang tahu password aslinya hanyalah user yang bersangkutan).

Perlu diingat, password dengan panjang 8 digit dalam sebuah penelitian di Georgia Tech sudah bisa dipecahkan dalam beberapa jam dengan menggunakan "clusters of graphics cards". Password yang diteliti adalah password 8 digit dalam bentuk setelah dikenakan hashing. Kalau panjang 8 digit saja 'hanya' perlu beberapa jam saja maka kalau digitnya kurang dari itu maka waktu yang dibutuhkan "tentu saja (seharusnya)" lebih singkat lagi. Bahkah 6 digit password yang semuanya berupa huruf dapat dipecahkan dalam beberapa menit saja. Tentu saja semakin "ke sini" bakalan semakin cepat.

Oke, tak usah basa-basi lagi. Sekarang mari kita coba membuat password dengan kombinasi hashing sehingga password yang tadinya hanya 8 digit sekarang "seolah-olah menjadi lebih panjang". Katakanlah password yang digunakan adalah "$aYaLup4" (tanpa tanda petik).

Maka sekarang kita akan melakukan kombinasi hashing seperti ini:
$password1 = md5("$aYaLup4");
$password2 = sha1("iNi_SaLt".$password1);


$password1 hasilnya adalah d41d8cd98f00b204e9800998ecf8427e kemudian ditambahi salt ("iNi_SaLt" tanpa tanda petik) lalu dikenakan hashing md5 akhirnya password menjadi iNi_SaLtd41d8cd98f00b204e9800998ecf8427e lalu password ini dikenakan hashing sha1. Dengan demikian maka password yang disimpan di database (atau tempat lain) adalah 84959bdaa6b843e352fdd365cf7991055c3ee731

Dengan cara ini meskipun ditemukan bahwa password anda adalah 84959bdaa6b843e352fdd365cf7991055c3ee731 tapi ketika dilakukan misalnya "brute force attack" maka yang didapatkan adalah iNi_SaLtd41d8cd98f00b204e9800998ecf8427e dan bukannya password asli Anda. "Salt" sebaiknya isinya sesuatu yang unik (tiap user memiliki "salt" yang berbeda) dengan panjang karakter minimal 15 agar lebih susah lagi password untuk dipecahkan.

Kombinasi hashing di atas sangat sederhana dan bisa digunakan lagi yang lainnya. Sebagai contoh dengan dua buah salt:
$password1 = md5("$aYaLup4");
$password2 = sha1("iNi_SaLt".$password1);
$password3 = sha1("iNi_SaLt_ke-2".$password2);


dan yang ini dengan dua buah salt dan salah satu salt dikenakan hashing:
$password1 = md5("$aYaLup4");
$password2 = sha1("iNi_SaLt".$password1);
$password3 = sha1(sha1("iNi_SaLt_ke-2").$password2);


dan yang ini dengan dua buah salt dan kedua salt dikenakan hashing:
$password1 = md5("$aYaLup4");
$password2 = sha1(md5("iNi_SaLt").$password1);
$password3 = sha1(sha1("iNi_SaLt_ke-2").$password2);


Untuk validasinya ya sama saja. Cukup cocokkan password yang diinputkan dengan password yang tersimpan. Misalnya untuk kombinasi:
$password1 = md5("$aYaLup4");
$password2 = sha1("iNi_SaLt".$password1);


maka validasinya (dalam PHP):
$password1 = md5($_POST['password']);
$password2 = sha1("iNi_SaLt".$password1);


Cocokkan $password2 dengan misalnya $password_user (yang disimpan dalam database). Kalau sama berarti valid. Sebenarnya sekuat apapun sistem yang dibangun ada banyak hal yang mempengaruhi keamanannya. Kalau sistemnya sudah lumayan "secure" tapi user banyak yang ceroboh maka tetap bisa kebobolan. Jadi, sudahkan Anda memiliki password (atau sistem penyimpanan password) yang aman?

Update:
Mulai PHP 5.6.0 untuk memeriksa dua hash apakah sama dapat digunakan "function" hash_equals(). Apabila server Anda masih menggunakan PHP versi di bawah 5.6.0 maka Anda bisa menggunakan "function" di bawah ini untuk melakukan hal yang sama:

if(! function_exists('hash_equals')) {
function hash_equals($a, $b) {
$ret = strlen($a) ^ strlen($b);
$ret |= array_sum(unpack("C*", $a^$b));
return !$ret;
}
}


Untuk saat ini sebaiknya dihindari menggunakan "hash yang lemah" seperti sha1 dan md5 untuk penyimpanan password (karena sha1 dan md5 dibuat bukan ditujukan untuk "password storage"). Anda bisa menggunakan "function" hash_pbkdf2() atau password_hash() (mulai ada sejak PHP 5.5.0) atau kalau server Anda masih menggunakan PHP versi di bawah 5.5.0 maka Anda bisa menggunakan https://defuse.ca/php-pbkdf2.htm atau https://github.com/ircmaxell/password_compat/ untuk melakukan hal yang sama.


No comments...
>> Comments closed. <<