Funcția password_hash
De fapt, funcția md5 și sărarea
parolei cu ajutorul ei este considerată învechită.
Am studiat-o, pentru să înțelegeți materialul
ulterior, și, de asemenea, pentru că ați putea da
peste ea, lucrând la proiecte străine.
Există o metodă mai avansată de a obține
o parolă sărată. Pentru aceasta se folosește funcția
password_hash. Primul parametru îl
primește șirul, iar al doilea - algoritmul de criptare
(despre el mai târziu), și returnează hash-ul acestui șir
împreună cu sarea.
Încercați să rulați de câteva ori acest cod:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
De fiecare dată veți obține un rezultat diferit și în acest rezultat prima parte a șirului va fi sarea, iar a doua parte - parola sărată.
Să presupunem că avem un hash, obținut cu funcția
password_hash și o anumită parolă. Pentru
a verifica dacă este hash-ul acestei parole sau nu,
trebuie să folosim funcția password_verify
- primul parametru îl primește parola,
iar al doilea - hash-ul, și returnează true
sau false.
Să vedem un exemplu:
<?php
$password = '12345'; // parola
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash-ul
if (password_verify($password, $hash)) {
// hash-ul de la această parolă
} else {
// hash-ul nu este de la această parolă
}
?>
Ce ne oferă asta în practică: putem să nu creăm în baza de date un câmp separat pentru stocarea sării, să nu ne necăjim cu generarea acestei sări - PHP va face totul pentru noi!
Adică, se va dovedi că în baza de date în câmpul
password vom stoca parola sărată
împreună cu sarea ei. În același timp, parola
hasuită va avea o lungime mai mare. De aceea
în baza de date trebuie să corectăm dimensiunea
câmpului pentru parolă și să o setăm la 60
de caractere.
Acum să corectăm codul de înregistrare. Iată ce avem acum:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lungimea sării
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // caracter din ASCII-table
}
return $salt;
}
$salt = generateSalt(); // sarea
$password = md5($salt . $_POST['password']); // transformăm parola în hash sărat
?>
Cu ajutorul password_hash vom reduce asta la:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
În mod similar se va corecta codul de autentificare:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // obținem utilizatorul după login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // parola sărată din BD
// Verificăm corespondența hash-ului din baza de date cu parola introdusă
if (password_verify($_POST['password'], $hash)) {
// totul este în regulă, autentificăm...
} else {
// parola nu a fost corectă, afișăm mesaj
}
} else {
// nu există utilizator cu acest login, afișăm mesaj
}
?>
Reproiectați autentificarea și înregistrarea cu noile funcții studiate.