Jangan gunakan MD5 untuk enkripsi password

Kategori: Belajar PHP
8 minutes
Jangan gunakan MD5 untuk enkripsi password

Jangan gunakan MD5 untuk enkripsi password. kalau Anda masih menggunakannya mungkin buku yang Anda masih buku lama sebelum PHP  5.5. Boleh boleh saja sih sebenarnya tapi saya pernah mencoba script untuk mengurai MD5 atau mungkin lebih tepatnya menebak hash MD5. Seperti yang banyak diperdebatkan, MD5 itu hash dan tidak dapat diurai, tapi masih bisa ditebak khan? Bisa dicocokkan khan? Coba baca-baca rainbow table. Atau enaknya search saja di google md5 decrypt. Kalau kita kopas MD5 hash di situ kemungkinan kita bisa menemukan passwordnya apa.

Selain itu saya penah baca buku koleksi lama saya, untuk memperkuat hash MD5 normalnya dikasih 'salt' namun yang di buku ini menganjurkan "di-hash kemudian dienkripsi". Boleh-boleh saja sih namun klasik banget, bukunya saya beli pas tanggal 02 September 2006. Hafal, Saya tulis tanggal beli di bukunya soale.
Berat di server ya kak, ini contoh yang salah. Mari kita intip kodenya.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
// contoh yang salah
// Enkripsi plain text, return chipertext
function encrypt($str) {
    //di-hash kemudian dienkripsi
    $chiper = crypt(md5($str), md5($str));
    return $chiper;
}

echo encrypt('sapi');

//outputnya: f8zG3EwCuN9EA

Sekali lagi, atas ini contoh yang salah lho ya. 
Berikut cara yang benar

1
2
3
4
5
6
7
8
9
<?php
// cara yang benar enkrip/ hash password
$password_saya = 'password123';
$passwordHash = password_hash($password_saya, PASSWORD_DEFAULT);

echo $passwordHash;
//outputnya: $2y$10$Z/NCgae0Z9ZwDcsFQVeX..GAt22C2RofwUxCuLEjDcdV1WMPMJJ8q
//kalau direfresh: $2y$10$HAZA0mk7UxzGVgd8JUG11OVidPDo0lx24SstzVXG9MzaLTtfkCzuS
// refresh lagi hasilnya beda lagi

Ringan dan hasil hash langsung aman untuk kita simpan di database. Password yang sama hasil hashnya beda pula. Namanya juga hash.

Kemudian bagaimana cara memverifikasi passwordnya benar? Mudah saja, tinggal pakai password_verify. Kodenya seperti ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
$password_saya = 'password123';
$passwordHash = password_hash($password_saya, PASSWORD_DEFAULT);

echo $passwordHash;

if (password_verify('password-salah', $passwordHash)) {
    // Password benar
    echo '<p>password Anda benar</p>';
} else {
    // Password salah
    echo '<p>password Anda salah</p>';
}

Mudah khan?

Untuk sha1 sama saja kasusnya, apalagi tanpa salt. Gak etis banget membiarkan password pelanggan tersebar dan gampang ditebak passwordnya. Bisa saja database kita dibuka orang. Kalau hashnya OK khan ga bisa ditebak itu password. 

Jangan pakai fungsi hash lainnya atau lebih parah lagi bikin fungsi enkrip decrypt sendiri dengan PHP untuk menyimpan password. Wassalam.