Supponi di non avere una tabella arcobaleno (o un altro elenco precompilato di hash),
e avrebbe effettivamente bisogno di fare un attacco di forza bruta o dizionario.
Questo programma IGHASHGPU v0.90 afferma di essere in grado di fare circa 1300 milioni di hash SHA-1 ( cioè più di 2 ^ 30) in ogni secondo su una singola GPU ATI HD5870.
Assumi una password di 40 bit di entropia, questo richiede 2 ^ 10 secondi, ovvero circa 17 minuti.
Una password di 44 bit di entropia ( mi piace quello del famoso fumetto XKCD ) impiega 68 minuti (il caso peggiore, la media è metà).
L'esecuzione su più GPU in parallelo accelera proporzionalmente.
Quindi, forzare il bruto con gli hash veloci è un pericolo reale, non teorico.
E molte password hanno un'entropia molto più bassa, rendendo la forza bruta ancora più veloce.
If I use a truly random salt for each user, on what order of magnitude
will this affect the length of time to crack my password?
Si presume che lo stesso sale sia noto all'attaccante e di per sé non aumenta di molto il tempo di cracking per una singola password (potrebbe aumentarlo un po ', perché i dati con hash diventano un blocco più lungo, ma al massimo raddoppia il lavoro).
Il vero vantaggio di un salt (indipendente casuale) è che un utente malintenzionato non può utilizzare la stessa opera per attaccare le password di più utenti contemporaneamente. Quando l'utente malintenzionato vuole solo la password di qualsiasi utente (o "il maggior numero possibile") e tu hai alcuni milioni di utenti, non avere un salato potrebbe ridurre il tempo di attacco in proporzione, anche se tutti gli utenti avrebbero password sicure. E certamente non tutti avranno.
As a bonus, which hashing algorithms are safest to use?
Lo standard corrente è quello di utilizzare un algoritmo di hashing slow . PBKDF2, bcrypt o scrypt prendono sia una password e un sale come input e un fattore di lavoro configurabile - imposta questo fattore di lavoro così alto come gli utenti accettano solo il tempo di accesso con l'hardware del tuo server.
-
PBKDF2 è semplicemente un hash veloce iterato (cioè ancora efficientemente parallelizzabile). (Si tratta di uno schema che può essere utilizzato con diversi algoritmi di base. Utilizza qualsiasi algoritmo tu utilizzi comunque nel tuo sistema.)
-
Bcrypt ha bisogno di una memoria di lavoro (4KB) e quindi è implementabile in modo meno efficiente su una GPU con meno di 4KB di processore per processore cache.
-
Scrypt utilizza una quantità di memoria (configurabile) in aggiunta al tempo di elaborazione, il che rende estremamente costoso parallelizzare su GPU o su misura hardware, mentre i computer "normali" di solito hanno abbastanza RAM disponibile.
Tutte queste funzioni hanno un input salt e dovresti usarlo .