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.

