i (am) Blogger and U?

from X-periment to X-perience

Anime/Movie Community Sharing (FullCustom)

Produk ini adalah aplikasi web full-custom yang diperuntukkan bagi Anda yang ingin membuat situs/web yang dapat menampilkan anime/movie dan dapat ditonton oleh para pengunjung. Video an [...]

One-Page Portofolio / Gallery 2

One-Page Portofolio / Gallery 2 memiliki fitur-fitur yang sama persis dengan One-Page Portofolio / Gallery 1 tapi dengan theme/template yang berbeda (theme yang dipakai pada versi ini a [...]

Aplikasi Web: Online Shop PRO 1

Toko Online Pro 1 adalah paket full-features aplikasi toko online yang dapat digunakan untuk menjalankan bisnis Anda secara online. Aplikasi ini memiliki fitur-fitur unggulan dan lengk [...]

Aplikasi Web: WebReview-Series 1

Web Review-Series 1 adalah paket aplikasi web yang memfasilitasi Anda yang ingin membuat situs yang berisi review dari berbagai hal. Review tentang suatu produk, Review tentang suatu te [...]

Aplikasi Web: WebReview-Series 2

Web Review-Series 2 memiliki fitur-fitur yang sama persis dengan Web Review-Series 1 tapi dengan theme/template yang berbeda (theme yang dipakai pada versi ini adalah theme yang respons [...]

Aplikasi Web: URL Shortener Complete 1

URL Shortener Complete 1 adalah aplikasi yang membantu Anda untuk menjalankan situs/web yang memiliki fasilitas URL shortener. Pemendek URL sesuai namanya berfungsi untuk memangkas alam [...]

Tips Memperpanjang (Mengamankan) Password dengan Hashing

Category: Tips dan TrikDate:
Wednesday, 15 Sep 2010

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