Fungsi password_hash
Sebenarnya fungsi md5 dan penggaraman
password dengan menggunakannya dianggap usang.
Kami mempelajarinya agar Anda memahami materi
selanjutnya, dan juga karena Anda mungkin menemukannya
saat bekerja dengan proyek orang lain.
Ada cara yang lebih canggih untuk mendapatkan
password yang digaram. Untuk ini digunakan fungsi
password_hash. Parameter pertamanya menerima
string, dan parameter kedua - algoritma enkripsi
(tentang ini nanti), dan mengembalikan hash dari string tersebut
bersama dengan garam.
Coba jalankan kode ini beberapa kali:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Anda akan mendapatkan hasil yang berbeda setiap kali dan dalam hasil tersebut bagian pertama string akan menjadi garam, dan bagian kedua - password yang digaram.
Misalkan kita memiliki hash, yang diperoleh dari fungsi
password_hash dan suatu password. Untuk
memeriksa, apakah ini hash dari password tersebut atau bukan,
harus digunakan fungsi password_verify
- parameter pertamanya menerima password,
dan parameter kedua - hash, dan mengembalikan true
atau false.
Mari kita lihat contohnya:
<?php
$password = '12345'; // password
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash dari password ini
} else {
// hash bukan dari password ini
}
?>
Apa yang ini berikan kepada kita dalam praktik: kita dapat tidak membuat field terpisah dalam database untuk menyimpan garam, tidak repot dengan pembuatan garam ini - PHP akan melakukan semuanya untuk kita!
Artinya, dalam database di field
password kita akan menyimpan
password yang digaram bersama dengan garamnya.
Dalam hal ini password yang di-hash
akan memiliki panjang yang lebih besar. Oleh karena itu
dalam database kita perlu memperbaiki ukuran
field password dan mengaturnya menjadi 60
karakter.
Sekarang mari kita perbaiki kode pendaftaran. Berikut adalah yang ada saat ini:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // panjang garam
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // karakter dari ASCII-table
}
return $salt;
}
$salt = generateSalt(); // garam
$password = md5($salt . $_POST['password']); // ubah password menjadi hash yang digaram
?>
Dengan menggunakan password_hash kita dapat meringkasnya menjadi:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Demikian pula kode otorisasi akan disesuaikan:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // dapatkan user berdasarkan login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // password yang digaram dari DB
// Periksa kecocokan hash dari database dengan password yang dimasukkan
if (password_verify($_POST['password'], $hash)) {
// semua ok, otorisasi...
} else {
// password tidak cocok, tampilkan pesan
}
} else {
// tidak ada user dengan login seperti itu, tampilkan pesan
}
?>
Ubah otorisasi dan pendaftaran Anda menjadi fungsi-fungsi baru yang telah dipelajari.