Fungsi password_hash
Sebenarnya fungsi md5 dan penggaraman
kata laluan menggunakannya dianggap lapuk.
Kami mempelajarinya agar anda memahami bahan
seterusnya, dan juga kerana anda mungkin menghadapinya
apabila bekerja dengan projek orang lain.
Terdapat cara yang lebih sempurna untuk mendapatkan
kata laluan bergaram. Untuk ini, fungsi
password_hash digunakan. Parameter pertamanya
menerima rentetan, dan yang kedua - algoritma penyulitan
(tentangnya kemudian), dan mengembalikan hash rentetan itu
bersama-sama dengan garam.
Cuba jalankan kod ini beberapa kali:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Anda akan mendapat hasil yang berbeza setiap kali dan dalam hasil tersebut, bahagian pertama rentetan akan menjadi garam, dan bahagian kedua - kata laluan bergaram.
Katakan kita ada hash, diperoleh daripada fungsi
password_hash dan beberapa kata laluan. Untuk
memeriksa sama ada ini hash kata laluan ini atau bukan,
gunakan fungsi password_verify
- parameter pertamanya menerima kata laluan,
dan yang kedua - hash, dan mengembalikan true
atau false.
Mari lihat contoh:
<?php
$password = '12345'; // kata laluan
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash daripada kata laluan ini
} else {
// hash bukan daripada kata laluan ini
}
?>
Apa yang ini berikan kepada kami secara praktikal: kami boleh tidak mencipta medan berasingan dalam pangkalan data untuk menyimpan garam, tidak pening menguruskan penjanaan garam ini - PHP akan melakukan semuanya untuk kami!
Maksudnya, dalam pangkalan data di medan
password kami akan menyimpan kata laluan bergaram
bersama-sama dengan garamnya. Pada masa yang sama, kata laluan
terhash akan mempunyai panjang yang lebih besar. Oleh itu
dalam pangkalan data, kami perlu membetulkan saiz
medan kata laluan dan menetapkannya kepada 60
aksara.
Sekarang mari kita betulkan kod pendaftaran. Ini yang ada sekarang:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // panjang garam
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // aksara daripada jadual ASCII
}
return $salt;
}
$salt = generateSalt(); // garam
$password = md5($salt . $_POST['password']); // tukar kata laluan kepada hash bergaram
?>
Dengan menggunakan password_hash, kami akan memendikkannya kepada:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Kod pengesahan akan dibetulkan dengan cara yang sama:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // dapatkan pengguna mengikut log masuk
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // kata laluan bergaram dari Pangkalan Data
// Semak kesesuaian hash dari pangkalan data dengan kata laluan yang dimasukkan
if (password_verify($_POST['password'], $hash)) {
// semuanya ok, sahkan...
} else {
// kata laluan tidak sesuai, paparkan mesej
}
} else {
// tiada pengguna dengan log masuk ini, paparkan mesej
}
?>
Ubah suai pengesahan dan pendaftaran anda kepada fungsi baru yang dipelajari.