Conclusione: SHA-1 è sicuro come qualsiasi altro contro gli attacchi preimage, tuttavia è facile da calcolare, il che significa che è più facile montare un attacco bruteforce o un dizionario. (Lo stesso vale per i successori come SHA-256.) A seconda delle circostanze, una funzione hash progettata per essere computazionalmente costosa (come bcrypt) potrebbe essere una scelta migliore.
Alcune persone lanciano spesso commenti come "SHA-1 è rotto", quindi sto cercando di capire cosa significhi esattamente. Supponiamo che io abbia un database di hash di password SHA-1 e un attaccante con un algoritmo di rottura SHA-1 all'avanguardia e una botnet con 100.000 macchine vi acceda. (Avere il controllo di oltre 100.000 computer domestici significherebbe che possono fare circa 10 ^ 15 operazioni al secondo.) Quanto tempo dovrebbero
- scoprire la password di un singolo utente?
- scoprire la password di un determinato utente?
- scopri la password di tutti gli utenti?
- trovare un modo per accedere come uno degli utenti?
- trovare un modo per accedere come utente specifico?
Come cambia se le password sono salate? È importante il metodo di salatura (prefisso, postfisso, entrambi o qualcosa di più complicato come lo xoring)?
Ecco la mia attuale comprensione, dopo aver cercato su Google. Per favore, correggi nelle risposte se ho frainteso qualcosa.
- Se non c'è sale, un attacco arcobaleno troverà immediatamente tutte le password (tranne quelle estremamente lunghe).
- Se esiste un sale casuale sufficientemente lungo, il modo più efficace per scoprire le password è una forza bruta o un attacco da dizionario. Né gli attacchi di collisione né pre-immagine sono di alcun aiuto nel trovare la password effettiva, quindi gli attacchi crittografici contro SHA-1 non sono di aiuto qui. Non importa nemmeno quale algoritmo venga utilizzato: si potrebbe persino usare MD5 o MD4 e le password sarebbero altrettanto sicure (c'è una leggera differenza perché il calcolo di un hash SHA-1 è più lento).
- Per valutare quanto sia sicuro "altrettanto sicuro", supponiamo che una singola esecuzione sha1 richieda 1000 operazioni e che le password contengano lettere maiuscole, minuscole e cifre (ovvero 60 caratteri). Ciò significa che l'attaccante può testare 10 15 * 60 * 60 * 24/1000 ~ = 10 17 potenziali password al giorno. Per un attacco di forza bruta, ciò significherebbe testare tutte le password fino a 9 caratteri in 3 ore, fino a 10 caratteri in una settimana, fino a 11 caratteri in un anno. (Ci vuole 60 volte di più per ogni personaggio aggiuntivo.) Un attacco con dizionario è molto, molto più veloce (anche un utente malintenzionato con un singolo computer potrebbe farlo in poche ore), ma trova solo password deboli.
- Per accedere come utente, l'utente malintenzionato non deve trovare la password esatta; è sufficiente trovare una stringa che dia lo stesso hash. Questo è chiamato un primo attacco preimage. Per quanto ho potuto trovare, non ci sono attacchi preimage contro SHA-1. (Un attacco bruteforce richiederebbe 2 160 operazioni, il che significa che il nostro attaccante teorico avrebbe bisogno di 10 30 anni per eseguirlo. I limiti di possibilità teoriche sono circa 2 60 operazioni, a cui l'attacco richiederebbe alcuni anni.) Ci sono attacchi preimage contro versioni ridotte di SHA-1 con effetto trascurabile (per SHA-1 ridotto che utilizza 44 passi invece di 80, il tempo di attacco è passato da 2 160 operazioni a 2 157). Ci sono attacchi di collisione contro SHA-1 che sono ben all'interno delle possibilità teoriche ( il migliore che ho trovato riduce il tempo da 2 80 a 2 52 ), ma quelli sono inutili contro gli hash delle password, anche senza salare.
In breve, la memorizzazione delle password con SHA-1 sembra perfettamente sicura. Ho dimenticato qualcosa?
Aggiornamento: Marcelo ha sottolineato un articolo che menziona un secondo attacco preimage in 2 106 operazioni . ( Modifica: Come spiega Thomas , questo attacco è un costrutto ipotetico che non si applica agli scenari della vita reale.) Tuttavia non vedo ancora come ciò comporti un pericolo per l'uso di SHA-1 come funzione di derivazione chiave. Ci sono generalmente buone ragioni per pensare che un attacco di collisione o un secondo attacco di preimage possano alla fine trasformarsi in un primo attacco di preimage?