Quando un utente si registra su un sito web, affida all'applicazione una delle informazioni più delicate che possiede: la propria password.
Chi sviluppa il sito ha quindi una responsabilità importante. Non basta proteggere il modulo di login o utilizzare HTTPS. Bisogna anche decidere come conservare le credenziali nel database.
E qui nasce una domanda fondamentale: cosa succederebbe se qualcuno riuscisse ad accedere alla tabella degli utenti?
Se le password fossero salvate in chiaro, l'attaccante potrebbe leggerle immediatamente. Se invece fossero protette con un algoritmo di hashing adeguato, recuperare le password originali sarebbe molto più difficile.
Vediamo come funziona il password hashing, perché algoritmi come MD5 e SHA-256 non sono adatti a questo scopo e come utilizzare correttamente Argon2id e bcrypt nelle applicazioni PHP.
Che cos'è il password hashing?
L'hashing è un processo che trasforma un dato in una rappresentazione calcolata attraverso una funzione matematica.
Nel caso delle password, lo scopo è evitare di conservarle direttamente.
Quando un utente sceglie una password, il sistema ne calcola un hash e memorizza il risultato nel database.
Durante il login, l'applicazione verifica che la password inserita corrisponda all'hash conservato.
La differenza rispetto alla cifratura è importante.
Un dato cifrato può essere decifrato utilizzando la chiave corretta. Un hash crittografico, invece, non è progettato per essere invertito.
Questo non significa che una password non possa essere indovinata: un attaccante può provare numerose password candidate e confrontarne gli hash.
Per questo motivo, non basta utilizzare una funzione hash qualsiasi.
Perché non bisogna salvare le password in chiaro?
Immaginiamo una tabella di utenti organizzata in questo modo:
| ID | Email | Password | |---|---|---| | 1 | [email protected] | Password123! | | 2 | [email protected] | Estate2026! |
Se un attaccante ottenesse accesso al database, avrebbe immediatamente a disposizione le credenziali degli utenti.
Il danno potrebbe estendersi anche ad altri servizi.
Molte persone, infatti, continuano a riutilizzare la stessa password su più piattaforme.
Una violazione del database di un piccolo sito potrebbe quindi mettere a rischio account email, social network o altri servizi.
Conservare le password in chiaro è una pratica da evitare completamente.
Perché MD5 e SHA-256 non sono sufficienti?
MD5 e SHA-256 sono funzioni hash conosciute, ma non sono progettate specificamente per proteggere password.
Il problema principale è la velocità.
Questi algoritmi sono progettati per elaborare dati in modo efficiente. Nel caso delle password, però, una velocità elevata può favorire chi tenta di indovinarle attraverso grandi quantità di tentativi.
Un attaccante in possesso degli hash potrebbe provare moltissime password candidate utilizzando hardware specializzato.
Gli algoritmi dedicati alle password, invece, sono progettati per rendere ogni tentativo più costoso.
📌 Una password non dovrebbe essere protetta semplicemente applicando SHA-256 o MD5, neppure quando si aggiunge un salt.
È preferibile utilizzare algoritmi specifici per il password hashing.
Che cos'è il salt?
Il salt è un valore casuale utilizzato insieme alla password durante il calcolo dell'hash.
Serve a evitare che due utenti con la stessa password producano necessariamente lo stesso hash.
Immaginiamo che due persone scelgano entrambe:
MiaPasswordSicura!
Senza un salt adeguato, una funzione deterministica produrrebbe lo stesso risultato per entrambe.
Con salt differenti, gli hash risultanti saranno diversi.
Questo rende meno efficaci gli attacchi basati su tabelle precalcolate e impedisce di riconoscere immediatamente gli utenti che condividono la stessa password.
Il salt non deve necessariamente essere segreto.
Deve però essere generato correttamente e avere caratteristiche adeguate.
Le moderne API di password hashing gestiscono automaticamente questo aspetto.
Argon2id: una scelta moderna per proteggere le password
Argon2id è un algoritmo progettato specificamente per il password hashing.
Una delle sue caratteristiche principali è la possibilità di configurare il consumo di memoria e il costo computazionale.
Questo rende più onerosi i tentativi massivi di recupero delle password.
Argon2id combina caratteristiche delle varianti Argon2i e Argon2d ed è generalmente raccomandato per nuove implementazioni quando disponibile.
I parametri devono essere scelti in base alle risorse del server e al carico previsto.
Un'impostazione eccessivamente pesante potrebbe rallentare troppo il login o facilitare situazioni di esaurimento delle risorse.
L'obiettivo è trovare un equilibrio tra sicurezza e prestazioni.
Come utilizzare Argon2id in PHP
PHP mette a disposizione funzioni native per la gestione sicura delle password.
Per generare un hash con Argon2id:
<?php
$password = 'PasswordDiEsempio!';
$hash = password_hash(
$password,
PASSWORD_ARGON2ID
);
echo $hash;
Il risultato include le informazioni necessarie alla successiva verifica, come algoritmo, parametri e salt.
Non è necessario generare manualmente un salt.
La disponibilità di Argon2id dipende dal supporto presente nella compilazione PHP utilizzata.
Verificare la password durante il login
Quando l'utente inserisce la password, si utilizza password_verify():
<?php
$passwordInserita = $_POST['password'] ?? '';
$hashSalvato = $utente['password_hash'];
if (password_verify($passwordInserita, $hashSalvato)) {
// Password corretta.
// Proseguire con la gestione del login.
} else {
// Credenziali non valide.
}
Non bisogna confrontare direttamente due hash generati separatamente.
Gli algoritmi moderni utilizzano salt casuali, quindi due chiamate a password_hash() sulla stessa password possono produrre risultati differenti.
Bcrypt è ancora sicuro?
Bcrypt è un altro algoritmo progettato per proteggere password.
È ampiamente supportato e può ancora essere utilizzato in modo sicuro con parametri appropriati.
In PHP:
<?php
$hash = password_hash(
$password,
PASSWORD_BCRYPT,
['cost' => 12]
);
Il parametro cost influenza il lavoro necessario per calcolare l'hash.
Non esiste un valore ideale per qualsiasi server: è opportuno effettuare test di prestazioni.
Bcrypt presenta inoltre un limite importante: considera soltanto i primi 72 byte della password.
Questo aspetto va valutato attentamente, soprattutto nelle applicazioni che consentono password molto lunghe o contenenti caratteri multibyte.
Per nuove implementazioni, Argon2id è generalmente una scelta preferibile quando disponibile e configurato correttamente.
Come aggiornare gli hash senza obbligare tutti gli utenti a cambiare password
Un'applicazione potrebbe utilizzare bcrypt da diversi anni e voler passare ad Argon2id.
Non è necessario conoscere le password originali.
PHP offre password_needs_rehash(), che permette di verificare se un hash deve essere aggiornato.
Per esempio:
<?php
if (password_verify($passwordInserita, $hashSalvato)) {
if (
password_needs_rehash(
$hashSalvato,
PASSWORD_ARGON2ID
)
) {
$nuovoHash = password_hash(
$passwordInserita,
PASSWORD_ARGON2ID
);
// Salvare $nuovoHash nel database
// con una query parametrizzata.
}
// Login riuscito.
}
In questo modo, l'hash può essere aggiornato quando l'utente effettua correttamente il login.
Per gli account inattivi può essere necessario mantenere temporaneamente la compatibilità con gli algoritmi precedenti.
Dove conservare gli hash delle password?
Gli hash vengono generalmente memorizzati nel database applicativo.
È importante utilizzare una colonna sufficientemente ampia, perché la lunghezza può variare in base all'algoritmo e ai parametri.
Per esempio, in MariaDB si può utilizzare:
CREATE TABLE utenti (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL
);
Il database deve comunque essere protetto attraverso controlli di accesso, backup sicuri e gestione appropriata dei privilegi.
L'hashing riduce le conseguenze di una violazione, ma non rende irrilevante la protezione del database.
Che cos'è il pepper?
Oltre al salt, alcune architetture utilizzano un segreto aggiuntivo chiamato pepper.
A differenza del salt, il pepper deve rimanere riservato e viene conservato separatamente dal database, per esempio in un sistema di gestione dei segreti.
Può aggiungere un ulteriore livello di protezione, ma introduce anche complessità operative.
La sua perdita o rotazione richiede una strategia adeguata.
Per molte applicazioni, utilizzare correttamente Argon2id con buoni parametri rappresenta già una base solida.
Gli errori da evitare nella gestione delle password
Anche scegliendo un algoritmo sicuro, si possono commettere errori.
Tra i più comuni troviamo:
- Salvare password in chiaro nei log applicativi.
- Inviare password via email.
- Utilizzare algoritmi generici come MD5 o SHA-256.
- Impostare costi computazionali troppo bassi.
- Conservare copie delle password in file di backup non protetti.
- Implementare manualmente algoritmi crittografici.
- Non aggiornare le procedure quando cambiano le raccomandazioni di sicurezza.
Bisogna inoltre proteggere il login con controlli contro i tentativi automatizzati e utilizzare HTTPS.
Il password hashing è soltanto uno degli elementi della sicurezza degli account.
Password hashing e violazioni dei dati
Se un database viene compromesso, un algoritmo robusto può rendere significativamente più difficile il recupero delle password originali.
Non garantisce però una protezione assoluta.
Password deboli o molto comuni possono essere individuate anche quando gli hash sono generati correttamente.
Per questo motivo, è importante incoraggiare password lunghe, evitare credenziali già compromesse e offrire l'autenticazione a più fattori.
La protezione più efficace nasce dalla combinazione di più misure.
Conclusione
La sicurezza delle password comincia molto prima del login.
Comincia nel momento in cui decidiamo come conservarle.
Argon2id e bcrypt permettono di proteggere le credenziali in modo molto più appropriato rispetto alle funzioni hash generiche.
Per chi sviluppa applicazioni PHP, le funzioni native password_hash(), password_verify() e password_needs_rehash() rappresentano strumenti fondamentali.
Per approfondire puoi consultare la Password Storage Cheat Sheet di OWASP.
Con MiHakero puoi affiancare alla protezione delle credenziali un controllo delle esposizioni esterne e delle configurazioni di sicurezza dei tuoi servizi pubblici. La verifica degli algoritmi utilizzati per conservare le password richiede invece un'analisi interna dell'applicazione.
SEO Meta Title: Password hashing: Argon2id, bcrypt e sicurezza PHP
SEO Meta Description: Scopri come proteggere le password nel database con Argon2id e bcrypt, usare password_hash in PHP ed evitare errori di sicurezza.