PHP: Password e hashing
Password e hashing in PHP
La gestione delle password è un aspetto cruciale della sicurezza. In PHP non vanno mai salvate in chiaro, ma trasformate in hash sicuri tramite funzioni dedicate.
Introduzione all’hashing
L’hashing è un processo che converte una stringa (come una password) in una sequenza di caratteri generata da un algoritmo matematico. Questa trasformazione è unidirezionale: non è possibile risalire alla password originale a partire dall’hash.
Creazione di un hash
PHP mette a disposizione la funzione password_hash() che utilizza algoritmi moderni e sicuri (per impostazione predefinita BCRYPT o ARGON2).
Codice Esempio: creazione hash password

<?php
$password = "mypass123";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Password originale: $password<br>";
echo "Hash: $hash";
?>
<!-- Output nel browser:
Password originale: mypass123
Hash: $2y$10$...
-->
Verifica di una password
Per confrontare una password inserita dall’utente con l’hash salvato nel database si usa password_verify().
Codice Esempio: verifica password

<?php
$password = "mypass123";
$hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify("mypass123", $hash)) {
echo "Password corretta!";
} else {
echo "Password errata!";
}
?>
<!-- Output nel browser:
Password corretta!
-->
Aggiornamento degli hash
Gli algoritmi di hashing si evolvono. Con password_needs_rehash() è possibile verificare se un hash esistente va rigenerato con parametri più recenti.
Codice Esempio: aggiornamento hash

<?php
// Parametri per l'hash: cost più alto = maggiore sicurezza
$options = ['cost' => 12];
// Hash generato precedentemente con cost predefinito (10)
$hash = password_hash("mypass123", PASSWORD_DEFAULT); // <-- Usa cost=10 implicitamente
// Verifica se l'hash corrente rispetta i nuovi parametri (cost=12)
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
// Se non lo fa, rigenera l'hash con il nuovo cost
$hash = password_hash("mypass123", PASSWORD_DEFAULT, $options);
echo "Hash aggiornato.";
} else {
echo "Hash ancora valido.";
}
?>
<!-- Output nel browser:
Hash aggiornato.
-->
Che cosa fa $options
in password_hash()
e password_needs_rehash()
?
Il parametro $options
è un array opzionale che consente di specificare
parametri aggiuntivi per l’algoritmo di hashing scelto.
Nel caso di PASSWORD_DEFAULT
(che attualmente corrisponde a bcrypt),
l’unico parametro rilevante è:
-
cost: un numero intero che indica il "costo computazionale" dell'hash.
- Valore di default: 10
- Valori più alti: hash più lento = maggiore sicurezza, ma più carico per il server
Tabella riassuntiva funzioni hashing
Funzione | Descrizione | Esempio |
---|---|---|
password_hash() | Crea un hash sicuro della password | password_hash("pwd", PASSWORD_DEFAULT) |
password_verify() | Verifica una password contro l’hash | password_verify("pwd", $hash) |
password_needs_rehash() | Controlla se l’hash va rigenerato | password_needs_rehash($hash, PASSWORD_DEFAULT) |
Considerazioni
Non bisogna mai salvare password in chiaro. Usare sempre password_hash() e password_verify() garantisce un buon livello di sicurezza. È buona pratica aggiungere controlli periodici per aggiornare gli hash se cambiano gli algoritmi o i cost di calcolo.