PHP
HTML
CSS
JavaScript
Generatori
Varie & Old

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

CODE: PHPpreleva codice
  1. <?php
  2. $password = "mypass123";
  3. $hash = password_hash($password, PASSWORD_DEFAULT);
  4.  
  5. echo "Password originale: $password<br>";
  6. echo "Hash: $hash";
  7. ?>
  8. <!-- Output nel browser:
  9. Password originale: mypass123
  10. Hash: $2y$10$...
  11. -->

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

CODE: PHPpreleva codice
  1. <?php
  2. $password = "mypass123";
  3. $hash = password_hash($password, PASSWORD_DEFAULT);
  4.  
  5. if (password_verify("mypass123", $hash)) {
  6.   echo "Password corretta!";
  7. } else {
  8.   echo "Password errata!";
  9. }
  10. ?>
  11. <!-- Output nel browser:
  12. Password corretta!
  13. -->

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

CODE: PHPpreleva codice
  1. <?php
  2. // Parametri per l'hash: cost più alto = maggiore sicurezza
  3. $options = ['cost' => 12];
  4.  
  5. // Hash generato precedentemente con cost predefinito (10)
  6. $hash = password_hash("mypass123", PASSWORD_DEFAULT); // <-- Usa cost=10 implicitamente
  7.  
  8. // Verifica se l'hash corrente rispetta i nuovi parametri (cost=12)
  9. if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
  10.   // Se non lo fa, rigenera l'hash con il nuovo cost
  11.   $hash = password_hash("mypass123", PASSWORD_DEFAULT, $options);
  12.   echo "Hash aggiornato.";
  13. } else {
  14.   echo "Hash ancora valido.";
  15. }
  16. ?>
  17. <!-- Output nel browser:
  18. Hash aggiornato.
  19. -->

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 passwordpassword_hash("pwd", PASSWORD_DEFAULT)
password_verify()Verifica una password contro l’hashpassword_verify("pwd", $hash)
password_needs_rehash()Controlla se l’hash va rigeneratopassword_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.


I Cookie su questo sito:

Il nostro sito utilizza cookie e altre tecnologie in modo tale che sia noi, sia i nostri partner, possiamo ricordarci di te e capire come tu e gli altri visitatori utilizzate il nostro sito. Qui puoi trovare ulteriori informazioni sui cookie e le altre tecnologie. Chiudendo questo banner o continuando la navigazione acconsenti all'uso dei cookie. Acconsento Info Cookies