password_hash funksiyasi
Əslində md5 funksiyası və onun köməyi ilə
parolun duzlanması köhnəlib sayılır.
Biz onu öyrəndik ki, sonrakı materialı başa düşəsiniz,
həmçinin ona görə ki, başqalarının layihələri ilə işləyərkən
bununla qarşılaşa bilərsiniz.
Duzlu parol əldə etmək üçün daha mükəmməl bir üsul var.
Bunun üçün password_hash funksiyası istifadə olunur.
İlk parametr kimi o, sətiri qəbul edir, ikinci parametr isə
şifrələmə alqoritmidir (bu barədə sonra), və həmin sətrin
hash-ini duzla birlikdə qaytarır.
Bu kodu bir neçə dəfə işə salmağa çalışın:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Hər dəfə fərqli nəticə alacaqsınız və bu nəticədə sətrin birinci hissəsi duz, ikinci hissəsi isə duzlu parol olacaq.
Tutaq ki, bizdə password_hash funksiyasından
alınmış bir hash və hansısa bir parol var.
Bunun həmin parolun hash-i olub-olmadığını yoxlamaq üçün
password_verify funksiyasından istifadə etmək lazımdır
- ilk parametr kimi o, parolu qəbul edir,
ikinci parametr isə hash-dir, və true
ya da false qaytarır.
Gəlin nümunəyə baxaq:
<?php
$password = '12345'; // parol
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// bu parolun hash-i
} else {
// hash bu paroldan deyil
}
?>
Bu, praktikada bizə nə verir: biz verilənlər bazasında duzu saxlamaq üçün ayrıca bir sahə yaratmaya, bu duzu yaratmaqla məşğul olmaya ehtiyac duymuruq - PHP hər şeyi bizim üçün edəcək!
Yəni belə çıxır ki, verilənlər bazasında
password sahəsində biz duzlu
parolu onun duzu ilə birlikdə saxlayacayıq.
Eyni zamanda, hash-lənmiş parol daha böyük uzunluğa malik olacaq.
Ona görə də verilənlər bazasında parol sahəsinin ölçüsünü
düzəltməli və onu 60 simvol təyin etməliyik.
İndi gəlin qeydiyyat kodunu düzəldək. Budur, hazırda olan:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // duzun uzunluğu
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ASCII cədvəlindən simvol
}
return $salt;
}
$salt = generateSalt(); // duz
$password = md5($salt . $_POST['password']); // parolu duzlu hash-ə çeviririk
?>
password_hash köməyi ilə biz bunu buna qədər qısaldarıq:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Eyni şəkildə avtorizasiya kodu da düzəldiləcək:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // istifadəçini logina görə alırıq
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // VB-dən duzlu parol
// Bazadan olan hash-in daxil edilmiş parola uyğunluğunu yoxlayırıq
if (password_verify($_POST['password'], $hash)) {
// hər şey qaydasında, avtorizasiya edirik...
} else {
// parol uyğun gəlmədi, mesaj çıxardarıq
}
} else {
// belə bir login ilə istifadəçi yoxdur, mesaj çıxardarıq
}
?>
Avtorizasiya və qeydiyyatınızı yeni öyrənilmiş funksiyalara uyğun olaraq dəyişdirin.