Nella lezione sulla gestione delle password con PHP abbiamo introdotto la funzione crypt()
per la generazione di hash più sicuri utilizzando diversi algoritmi. Essa è però abbastanza macchinosa da utilizzare e aumenta le possibilità di errore lato programmazione.
Per risolvere questi problemi è stata introdotta la funzione password_hash(string $password , integer $algo [, array $options ])
che accetta 3parametri:
- la password da codificare;
- l'algoritmo da utilizzare per la codifica. Quelli supportati sono:
PASSWORD_DEFAULT
bcrypt
PASSWORD_BCRYPT
CRYPT_BLOWFISH
crypt()
$options
salt
Vediamo come utilizzare la funzione per generare un hash:
$password = 'LaM1aPassW0rd';
$hash = password_hash($password, PASSWORD_DEFAULT);
// l'hash sarà simile a $2y$10$xjX7pVRvyMTgJrplRWyS0O7Fx2iNGEq9iZTdRWk0BTsRWeCoI1xem
$hash = password_hash($password, PASSWORD_BCRYPT);
// l'hash sarà simile a $2y$10$VuCi8po/wzdWfGH7G52okuM.o41mv7kkTrkTb09zlsJcEyujL2k6.
Come per la funzione crypt()
password_hash()
password_verify()
$password
$hash
Vediamo quindi un esempio completo simulando un login:
$password = 'LaM1aPassW0rd'; // password valida
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // hash memorizzato nel database
$userPassword = 'LaM1aPassW0rd'; // password inserita dall'utente nel login
if (password_verify($userPassword, $hashedPassword)) {
echo "Accesso effettuato con successo";
} else {
echo "La password inserita non è corretta";
}
Come possiamo notare, l'utilizzo della funzione password_hash()
è più semplice rispetto a quello di crypt()
. Il vantaggio principale è quello di non avere più bisogno di generare manualmente un salt con il quale definire l'algoritmo di codifica da utilizzare, tutto il lavoro viene infatti delegato al PHP.