Criptare le password in PHP
Per salvare l'hash delle password in PHP, e per controllarne la validità in fase di login, ero solito usare solo la funzione sha1.
Ma ho scoperto che c'è un modo più sicuro, usando password_hash e password_verify.
Facciamo un esempio banale:
$password = 'la_vostra_password';
$hash = password_hash($password, PASSWORD_BCRYPT);
if (password_verify('la_vostra_password', $hash)) {
echo 'OK';
} else {
echo 'KO';
}
if (password_verify('la_vostra_passwor', $hash)) {
echo 'OK';
} else {
echo 'KO';
}
Vi ho postato sia un esempio in cui da la password corretta che non.
Se volessimo esportare il tutto su un caso reale, basterebbe passare i valori del form alla funzione.
Ad esempio, per il login:
public function login($user, $pwd) {
$cmd = 'SELECT * FROM admins WHERE ad_user = ?';
$res = $this->conn->execQueryPrepare($cmd, array($user));
if (password_verify($pwd, $res[0]['ad_pwd'])) {
return TRUE;
} else {
return FALSE;
}
}
Eseguo la query andando a cerca lo username passato come argomento (lo username è un campo UNIQUE, quindi non può uscire più di un record).
Poi passo la password alla funzione password_verify, verifcando l'input dell'utente con il valore estratto dal database.
I valori li passo da form.
Come campo per la password, io uso un VARCHAR(255), in modo da essere sicuro che entri per intero.
Inoltre vi consglio di usare PASSWORD_BCRYPT in fase di salvataggio; non è obbligatorio ma è più sicuro.
Enjoy!
php sha1 password_hash password_verify password_bcrypt
1 Commenti
Ciao Mi chiamo Moreno, 68 anni da Rovigo, da sempre appassionato di programmazione. Ora per la Parrocchia, quindi per volontariato e senza nessuno scopo di lucro, sto cercando di sviluppare una web application single Page Application. Utilizzo Angular come frontend, Laravel come Backend e Mysql come DB. Ho un problema in fase di registrazione utente. Riesco a registrare l'utente, ma poi in fase di login non lo riconosce. Penso il problema stia nel hash della password. Volevo chiederti se avevi qualche minuto da dedicarmi cercando di capire dove sbaglio. Immagino sia una stupidaggine, ma sono ovviamente bloccato nella fase di sviluppo. grazie Moreno
06/04/2021