Functie password_hash
In feite worden de functie md5 en het zouten
van een wachtwoord ermee als verouderd beschouwd.
We hebben het bestudeerd zodat je het verdere
materiaal begrijpt, en ook omdat je het kunt
tegenkomen bij het werken met projecten van anderen.
Er bestaat een meer geavanceerde manier om een
gezouten wachtwoord te verkrijgen. Hiervoor wordt de functie
password_hash gebruikt. Als eerste parameter accepteert ze
een string, en als tweede - het versleutelingsalgoritme
(hierover later), en retourneert ze de hash van deze string
samen met het zout.
Probeer deze code een paar keer uit te voeren:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Je zult elke keer een ander resultaat krijgen en in dit resultaat zal het eerste deel van de string het zout zijn, en het tweede deel - het gezouten wachtwoord.
Stel we hebben een hash, verkregen van de functie
password_hash en een wachtwoord. Om
te controleren of dit de hash van dit wachtwoord is of niet,
moet je de functie password_verify gebruiken
- als eerste parameter accepteert ze het wachtwoord,
en als tweede - de hash, en retourneert ze true
of false.
Laten we naar een voorbeeld kijken:
<?php
$password = '12345'; // wachtwoord
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash van dit wachtwoord
} else {
// hash niet van dit wachtwoord
}
?>
Wat levert ons dit op in de praktijk: we hoeven geen apart veld in de database aan te maken voor het opslaan van het zout, ons niet druk te maken over het genereren van dit zout - PHP doet alles voor ons!
Dat betekent dat we in de database in het veld
password het gezouten
wachtwoord samen met zijn zout zullen opslaan. Hierbij
zal de gehashte
wachtwoord een grotere lengte hebben. Daarom
moeten we in de database de grootte van
het wachtwoordveld aanpassen en instellen op 60
tekens.
Laten we nu de registratiecode aanpassen. Dit is wat we nu hebben:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lengte van het zout
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // teken uit ASCII-tabel
}
return $salt;
}
$salt = generateSalt(); // zout
$password = md5($salt . $_POST['password']); // transformeer wachtwoord naar gezouten hash
?>
Met password_hash kunnen we dit terugbrengen tot:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Op eenzelfde manier wordt de autorisatiecode aangepast:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // verkrijg gebruiker op basis van login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // gezouten wachtwoord uit de database
// Controleer de overeenkomst van de hash uit de database met het ingevoerde wachtwoord
if (password_verify($_POST['password'], $hash)) {
// alles ok, autoriseer...
} else {
// wachtwoord kwam niet overeen, toon bericht
}
} else {
// er is geen gebruiker met deze login, toon bericht
}
?>
Verbeter je autorisatie en registratie met de nieuwe bestudeerde functies.