Funktionen password_hash
Egentligen anses funktionen md5 och saltning
av lösenord med dess hjälp vara föråldrad.
Vi studerade den så att du skulle förstå det vidare
materialet, och även för att du kan stöta på det
när du jobbar med andras projekt.
Det finns ett mer perfekt sätt att få
ett saltat lösenord. För detta används funktionen
password_hash. Den tar som första parameter en
sträng, och som andra - krypteringsalgoritmen
(mer om det senare), och returnerar ett hash av denna sträng
tillsammans med saltet.
Försök att köra denna kod flera gånger:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Du kommer att få ett annat resultat varje gång och i detta resultat kommer den första delen av strängen att vara saltet, och den andra delen - det saltade lösenordet.
Låt oss säga att vi har ett hash, erhållet från funktionen
password_hash och något lösenord. För att
kontrollera om detta är hash för detta lösenord eller inte,
bör funktionen password_verify användas
- den tar som första parameter lösenordet,
och som andra - hashet, och returnerar true
eller false.
Låt oss titta på ett exempel:
<?php
$password = '12345'; // lösenord
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash från detta lösenord
} else {
// hash inte från detta lösenord
}
?>
Vad ger detta oss i praktiken: vi behöver inte skapa ett separat fält i databasen för att lagra salt, inte bry oss om att generera detta salt - PHP gör allt åt oss!
Det kommer alltså att bli så att i databasen i fältet
password kommer vi att lagra det saltade
lösenordet tillsammans med dess salt. Samtidigt kommer det hashade
lösenordet att ha en större längd. Därför
måste vi i databasen korrigera storleken
på lösenordsfältet och sätta den till 60
tecken.
Låt oss nu rätta till registreringskoden. Här är vad vi har nu:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // saltlängd
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // tecken från ASCII-tabellen
}
return $salt;
}
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // omvandlar lösenord till saltat hash
?>
Med hjälp av password_hash kan vi reducera detta till:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
På samma sätt kommer inloggningskoden att justeras:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // hämtar användaren via inloggningen
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // saltat lösenord från databasen
// Kontrollerar överensstämmelsen mellan hashet från databasen och det inmatade lösenordet
if (password_verify($_POST['password'], $hash)) {
// allt ok, loggar in...
} else {
// lösenordet matchade inte, visa meddelande
}
} else {
// det finns ingen användare med detta inloggningsnamn, visa meddelande
}
?>
Ändra din inloggning och registrering till de nya inlärda funktionerna.