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
che utilizza l'algoritmobcrypt
;PASSWORD_BCRYPT
che utilizza l'algoritmoCRYPT_BLOWFISH
per produrre un output compatibile concrypt()
;
$options
: una delle opzioni più importanti era ilsalt
che consentiva di utilizzarne uno personalizzato. Tale opzione è stata deprecata dalla versione 7 ed è consigliabile non utilizzarla per generare hash più sicuri.
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()
anche password_hash()
ha una sua funzione di verifica dell'hash, essa è chiamata password_verify()
e prende in ingresso due parameteri:
$password
: la password da verificare;$hash
: l'hash da comparare.
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.