Funksie password_hash
In werklikheid word die funksie md5 en die sout van 'n wagwoord daarmee as verouderd beskou. Ons het dit bestudeer sodat jy die verdere materiaal kan verstaan, en ook omdat jy dit kan teëkom wanneer jy met ander mense se projekte werk.
Daar is 'n meer gevorderde manier om 'n gesoute wagwoord te kry. Vir dit word die funksie password_hash gebruik. Sy eerste parameter neem 'n string, en die tweede - die enkripsie-algoritme (hieroor later), en dit gee 'n hash van die string saam met die sout terug.
Probeer om hierdie kode 'n paar keer te hardloop:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Jy sal elke keer 'n ander resultaat kry en in hierdie resultaat sal die eerste deel van die string die sout wees, en die tweede deel - die gesoute wagwoord.
Kom ons sê ons het 'n hash, verkry van die funksie password_hash en 'n sekere wagwoord. Om te toets of dit die hash van hierdie wagwoord is of nie, moet die funksie password_verify gebruik word - sy eerste parameter neem die wagwoord, en die tweede - die hash, en dit gee true of false terug.
Kom ons kyk na 'n voorbeeld:
<?php
$password = '12345'; // wagwoord
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash van hierdie wagwoord
} else {
// hash nie van hierdie wagwoord nie
}
?>
Wat gee dit ons in die praktyk: ons hoef nie 'n aparte veld in die databasis te skep vir die stoor van sout nie, hoef nie te sukkel met die generering van hierdie sout nie - PHP sal alles vir ons doen!
Dit beteken dat ons in die databasis in die veld password die gesoute wagwoord saam met sy sout sal stoor. Terselfdertyd sal die gehashte wagwoord 'n groter lengte hê. Daarom moet ons die grootte van die wagwoordveld in die databasis regstel en dit op 60 karakters stel.
Kom ons regig nou die registrasie-kode. Hier is wat ons tans het:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lengte van sout
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // karakter uit ASCII-tabel
}
return $salt;
}
$salt = generateSalt(); // sout
$password = md5($salt . $_POST['password']); // omskep wagwoord na gesoute hash
?>
Met behulp van password_hash sal ons dit verminder tot:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Die kode vir aanmelding sal ooreenstemmend aangepas word:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // kry gebruiker volgens login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // gesoute wagwoord uit DB
// Toets of die hash uit die databasis ooreenstem met die ingevoerde wagwoord
if (password_verify($_POST['password'], $hash)) {
// alles reg, meld aan...
} else {
// wagwoord het nie gepas nie, toon boodskap
}
} else {
// geen gebruiker met so 'n login nie, toon boodskap
}
?>
Herskep jou aanmeld- en registrasieproses na die nuutgeleerde funksies.