Funzione password_hash
In realtà, la funzione md5 e la salatura
delle password con il suo utilizzo sono considerati obsoleti.
L'abbiamo studiata per farvi comprendere il materiale
successivo, e anche perché potreste imbattervici
lavorando su progetti di altri.
Esiste un modo più avanzato per ottenere
una password salata. Per questo si utilizza la funzione
password_hash. Come primo parametro accetta
una stringa, e come secondo - l'algoritmo di cifratura
(ne parleremo più avanti), e restituisce l'hash di questa stringa
insieme al sale.
Provate a eseguire questo codice più volte:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Ogni volta otterrete un risultato diverso e in questo risultato la prima parte della stringa sarà il sale, mentre la seconda parte - la password salata.
Supponiamo di avere un hash, ottenuto dalla funzione
password_hash e una certa password. Per
verificare se è l'hash di questa password o meno,
si dovrebbe usare la funzione password_verify
- come primo parametro accetta la password,
e come secondo - l'hash, e restituisce true
o false.
Vediamo un esempio:
<?php
$password = '12345'; // password
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // hash
if (password_verify($password, $hash)) {
// l'hash è di questa password
} else {
// l'hash non è di questa password
}
?>
Cosa ci dà questo nella pratica: possiamo non creare un campo separato nel database per memorizzare il sale, non preoccuparci di generare questo sale - PHP farà tutto per noi!
Ciò significa che nel database, nel campo
password memorizzeremo la password salata
insieme al suo sale. Inoltre, la password hashata
avrà una lunghezza maggiore. Pertanto
nel database dobbiamo correggere la dimensione
del campo password e impostarla su 60
caratteri.
Ora correggiamo il codice di registrazione. Ecco quello che abbiamo al momento:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // lunghezza del sale
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // carattere dalla tabella ASCII
}
return $salt;
}
$salt = generateSalt(); // sale
$password = md5($salt . $_POST['password']); // convertiamo la password in hash salato
?>
Utilizzando password_hash possiamo ridurlo a:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Allo stesso modo, correggeremo il codice di autenticazione:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // otteniamo l'utente tramite il login
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // password salata dal DB
// Verifichiamo la corrispondenza tra l'hash dal database e la password inserita
if (password_verify($_POST['password'], $hash)) {
// tutto ok, autentichiamo...
} else {
// la password non corrisponde, visualizziamo un messaggio
}
} else {
// non esiste un utente con questo login, visualizziamo un messaggio
}
?>
Rielaborate la vostra autenticazione e registrazione utilizzando le nuove funzioni studiate.