Funkcija password_hash
U stvari, funkcija md5 i sođenje
lozinke uz nju se smatra zastarelim.
Proučavali smo je kako biste razumeli dalji
materijal, kao i zato što možete naići
na ovo, radeći na tuđim projektima.
Postoji savršeniji način da se dobije
sođena lozinka. Za to se koristi funkcija
password_hash. Kao prvi parametar ona
prihvata string, a kao drugi - algoritam šifrovanja
(o tome kasnije), i vraća heš tog stringa
zajedno sa soli.
Pokušajte nekoliko puta pokrenuti ovaj kod:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Svaki put ćete dobiti drugačiji rezultat i u tom rezultatu prvi deo stringa će biti so, a drugi deo - sođena lozinka.
Neka imamo heš, dobijen iz funkcije
password_hash i neku lozinku. Da bismo
proverili da li je to heš te lozinke ili nije,
treba koristiti funkciju password_verify
- kao prvi parametar ona prihvata lozinku,
a kao drugi - heš, i vraća true
ili false.
Pogledajmo na primeru:
<?php
$password = '12345'; // lozinka
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // heš
if (password_verify($password, $hash)) {
// heš je od ove lozinke
} else {
// heš nije od ove lozinke
}
?>
Šta nam ovo daje u praksi: možemo da ne pravimo u bazi podataka posebno polje za čuvanje soli, ne da se bavimo generisanjem te soli - PHP će sve to uraditi umesto nas!
To znači da će se pokazati da u bazi podataka u polju
password ćemo čuvati sođenu
lozinku zajedno sa njenom soli. Pored toga, heširana
lozinka će imati veću dužinu. Zato
u bazi podataka treba da ispravimo veličinu
polja za lozinku i da je postavimo na 60
simbola.
Sada da ispravimo kod za registraciju. Evo šta sada imamo:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // dužina soli
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // simbol iz ASCII-tabele
}
return $salt;
}
$salt = generateSalt(); // so
$password = md5($salt . $_POST['password']); // transformišemo lozinku u sođeni heš
?>
Pomoću password_hash skratićemo ovo do:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Na sličan način će se ispraviti i kod za autorizaciju:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // dobijamo korisnika po login-u
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // sođena lozinka iz baze
// Proveravamo podudaranje heša iz baze sa unetom lozinkom
if (password_verify($_POST['password'], $hash)) {
// sve je u redu, autorizujemo...
} else {
// lozinka se ne poklapa, prikazaćemo poruku
}
} else {
// ne postoji korisnik sa tim login-om, prikazaćemo poruku
}
?>
Prepravite vašu autorizaciju i registraciju na nove proučene funkcije.