Aikido

Smettete di usare MD5 e SHA-1: algoritmi di hashing moderni per la sicurezza

Sicurezza

Regola
Non utilizzare un algoritmi algoritmi a meno che sia 
giustificato. Evitare l'uso metodi di algoritmi algoritmi (MD5, SHA-1)
in qualsiasi contesto . Questi sono crittograficamente
violabili, facili da sottoporre a attacchi di forza bruta, e dannosi sistema manutenibilità.

Linguaggi supportati: 45+

Introduzione

MD5 e SHA-1 continuano a essere ampiamente utilizzati nei codici di produzione, nonostante siano stati dimostrati crittograficamente vulnerabili già da decenni. L’MD5 è considerato insicuro dal 2004, mentre lo SHA-1 lo è dal 2017. Tuttavia, gli sviluppatori continuano a utilizzarli per l’hashing delle password, le firme digitali e la verifica dell’integrità, ambiti in cui gli attacchi di collisione e gli attacchi di preimmagine rappresentano rischi reali per la sicurezza. Il costo computazionale per generare collisioni MD5 è ormai irrisorio, mentre gli attacchi di collisione SHA-1 sono fattibili grazie alle risorse del cloud computing.

Perché è importante

Implicazioni per la sicurezza: MD5 e SHA-1 sono vulnerabili agli attacchi di collisione, in cui due input diversi producono lo stesso hash in uscita. Gli aggressori sfruttano questa vulnerabilità per creare file dannosi con lo stesso hash di quelli legittimi, aggirando i controlli di integrità. Per l’archiviazione delle password, questi algoritmi sono estremamente deboli proprio perché sono veloci, rendendo banali gli attacchi di forza bruta e con le tabelle arcobaleno. 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 rischio legale: gli standard di sicurezza quali PCI DSS, HIPAA e SOC 2 vietano espressamente l’uso di MD5 e SHA-1 a fini crittografici. Il loro utilizzo in ambienti regolamentati comporta il mancato superamento degli audit e responsabilità legali. I principali browser ora avvisano gli utenti quando rilevano certificati SHA-1, minando la fiducia e potenzialmente bloccando l’accesso ai vostri servizi.

Manutenibilità del codice: quando nel codice vengono individuati algoritmi di hashing obsoleti, è necessario intervenire immediatamente per porvi rimedio. Ciò genera un debito tecnico che si aggrava nel tempo, poiché la migrazione diventa più complessa con l’aumentare della quantità di dati accumulati. L’adozione tempestiva di algoritmi sicuri consente di evitare costose migrazioni future 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. Ogni 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'algoritmo MD5 per l'hashing delle password non offre alcuna protezione contro i moderni strumenti di cracking. L'algoritmo SHA-1 per l'integrità dei file può essere aggirato con attacchi di collisione, consentendo a file dannosi di superare la verifica. Entrambi gli algoritmi sono computazionalmente poco onerosi da attaccare con la 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 numero elevato di iterazioni (310.000) rende la violazione delle password esponenzialmente più lenta. SHA-256 per l'integrità dei file è resistente alle collisioni e non sono noti attacchi pratici. Entrambi gli algoritmi soddisfano gli attuali standard di sicurezza e i requisiti di conformità.

Conclusione

MD5 e SHA-1 non hanno alcun posto in un codice in cui la sicurezza è fondamentale. Le loro vulnerabilità sono ben documentate, gli exploit sono disponibili pubblicamente ed esistono alternative sicure in tutti i principali linguaggi di programmazione. Il percorso di migrazione è chiaro: utilizzare 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, la superficie di attacco aumenta.

Domande frequenti

Hai delle domande?

In quali casi è accettabile utilizzare 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 rilevare il danneggiamento accidentale dei dati (non manomissioni dolose). Anche in questi casi, è necessario motivare perché l’algoritmo più debole sia accettabile. Per qualsiasi operazione 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?

Utilizza bcrypt, scrypt o Argon2. Si tratta di funzioni di hashing delle password appositamente progettate che includono il salt e sono volutamente lente per resistere agli attacchi di forza bruta. Argon2 è lo standard moderno e ha vinto la Password Hashing Competition nel 2015. Evita di utilizzare direttamente funzioni di hash generiche come SHA-256 per le password, poiché sono troppo veloci. Se devi utilizzare SHA-256, incorporalo in PBKDF2 con almeno 310.000 iterazioni.

E che dire di SHA-256 o SHA-3 per la verifica dell'integrità dei file?

SHA-256 è attualmente sicuro e ampiamente supportato. SHA-3 (Keccak) offre garanzie di sicurezza ancora più elevate grazie a una struttura interna diversa, garantendo una difesa a più livelli nel caso in cui SHA-2 venisse mai violato. Per la maggior parte delle applicazioni, SHA-256 è sufficiente. Utilizzare SHA-512 per un margine di sicurezza aggiuntivo o quando si lavora con set di dati di grandi dimensioni. Entrambi sono resistenti agli attacchi di collisione e di preimmagine noti.

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

Per le password, implementare il doppio hashing durante la migrazione: conservare temporaneamente i vecchi hash, ma quando gli utenti effettuano l'accesso con successo, ricalcolare la loro password con il nuovo algoritmo e aggiornare il database. Per i token API o gli hash di integrità, utilizzare versioni diverse del formato di hash (ad esempio, md5:abc123 vs sha256:def456) in modo che i sistemi possano gestire entrambi durante la transizione. Stabilire una scadenza per la migrazione e obbligare gli utenti rimanenti a reimpostare la password dopo tale data.

Esistono differenze in termini di prestazioni tra questi algoritmi?

Sì, ma non in modi rilevanti dal punto di vista della sicurezza. L'MD5 è più veloce dello SHA-256, e proprio questo è il problema nell'hashing delle password, dove la lentezza è una caratteristica fondamentale. Per quanto riguarda l'integrità dei file, la differenza in termini di prestazioni è trascurabile sull'hardware moderno. Lo SHA-256 aggiunge microsecondi a operazioni che in genere comportano un I/O su disco misurato in millisecondi. Il vantaggio in termini di sicurezza supera di gran lunga qualsiasi costo in termini di prestazioni.

E che dire dell'HMAC con MD5 o SHA-1?

HMAC-MD5 e HMAC-SHA-1 sono più resistenti agli attacchi rispetto alle funzioni hash di base, poiché HMAC offre ulteriori proprietà di sicurezza. Tuttavia, sono ancora considerate obsolete nella maggior parte degli standard di sicurezza. Si consiglia di utilizzare invece HMAC-SHA-256. La differenza in termini di prestazioni è minima e si evitano problemi di conformità. HMAC-SHA-256 è approvato per l'uso federale (FIPS 198-1) e soddisfa tutti i principali standard di sicurezza.

Come faccio a individuare tutte le occorrenze di MD5/SHA-1 nel mio codice?

Cerca i modelli ricorrenti: md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Verifica le configurazioni delle dipendenze relative alle impostazioni SSL/TLS che utilizzano certificati SHA-1. Esamina le integrazioni API con terze parti che potrebbero richiedere questi algoritmi. Gli strumenti di scansione automatizzata del codice sono in grado di rilevare questi modelli in diversi linguaggi di programmazione e di segnalarli per una 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.