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_DEFAULTche utilizza l'algoritmobcrypt;PASSWORD_BCRYPTche utilizza l'algoritmoCRYPT_BLOWFISHper produrre un output compatibile concrypt();
$options: una delle opzioni più importanti era ilsaltche 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.