Bcrypt e Argon2 per Password Hashing — Perché MD5 è Morto e Come Scegliere il Miglior Algoritmo
> cd .. / HUB_EDITORIALE > Visualizza in Inglese
Sicurezza Informatica

Bcrypt e Argon2 per Password Hashing — Perché MD5 è Morto e Come Scegliere il Miglior Algoritmo

[2026-07-17] Author: Ing. Calogero Bono
> condividi
Zenithby Meteora Web Il sistema operativo della tua attività. Social, clienti, prenotazioni e fatture in un'unica piattaforma. Palestre, barber, professionisti. Scopri Zenith Demo gratis · senza carta

Se gestisci un'applicazione web con utenti registrati, sai già che le password non vanno mai salvate in chiaro. Ma forse non sai che MD5 non solo è insicuro, ma è morto e sepolto da anni. Eppure lo vediamo ancora in progetti ereditati: password hashate con MD5, SHA1, a volte addirittura senza salt. Noi, di Meteora Web, ogni volta che vediamo un database così, lo consideriamo una vulnerabilità aperta. Un attaccante con un vecchio GPU cluster può invertire MD5 a velocità di miliardi di hash al secondo. Non serve essere un super-hacker come quelli di GPT-Red per romperlo.

In questa guida vediamo perché MD5 e SHA1 sono da rottamare, come funzionano bcrypt e Argon2, e come implementarli in PHP (ma i concetti valgono per qualsiasi linguaggio). Partiamo dal problema concreto: perché il tuo sistema di autenticazione potrebbe essere una bomba a orologeria.

Perché MD5 e SHA1 Non Sono Più Sicuri per le Password

MD5 è stato progettato come hash veloce, pensato per integrità dei file, non per sicurezza di credenziali. La sua velocità è il problema: oggi un singolo PC con GPU può eseguire milioni di tentativi al secondo. Con tabelle rainbow e attacchi di dizionario, una password debole come “password123” viene crackata in millisecondi. Anche con un salt, la computazione rapida rende l'attacco fattibile. SHA1 è nella stessa barca. La vera questione è che un buon password hashing deve essere volutamente lento e costoso in termini di risorse, per rallentare di forza bruta.

Sponsored Protocol

Noi lo vediamo nei progetti che ci arrivano: un cliente ci chiede di migrare da un CMS vecchio con password MD5 a un sistema moderno. La prima operazione? Costringere tutti gli utenti a reimpostare la password, perché i vecchi hash non sono recuperabili in modo sicuro. Ecco perché MD5 è morto — non esiste patch che lo renda adatto alle password.

Il fallimento di MD5 e SHA1 in numeri

Un hash MD5 viene calcolato in circa 0.5 microsecondi su hardware moderno. Con un cluster di 8 GPU, un attaccante può provare oltre 100 miliardi di hash al secondo. Una password di 8 caratteri alfanumerici viene esausta in pochi minuti. Argon2id invece, con parametri adeguati, impiega 1 secondo per hash. Lo stesso attacco diventerebbe impraticabile. I numeri parlano da soli.

Cosa Rende Bcrypt e Argon2 Diversi? Perché Sono Più Sicuri?

Bcrypt e Argon2 sono algoritmi di hashing key derivation function progettati appositamente per password. Hanno tre caratteristiche fondamentali:

  • Lentezza intrinseca: il costo computazionale è regolabile tramite parametri di costo (cost factor per bcrypt, memory cost e parallelism per Argon2).
  • Salt automatico: ogni hash include un salt casuale, rendendo impossibili gli attacchi con tabelle precalcolate.
  • Resistenza ad attacchi hardware: Argon2 è stato disegnato per essere resistente agli attacchi via GPU, FPGA e ASIC perché richiede molta memoria.

Bcrypt usa Blowfish cipher e un fattore di costo che controlla il numero di iterazioni. Argon2 è vincitore del concorso Password Hashing Competition (PHC) del 2015 e ha tre varianti: Argon2d (resistente agli attacchi side-channel), Argon2i (resistente agli attacchi timing) e Argon2id (combinazione, raccomandato).

Sponsored Protocol

Come Bcrypt Gestisce il Costo Rispetto ad Argon2?

In bcrypt il costo è un valore esponenziale (2^cost). Impostare cost=10 significa 2^10=1024 iterazioni. Aumentare il costo di 1 raddoppia il tempo di esecuzione. Argon2 invece ha tre parametri: tempo (t), memoria (m) e parallelismo (p). Puoi bilanciare velocità e consumo di memoria. Per applicazioni moderne, Argon2id è la scelta consigliata da OWASP e NIST.

Come Implementare Bcrypt e Argon2 in PHP per la Tua Applicazione

PHP offre funzioni native per entrambi tramite la libreria password_hash. Non serve installare estensioni aggiuntive (bcrypt è supportato da PHP 5.5+, Argon2 da PHP 7.2+ con libsodium).

Esempio pratico: password_hash con bcrypt

Il modo più semplice e sicuro per generare un hash di password in PHP:

// Hash con bcrypt (costo 12)
$hash = password_hash('MiaPassword!123', PASSWORD_BCRYPT, ['cost' => 12]);
echo $hash; // $2y$12$...

// Verifica
if (password_verify('MiaPassword!123', $hash)) {
    echo 'Password corretta';
}

Perché cost=12? Su un server moderno, 12 è un buon compromesso tra sicurezza e performance (circa 0.1-0.5 secondi). Sul nostro stack PHP hosting, testiamo sempre il tempo di esecuzione. Se il server è lento, scendiamo a 10, ma mai sotto 8.

Sponsored Protocol

Esempio pratico: password_hash con Argon2id

Argon2id richiede parametri di memoria e tempo. Ecco un esempio per PHP 8+ con valori ragionevoli:

// Hash con Argon2id
$options = [
    'memory_cost' => 1<<17, // 128 MB
    'time_cost'   => 4,     // 4 iterazioni
    'threads'     => 2,     // parallelismo
];
$hash = password_hash('MiaPassword!123', PASSWORD_ARGON2ID, $options);

// Verifica: stessa funzione password_verify
if (password_verify('MiaPassword!123', $hash)) {
    echo 'Password verificata con Argon2id';
}

Attenzione: Argon2 consuma molta RAM. Se il tuo server ha poca memoria (es. VPS da 1GB), riduci il memory_cost. Per hosting condivisi, bcrypt è spesso più pratico. Noi consigliamo di testare sul tuo ambiente specifico.

Perché non fare hash manualmente?

Molti sviluppatori tentano di scrivere la propria funzione di hashing o di concatenare salt manualmente. Non fatelo. Le funzioni native come password_hash e password_verify gestiscono già salt, costo e aggiornamenti futuri. Lo abbiamo visto in vari progetti: qualcuno aveva implementato un proprio sistema con MD5 + salt casuale pensando fosse sicuro, ma era comunque vulnerabile alla velocità di calcolo.

Sponsored Protocol

Argon2 vs Bcrypt: Quale Scegliere per il Tuo Progetto?

La risposta breve: Argon2id è superiore tecnicamente, ma bcrypt è ancora una scelta solida e più compatibile. Ecco un confronto pratico:

CaratteristicaBcryptArgon2id
Resistenza a GPUBuona (cost factor alto)Ottima (richiede memoria)
Consumo memoriaBasso (~4KB)Configurabile (tipicamente 64-128 MB)
Velocità regolabileSì (cost factor)Sì (tempo, memoria, parallelismo)
Supporto PHP5.5+ (nativo)7.2+ (con libsodium)
Raccomandato da OWASPSì (con factor >=10)Sì (Argon2id)

Noi, di Meteora Web, nei nuovi progetti usiamo Argon2id se il server lo supporta, altrimenti bcrypt con costo 12. Non usate mai MD5, SHA1, SHA256 o SHA512 per password — anche se con salt, sono troppo veloci.

Come Migrare Password Esistenti da MD5 a Bcrypt o Argon2

La migrazione non è banale: non puoi convertire hash MD5 in hash bcrypt senza conoscere la password originale. La strategia standard è:

  1. Al login, verifica la password vecchia (MD5) e se corretta, rigenera l'hash con bcrypt/Argon2 e aggiorna il database.
  2. Imposta un flag nel database per distinguere hash vecchi e nuovi.
  3. Dopo un periodo di transizione (es. 6 mesi), forza il reset delle password per gli account ancora con hash vecchio.

Un esempio di logica in PHP:

Sponsored Protocol

function verifyAndUpgrade($password, $storedHash, $userId) {
    // Se già con algoritmo moderno
    if (password_verify($password, $storedHash)) {
        // Opzionale: rehash se il costo è aumentato
        if (password_needs_rehash($storedHash, PASSWORD_BCRYPT, ['cost' => 12])) {
            updateUserHash($userId, password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]));
        }
        return true;
    }
    // Se è MD5 legacy
    if (md5($password) === $storedHash) {
        $newHash = password_hash($password, PASSWORD_ARGON2ID);
        updateUserHash($userId, $newHash);
        return true;
    }
    return false;
}

Cosa Fare Adesso

Non lasciare la sicurezza delle password al caso. Ecco tre azioni immediate per la tua applicazione:

  1. Controlla il tuo database: se trovi colonne con hash di lunghezza fissa (32 caratteri per MD5, 40 per SHA1), hai un problema. Pianifica la migrazione.
  2. Aggiorna il codice: usa password_hash() con PASSWORD_ARGON2ID o PASSWORD_BCRYPT. Imposta un costo che richieda almeno 0.2 secondi sul tuo server.
  3. Forma il team: spiega perché MD5 è morto e come riconoscerlo. Se segui aziende dal 2017, sai che questo genere di errori si ripete spesso.

Per approfondire l'intero ecosistema della crittografia applicata alla sicurezza, leggi la nostra Guida Pillar alla Crittografia e Sicurezza Dati.

> condividi
Ing. Calogero Bono

> AUTHOR_EXTRACTED

Ing. Calogero Bono

Ingegnere informatico, fondatore di Meteora Web e Zenith OS. System administrator e progettista di piattaforme, app e CMS proprietari, con esperienza in sviluppo full-stack, marketing digitale ed ecosistema Google.
[ Read Full Dossier ]

> METEORA_WEB // WEB AGENCY

Costruiamo la presenza digitale che la tua azienda merita.

Siti web, social, pubblicità online, e-commerce e hosting performante: ingegnerizzati con metodo da ingegneri informatici a Sciacca, per tutta Italia.

> MW_JOURNAL

> READ_ALL()