Un sacco di persone dicono "per fermare le tabelle arcobaleno" senza spiegare cosa fanno le tabelle arcobaleno o perché questo li ferma.
Le tabelle arcobaleno rappresentano un modo intelligente di precalcificare un numero elevato di hash e di archiviarle in una quantità di memoria inferiore rispetto a quella richiesta in modo ingenuo, e possono essere utilizzate per invertire rapidamente un hash. Le tabelle per le funzioni nude come hash = md5(password)
e hash = sha1(password)
sono comuni.
Tuttavia, possono essere generati per QUALSIASI funzione di hash che può essere descritta come output = f(input)
. Se si utilizza un salt del sito per tutte le password utente, ad esempio hash = md5(salt+password)
, è possibile creare una funzione f
, f(password) = md5(salt+password)
. Pertanto è possibile generare tabelle arcobaleno per questa funzione, operazione che richiederebbe molto tempo, ma consentirebbe di suddividere rapidamente ogni singola password nel database.
Se il valore di sale è diverso per ciascuna password, non è possibile generare una tabella arcobaleno che crei la violazione di tutte le password nel database. Potresti generarne uno nuovo per ogni utente, ma sarebbe inutile: una forzatura bruta ingenua non sarebbe più lenta. Quindi avere un sale separato per ogni utente arresta l'attacco delle tabelle arcobaleno.
Ci sono diversi modi per farlo.modi popolari includono:
- Un sale separato per ogni utente, conservato al fianco dei loro altri dettagli nel database:
hash = hashfunction(salt + password)
- Un sale globale e un valore unico per ogni utente:
hash = hashfunction(salt + password + user_id)
ad esempio
- Un sale globale e una per utente sale:
hash = hashfunction(global_salt + user_salt + password)
Avere un sale globale potrebbe aggiungere un po 'di complessità in più per fessurazione le password, in quanto potrebbe essere conservato al di fuori del database (nel codice, per esempio), che gli attaccanti non possono guadagnare accesso a nel caso di una violazione del database. Crittograficamente non penso che aggiunga molto, ma in pratica potrebbe rallentarli.
Infine, per rispondere alla tua domanda effettiva:
Conservazione del sale a fianco dei dati utente non indebolisce l'hash. Le funzioni di hash sono a senso unico: dato l'hash di una password, anche se non salda, è molto difficile trovare quella password. La motivazione alla base della salatura non è quella di rendere più sicuro un singolo hash, ma di rendere più sicura la raccolta di più hash. Ci sono diversi vettori di attacco per una collezione di hash non salati:
- tabelle arcobaleno
- hashing delle password comuni (
123
, password
, god
) e vedere se esistono nel database e quindi compromettono tali conti
- Cerca hash identici nel database, che significa password identiche (probabilmente)
http://stackoverflow.com/questions/213380/the-necessity-of-hiding-the-salt-for-a-hash/215165#215165 – tanascius