Funktsioon password_hash
Tegelikult loetakse funktsioon md5 ja parooli soolamine
selle abiga vananenuks.
Me õppisime seda selleks, et te mõistaksite edasist
materjali, aga ka seetõttu, et võite sellega kokku puutuda
töötades teiste projektidega.
On olemas täiuslikum viis soolatud parooli saamiseks.
Selleks kasutatakse funktsiooni
password_hash. Esimese parameetrina võtab see
stringi ja teise parameetrina - krüpteerimisalgoritmi
(sellest hiljem), ning tagastab selle stringi räsi
koos soolaga.
Proovige mitu korda käivitada seda koodi:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Iga kord saate te erineva tulemuse ja selles tulemuses on stringi esimene osa sool ning teine osa - soolatud parool.
Oletame, et meil on funktsioonist
password_hash saadud räsi ja mingi parool. Et
kontrollida, kas see on selle parooli räsi või mitte,
tuleks kasutada funktsiooni password_verify
- esimese parameetrina võtab see parooli,
ning teise parameetrina - räsi, ja tagastab true
või false.
Vaatame näidet:
<?php
$password = '12345'; // parool
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // räsi
if (password_verify($password, $hash)) {
// räsi sellelt paroolilt
} else {
// räsi pole sellelt paroolilt
}
?>
Mida see meile praktikas annab: me ei pea looma andmebaasis eraldi välja soola salvestamiseks, ega muretsema soola genereerimise pärast - PHP teeb kõik meie eest!
See tähendab, et andmebaasis salvestame väljale
password me soolatud
parooli koos selle soolaga. Samal ajal on räsitud
paroolil suurem pikkus. Seepärast
peame andmebaasis paroolivälja pikkust
muutma ja määrama selleks 60
tähemärki.
Nüüd parandame registreerimise koodi. Siin on see, mis on praegu:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // soola pikkus
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // sümbol ASCII-tabelist
}
return $salt;
}
$salt = generateSalt(); // sool
$password = md5($salt . $_POST['password']); // teisendame parooli soolatud räsiks
?>
Funktsiooni password_hash abil vähendame selle järgnevalt:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Samamoodi kohandatakse autoriseerimise kood:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // saame kasutaja login-i järgi
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // soolatud parool andmebaasist
// Kontrollime, kas andmebaasist saadud räsi vastab sisestatud paroolile
if (password_verify($_POST['password'], $hash)) {
// kõik korras, autoriseerime...
} else {
// parool ei sobinud, kuvame teate
}
} else {
// sellise loginiga kasutajat pole, kuvame teate
}
?>
Muutke oma autoriseerimine ja registreerimine uute õpitud funktsioonide peale.