Ci sono tre tipi principali di attacco che possono essere eseguiti contro gli hash: attacchi a forza bruta, attacchi a dizionario e attacchi pre-calcolo.
Attacchi a forza bruta
Un attacco a forza bruta comporta la selezione di un intervallo di caratteri (ad esempio lettere minuscole e numeri) e il calcolo dell'hash per ogni singola permutazione possibile di quei caratteri, per un intervallo di lunghezze della password. Ogni hash viene confrontato con il tuo hash di destinazione e, se corrisponde alla password, è stato trovato. Ad esempio, potremmo scegliere a-z A-Z 0-9
come nostro alfabeto per le password tra 5 e 8 caratteri. La difesa da tali attacchi dipende dal costo computazionale di ogni operazione di hash, dall'alfabeto necessario per attaccare con successo la password e dalla lunghezza della password. Poiché la tecnologia moderna consente l'accelerazione basata su GPU dell'hash, è importante utilizzare una funzione di derivazione a chiave lenta (ad esempio PBKDF2 o bcrypt) invece di un singolo hash.
Attacchi dizionario
Gli attacchi di dizionario implicano l'esecuzione di un ampio elenco di parole preselezionate che probabilmente devono essere utilizzate come password. È importante notare che la maggior parte dei dizionari non include solo parole di dizionario reali, ma include anche varie pseudo parole e altri valori che si trovano in varie perdite di database e elenchi di password comuni. Questi attacchi sono più efficienti degli attacchi a forza bruta in generale, perché si concentrano sui tipi di password che gli umani scelgono piuttosto che su valori completamente casuali. La difesa da tali attacchi si basa quasi interamente sul non raccogliere una password o una parola del dizionario comuni.
Attacchi pre-computazione
Invece di calcolare gli hash ripetutamente e confrontarli con l'hash di destinazione, gli attacchi di pre-computazione comportano l'hash di calcolo per un insieme di valori scelti (come un attacco di dizionario) e la memorizzazione in un file o database. I database hash e le tabelle arcobaleno sono due metodi comuni per farlo. Ciò fornisce una ricerca molto rapida di testo in chiaro per qualsiasi hash noto, poiché si tratta solo di cercare l'hash nell'indice e restituire il testo in chiaro associato. Questo può essere difeso usando un sale, cioè un valore casuale aggiunto alla password prima dell'hash. Ciò rende le tabelle di calcolo arcobaleno per ogni possibile valore di sale completamente irrealizzabile.
Quindi, perché le password complicate sono importanti? Dipende, davvero. Se stai eseguendo correttamente l'hashing della password, utilizzando PBKDF2 o bcrypt con un ragionevole fattore di costo, la complessità oltre a non utilizzare le password comuni non è effettivamente così importante. È più importante evitare parole del dizionario e password comuni, e le password complesse di solito offrono quel tipo di protezione. Tuttavia, la scelta di una password lunga e insolita senza dizionario è memorabile (ad esempio PolynomialLovesBacon
) funziona altrettanto bene. Se esegui l'hashing della password in modo errato (ad es. SHA1 salato) hai bisogno di una password molto più sicura per rimanere al sicuro, perché le GPU possono calcolare decine di miliardi di hash al secondo.
Naturalmente, dovrai affrontare gli aspetti umani. Penso che una delle cose migliori che puoi fare sia warn utenti se usano una password comune, memorizzando un elenco dei ~ 2000 più comuni (puoi ottenere liste di questi online) e controllare loro. Fintanto che le password di hashing sono corrette, la maggior parte degli utenti dovrebbe essere ragionevolmente al sicuro anche in caso di perdita di un database.
La maggior parte di questi attacchi si basa sul modello del tuo sito che viene violato e le tue password rubate, ad es. tramite l'iniezione SQL, quindi è importante aderire alle pratiche di codifica sicure ed essere consapevoli delle vulnerabilità comuni.
Ulteriori letture: