Aikido

Basta usare MD5 e SHA-1: crittografia e hashing moderni per la sicurezza

Sicurezza

Regola
Non usare algoritmi di hashing obsoleti se 
non giustificato dal contesto. Evita di usare
algoritmi di hashing obsoleti (MD5, SHA-1) in
qualsiasi contesto sensibile dal punto di vista della
sicurezza.Linguaggi supportati: 45+

Introduzione

MD5 e SHA-1 rimangono diffusi nelle codebase di produzione nonostante siano stati compromessi dal punto di vista crittografico per decenni. MD5 è considerato non sicuro dal 2004, SHA-1 dal 2017. Eppure gli sviluppatori continuano a usarli per l'hashing delle password, le firme digitali e la verifica dell'integrità, ambiti in cui gli attacchi di collisione e preimage pongono reali rischi per la sicurezza. Il costo computazionale per generare collisioni MD5 è ormai irrisorio e gli attacchi di collisione a SHA-1 sono praticabili con risorse di cloud computing.

Perché è importante

Implicazioni per la sicurezza: MD5 e SHA-1 sono vulnerabili ad attacchi di collisione in cui due input differenti producono lo stesso hash in output. Gli attaccanti sfruttano questa debolezza per creare file malevoli con lo stesso hash di quelli legittimi, bypassando i controlli di integrità. Per la memorizzazione delle password, questi algoritmi sono catastroficamente deboli perché molto veloci, il che rende banali gli attacchi brute-force e con tabelle arcobaleno (rainbow table). Una GPU moderna è in grado di calcolare miliardi di hash MD5 al secondo, il che significa che una password di 8 caratteri può essere violata in poche ore.

Conformità e rischi legali: Standard di sicurezza come PCI DSS, HIPAA e SOC 2 vietano esplicitamente l'uso di MD5 e SHA-1 per scopi crittografici. Utilizzarli in ambienti regolamentati comporta il fallimento degli audit e responsabilità legali. I principali browser ora avvisano gli utenti quando incontrano certificati SHA-1, danneggiando la fiducia e bloccando potenzialmente l'accesso ai tuoi servizi.

Manutenibilità del codice: Quando nel codice vengono scoperti algoritmi di hashing obsoleti, è necessario intervenire tempestivamente. Questo genera un debito tecnico che si accumula nel tempo, poiché la migrazione diventa sempre più complessa man mano che i dati aumentano. L'adozione precoce di algoritmi sicuri previene future migrazioni costose e patch di sicurezza d'emergenza.

Ampliamento della superficie di attacco: Gli algoritmi di hashing deboli creano molteplici vettori di attacco. I database delle password diventano vulnerabili al cracking offline. Le firme digitali possono essere falsificate. I sistemi di integrità dei file possono essere aggirati. Ciascun utilizzo di MD5 o SHA-1 rappresenta un potenziale incidente di sicurezza in agguato.

Esempi di codice

❌ Non conforme:

const crypto = require('crypto');

function hashPassword(password) {
  return crypto.createHash('md5')
    .update(password)
    .digest('hex');
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha1')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Perché non è sicuro: L'uso di MD5 per l'hashing delle password non offre alcuna sicurezza contro i moderni strumenti di cracking. L'uso di SHA-1 per l'integrità dei file può essere compromesso tramite attacchi di collisione, consentendo a file malevoli di superare la verifica. Entrambi gli algoritmi richiedono risorse computazionali minime per essere violati tramite forza bruta.

✅ Conforme:

const crypto = require('crypto');

async function hashPassword(password) {
  const salt = crypto.randomBytes(16);
  return new Promise((resolve, reject) => {
    crypto.pbkdf2(password, salt, 310000, 32, 'sha256', (err, key) => {
      if (err) reject(err);
      resolve({ salt: salt.toString('hex'), hash: key.toString('hex') });
    });
  });
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha256')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Perché è sicuro: PBKDF2 con SHA-256 e un elevato numero di iterazioni (310.000) rallenta esponenzialmente il cracking delle password. SHA-256 per l'integrità dei file è resistente alle collisioni e non presenta attacchi pratici noti. Entrambi gli algoritmi soddisfano gli standard di sicurezza attuali e i requisiti di conformità.

Conclusione

MD5 e SHA-1 non trovano spazio nel codice sensibile alla sicurezza. Le loro vulnerabilità sono ampiamente documentate, gli exploit sono disponibili pubblicamente e in ogni linguaggio principale esistono alternative sicure. Il percorso di migrazione è chiaro: usa bcrypt, scrypt o Argon2 per le password e SHA-256 o SHA-3 per la verifica dell'integrità. Ogni giorno in cui questi algoritmi deboli rimangono in produzione aumenta la tua superficie di attacco.

FAQ

Hai domande?

Quando è accettabile usare MD5 o SHA-1?

Solo in contesti non legati alla sicurezza in cui non è richiesta la resistenza alle collisioni: chiavi di cache, ETag per la distribuzione di contenuti non sensibili o checksum per il rilevamento di corruzioni accidentali dei dati (e non di manomissioni dolose). Anche in questi casi, documenta il motivo per cui l'algoritmo più debole è ritenuto accettabile. Per qualsiasi attività di autenticazione, autorizzazione, verifica dell'integrità o firma crittografica, questi algoritmi non sono mai accettabili.

Cosa dovrei usare al posto di MD5 e SHA-1 per l'hashing delle password?

Usa bcrypt, scrypt o Argon2. Si tratta di funzioni di hashing per password create appositamente che includono il salting e sono volutamente lente per resistere agli attacchi brute-force. Argon2 è lo standard moderno ed è il vincitore della Password Hashing Competition del 2015. Evita di usare funzioni di hash generiche come SHA-256 direttamente per le password, perché sono troppo veloci. Se sei costretto a usare SHA-256, racchiudilo in PBKDF2 con almeno 310.000 iterazioni.

E per quanto riguarda SHA-256 o SHA-3 per l'integrità dei file?

SHA-256 è attualmente sicuro e ampiamente supportato. SHA-3 (Keccak) offre garanzie di sicurezza ancora superiori grazie a una diversa struttura interna, garantendo una difesa in profondità qualora SHA-2 dovesse essere violato in futuro. Per la maggior parte delle applicazioni, SHA-256 è sufficiente. Usa SHA-512 per un margine di sicurezza extra o quando lavori con dataset di grandi dimensioni. Entrambi sono resistenti ai noti attacchi di collisione e preimage.

Come posso migrare gli hash MD5/SHA-1 esistenti senza compromettere il funzionamento del sistema?

Per le password, implementa il dual-hashing durante la migrazione: mantieni temporaneamente i vecchi hash, ma quando gli utenti effettuano l'accesso con successo, ricalcola il loro hash con il nuovo algoritmo e aggiorna il database. Per i token API o gli hash di integrità, crea versioni del formato di hash (es. md5:abc123 vs sha256:def456) in modo che i sistemi possano gestire entrambi durante la transizione. Fissa una scadenza per la migrazione e obbliga gli utenti rimanenti a reimpostare la password dopo quella data.

Ci sono differenze di prestazioni tra questi algoritmi?

Sì, ma non in modo rilevante per la sicurezza. L'MD5 è più veloce dello SHA-256, ed è proprio questo il problema per l'hashing delle password, in cui la lentezza è una funzione di sicurezza. Per l'integrità dei file, la differenza di prestazioni è trascurabile sull'hardware moderno. Lo SHA-256 aggiunge microsecondi a operazioni che in genere comportano I/O su disco misurato in millisecondi. Il vantaggio in termini di sicurezza supera di gran lunga qualsiasi costo di prestazione.

Che dire di HMAC con MD5 o SHA-1?

L'HMAC-MD5 e l'HMAC-SHA-1 sono più resistenti agli attacchi rispetto alle funzioni di hash di base perché l'HMAC offre proprietà di sicurezza aggiuntive. Tuttavia, sono ancora deprecati nella maggior parte degli standard di sicurezza. Utilizza invece l'HMAC-SHA-256. La differenza di prestazioni è minima ed eviti problemi di conformità. L'HMAC-SHA-256 è approvato per l'uso federale (FIPS 198-1) e soddisfa tutti i principali standard di sicurezza.

Come posso trovare tutte le istanze di MD5/SHA-1 nella mia base di codice?

Cerca i pattern più comuni: md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Controlla le configurazioni delle dipendenze per le impostazioni SSL/TLS che utilizzano certificati SHA-1. Rivedi le integrazioni API con terze parti che potrebbero richiedere questi algoritmi. Gli strumenti di analisi del codice automatizzati possono rilevare questi pattern in più linguaggi e contrassegnarli per la revisione.

Metti in sicurezza ora

Metti in sicurezza il tuo codice, il cloud e il runtime in un unico sistema centralizzato.
Trova e risolvi le vulnerabilità rapidamente e automaticamente.

Nessuna carta di credito richiesta | Risultati della scansione in 32 secondi.