Funkcija password_hash
Patiesībā funkcija md5 un paroles sālīšana
ar tās palīdzību tiek uzskatīta par novecojušu.
Mēs to pētījām, lai jūs saprastu turpmāko
materiālu, kā arī tāpēc, ka jūs varat ar to saskarties,
strādājot ar svešiem projektiem.
Pastāv pilnveidotāks veids, kā iegūt
sālītu paroli. Šim nolūkam tiek izmantota funkcija
password_hash. Pirmā parametrā tā
pieņem virkni, bet otro - šifrēšanas algoritmu
(par to vēlāk), un atgriež šīs virknes hešu
kopā ar sāli.
Mēģiniet vairākas reizes palaist šo kodu:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Katru reizi jūs saņemsiet atšķirīgu rezultātu, un šajā rezultātā pirmā virknes daļa būs sāls, bet otrā daļa - sālītā parole.
Pieņemsim, ka mums ir hešs, kas iegūts no funkcijas
password_hash un kāda parole. Lai
pārbaudītu, vai šis ir šīs paroles hešs vai nē,
jāizmanto funkcija password_verify
- pirmā parametrā tā pieņem paroli,
bet otro - hešu, un atgriež true
vai false.
Apskatīsim piemērā:
<?php
$password = '12345'; // parole
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hešs
if (password_verify($password, $hash)) {
// hešs no šīs paroles
} else {
// hešs nav no šīs paroles
}
?>
Ko tas mums dod praksē: mēs varam ne izveidot atsevišķu lauku datu bāzē sāls glabāšanai, nečakarēties ar šīs sāls ģenerēšanu - PHP visu izdarīs mūsu vietā!
Tas nozīmē, ka datu bāzē laukā
password mēs glabāsim sālīto
paroli kopā ar tās sāli. Turklāt hešētā
parole būs lielāka garumā. Tāpēc
datu bāzē mums ir jālabo
paroles lauka izmērs un jāiestata tas uz 60
rakstzīmēm.
Tagad labosim reģistrācijas kodu. Lūk, tas, kas ir šobrīd:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // sāls garums
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // simbols no ASCII-tabulas
}
return $salt;
}
$salt = generateSalt(); // sāls
$password = md5($salt . $_POST['password']); // pārveidojam paroli par sālītu hešu
?>
Izmantojot password_hash, mēs to samazināsim līdz:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Līdzīgā veidā tiks labots autorizācijas kods:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // iegūstam lietotāju pēc lietotājvārda
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // sālītā parole no datu bāzes
// Pārbaudām heša no datu bāzes atbilstību ievadītajai parolei
if (password_verify($_POST['password'], $hash)) {
// viss kārtībā, autorizējam...
} else {
// parole neder, izvadām paziņojumu
}
} else {
// lietotāja ar šādu lietotājvārdu nav, izvadām paziņojumu
}
?>
Pārveidojiet savu autorizāciju un reģistrāciju, izmantojot jaunās apgūtās funkcijas.