Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 37 di 67
  • livello intermedio
Indice lezioni

Gestione delle password con PHP: password_hash()

Impariamo ad utilizzare la funzione password_hash() di PHP come alternativa a crypt() per la generazione di password hash più sicuri.
Impariamo ad utilizzare la funzione password_hash() di PHP come alternativa a crypt() per la generazione di password hash più sicuri.
Link copiato negli appunti

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'algoritmo bcrypt;
    • PASSWORD_BCRYPT che utilizza l'algoritmo CRYPT_BLOWFISH per produrre un output compatibile con crypt();
  • $options: una delle opzioni più importanti era il salt 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.

Ti consigliamo anche