Menggunakan Hashing API untuk Hash Password di PHP 5.5

time to read 3 min | 617 words

Hari gini masih pake MD5 ?

Menggunakan bcrypt adalah cara terbaik untuk hashing password, tetapi sejumlah besar developer masih menggunakan algoritma yang lebih tua dan lebih lemah seperti MD5 dan SHA1. Banyak developer PHP bahkan tidak menggunakan salt saat hashing. API hashing baru di PHP 5.5 bertujuan untuk menarik perhatian terhadap bcrypt sementara menyembunyikan kompleksitasnya. Pada artikel kali ini saya akan membahas dasar-dasar penggunaan API hashing baru PHP.

Hashing API baru memiliki 4 fungsi sederhana:

  • password_hash() – digunakan untuk hashing password.
  • password_verify() – digunakan untuk memverifikasi password terhadap hash nya.
  • password_needs_rehash() – digunakan ketika password perlu di hash ulang.
  • password_get_info() – memberikan info tentang algoritma hasing yang digunakan serta option yang digunakan ketika hashing sebuah password

Sejumlah besar developer PHP masih menggunakan algoritma hashing yang sangat tua dan lemah, seperti MD5 dan SHA1.


password_hash()

Meskipun fungsi crypt() aman, telah dianggap oleh banyak programmer bahwa fungsi ini terlalu rumit dan rawan kesalahan. Beberapa developer kemudian menggunakan salt dan algoritma yang lemah untuk menghasilkan hash dari sebuah password, misalnya:

<?php  
$hash = md5($password . $salt);

Tetapi fungsi password_hash() dapat membuat kode kamu lebih aman. Ketika kamu membutuhkan sebuah password untuk di hash, tinggal masukkan password ke dalam fungsi dan kamu akan mendapatkan hash yang selanjutnya disimpan ke database.

<?php  
$hash = password_hash($password, PASSWORD_DEFAULT);

Mudah kan! Parameter pertama adalah string password yang perlu hash dan parameter kedua menentukan algoritma yang harus digunakan untuk menghasilkan hash.

Algoritma standar dari fungsi tersebut adalah bcrypt, tetapi algoritma yang lebih kuat dapat ditambahkan sebagai default di masa yang akan datang dan dapat menghasilkan string yang lebih besar. Jika kamu menggunakan PASSWORD_DEFAULT dalam proyek kamu, pastikan untuk menyimpan hash dalam kolom yang memiliki kapasitas lebih dari 60 karakter. Mengatur kapasitas menjadi 255 karakter mungkin menjadi pilihan yang baik. Kamu juga bisa menggunakan PASSWORD_BCRYPT sebagai parameter kedua. Dalam hal ini hasilnya akan selalu 60 karakter.

Yang penting di sini adalah bahwa kamu tidak harus memberikan salt atau parameter cost. API baru ini akan mengurus semua itu untuk kamu. Dan salt merupakan bagian dari hash, sehingga kamu tidak harus menyimpannya secara terpisah. Jika kamu ingin memberikan salt atau cost kamu sendiri, kamu dapat melakukannya dengan memberikan argumen ketiga untuk fungsi.

<?php  
$options = ['salt' => fungsi_salt(), //buat fungsi untuk generate salt
'cost' => 12 // default option ini adalah 10  
]
$hash = password_hash($password, PASSWORD_DEFAULT, $options);

password_verify()

Sekarang kamu sudah melihat bagaimana untuk menghasilkan hash dengan API baru, mari kita lihat bagaimana untuk memverifikasi password. Ingat bahwa kamu menyimpan hash di database, tapi ketika pengguna log in , kamu mendapatkan password polos. Fungsi password_verify() mengambil password polos dan string hash sebagai dua argumen. Ia mengembalikan nilai true jika hash cocok dengan password pasangannya . Contoh:

<?php  
if (password_verify($password, $hash)) {  
// Sukses!
}
else {  
// Password salah!
}

password_needs_rehash()

Bagaimana jika kamu perlu mengubah parameter salt dan cost untuk string hash? Ini mungkin terjadi karena kamu memutuskan untuk meningkatkan keamanan dengan menambahkan salt yang lebih kuat atau parameter cost yang lebih besar. Selain itu, PHP dapat mengubah implementasi standar dari algoritma hashing. Dalam semua kasus ini, kamu akan ingin mengulangi hashing password yang ada.


password_get_info()

password_get_info() menerima hash dan mengembalikan sebuah array asosiatif yang terdiri dari tiga unsur:

  • algo - konstanta yang mengidentifikasi algoritma tertentu

  • algoName - nama algoritma yang digunakan

  • Options - berbagai pilihan yang digunakan saat menghasilkan hash

Kesimpulan

API baru untuk hashing password ini lebih mudah untuk dipakai daripada meraba-raba fungsi crypt(). Jika situs Web kamu saat ini berjalan pada PHP 5.5, maka saya sangat menyarankan agar kamu menggunakan API hashing baru. Kalau kamu menggunakan PHP 5.3.7 (atau yang lebih baru) dapat menggunakan library password_compat yang mengemulasi API baru ini dan secara otomatis menonaktifkan dirinya sendiri ketika versi PHP di upgrade ke 5.5.