Funksjonen password_hash
Faktisk anses funksjonen md5 og salting
av passord med den som foreldet.
Vi studerte den for at du skal forstå det videre
stoffet, og også fordi du kan støte på dette
når du jobber med andres prosjekter.
Det finnes en mer avansert måte å få
et saltet passord. For dette brukes funksjonen
password_hash. Den første parameteren tar den imot
en streng, og den andre - krypteringsalgoritmen
(mer om det senere), og returnerer en hash av denne strengen
sammen med saltet.
Prøv å kjøre denne koden flere ganger:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Du vil hver gang få et annet resultat og i dette resultatet vil den første delen av strengen være saltet, og den andre delen - det saltede passordet.
La oss si at vi har en hash, hentet fra funksjonen
password_hash og et eller annet passord. For å
sjekke om dette er hashen til dette passordet eller ikke,
bor man bruke funksjonen password_verify
- den første parameteren tar imot passordet,
og den andre - hashen, og returnerer true
eller false.
La oss se på et eksempel:
<?php
$password = '12345'; // passord
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// hash fra dette passordet
} else {
// hash ikke fra dette passordet
}
?>
Hva gir dette oss i praksis: vi kan unngå å opprette et eget felt i database for lagring av salt, ikke bry oss med generering av dette saltet - PHP vil gjøre alt for oss!
Det vil si at det vil bli slik at i databasen, i feltet
password vil vi lagre det saltede
passordet sammen med dets salt. Samtidig vil den hashede
passordet ha en større lengde. Derfor
bor vi i databasen rette størrelsen
på passordfeltet og sette den til 60
tegn.
La oss nå rette koden for registrering. Her er det vi har nå:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lengde på saltet
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // tegn fra ASCII-tabell
}
return $salt;
}
$salt = generateSalt(); // salt
$password = md5($salt . $_POST['password']); // gjør om passordet til en saltet hash
?>
Ved hjelp av password_hash kan vi forkorte dette til:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
På samme måte justeres autorisasjonskoden:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // henter brukeren via loginn
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // saltet passord fra DB
// Sjekker samsvar mellom hashen fra databasen og det innsendte passordet
if (password_verify($_POST['password'], $hash)) {
// alt ok, autoriser...
} else {
// passordet passet ikke, vis melding
}
} else {
// det finnes ingen bruker med dette loginn, vis melding
}
?>
Omgjør din autorisasjon og registrering til de nye studerte funksjonene.