2010-10-23 3 views
13

Sto imparando Rails, al momento, ma la risposta non deve essere specifica per Rails.In che modo l'utilizzo di sale rende la password più sicura se è archiviata nel database?

Quindi, se ho capito bene, un sistema di password sicura funziona così:

  • utente crea una password
  • sistema crittografa la password con un algoritmo di cifratura (diciamo SHA2).
  • Archivia hash della password crittografata nel database.

Al tentativo di accesso:

  • utente tenta di accedere
  • sistema crea hash del tentativo con l'algoritmo di cifratura stessa
  • sistema confronta hash del tentativo con hash della password nel database.
  • Se corrispondono, vengono lasciati entrare. In caso contrario, devono riprovare.

Come ho capito, questo approccio è soggetto ad un attacco arcobaleno - in cui può accadere quanto segue.

Un utente malintenzionato può scrivere uno script che essenzialmente tenta ogni permutazione di caratteri, numeri e simboli, crea un hash con lo stesso algoritmo di crittografia e li confronta con l'hash nel database.

Quindi il modo per aggirare è combinare l'hash con un sale unico. In molti casi, la data e l'ora correnti (fino a millisecondi) registrate dall'utente.

Tuttavia, questo sale viene memorizzato nella colonna del database 'sale'.

Quindi la mia domanda è, come cambia il fatto che se l'attaccante ha avuto accesso al database in primo luogo e ha l'hash creato per la password "reale" e ha anche l'hash per il sale, come è questo non solo come soggetto ad un attacco arcobaleno? Perché, la teoria sarebbe che prova ogni permutazione + l'hash di sale e confronta il risultato con l'hash della password. Potrebbe volerci un po 'di più, ma non vedo come sia infallibile.

Perdona la mia ignoranza, sto solo imparando questa roba e questo non ha mai avuto molto senso per me.

+0

possibile duplicato di [Dove si memorizzano le stringhe di sale?] (Http://stackoverflow.com/questions/1219899/where-do-you-store-your-salt-strings) – blowdart

+0

No. Non sto sostenendo o chiedendo se ha più senso conservare il sale altrove rispetto al db. Sto cercando di esplorare l'idea di come un sale sia effettivamente più sicuro, in un'epoca in cui le risorse di calcolo sono così economiche. – marcamillion

+0

SHA-2 è un algoritmo di hashing. Hashing è un concetto diverso dalla crittografia. – wulfgarpro

risposta

8

Il vantaggio principale di un sale (scelto a caso) è che anche se due persone usano la stessa password, l'hash sarà diverso perché i sali saranno diversi. Ciò significa che l'utente malintenzionato non può precalcolare gli hash delle password comuni perché ci sono troppi valori di sale diversi.

Si noti che il sale non deve essere tenuto segreto; deve essere abbastanza grande (64 bit, per esempio) e abbastanza casuale che due persone che usano la stessa password hanno una probabilità incredibilmente piccola di usare anche lo stesso sale. (Potresti, se lo volessi, controllare che il sale fosse unico.)

+0

Oh ok. Quindi l'idea è che l'attaccante non stia facendo un attacco di forza bruta (confrontando la stringa salata con l'hash pw nel db) perché ci vuole troppo - ammesso che l'hash di sale + pw sia abbastanza lungo (64-bit a pezzo)? Se questo è il caso, non ha molto senso in un giorno ed età quando le vaste risorse informatiche stanno diventando più economiche/gratuite? Ad esempio, se un utente malintenzionato ha accesso a una botnet di 1 milione di computer, perché non potrebbe scrivere uno script per fare solo il confronto di forza bruta di ogni sale con quei milioni di computer? – marcamillion

+3

Ci vuole un tempo piuttosto lungo per forzare un hash, e anche se fosse facile come stai implicando, fermerebbe comunque chiunque senza un milione di botnet di computer a disposizione. – ceejayoz

+2

L'obiettivo è rendere più difficile rompere le password rispetto ad altri metodi di attacco. Se l'utente malintenzionato può leggere il database e dispone di tempo di calcolo sufficiente per creare una tabella arcobaleno per il valore di sale per ciascun account che l'utente malintenzionato desidera, l'utente o l'utente malintenzionato giudica erroneamente il rischio/valore di violare il sito. – Slartibartfast

1

L'attaccante non può eseguire un attacco da tavolo arcobaleno e deve eseguire la forza bruta che è molto meno efficiente.

2

Vedere la risposta accettata a questa domanda; Where do you store your salt strings?

Spiega come l'hash contrasta l'arcobaleno.

+0

Questo spiega l'idea alla base del tavolo dell'arcobaleno (cioè contro la nozione di fare una forza bruta su ogni permutazione facendo calcoli preliminari/ipotesi sotto forma di un tavolo arcobaleno).Ma ancora non capisco perché sia ​​così impossibile croppare in un giorno ed età quando il calcolo delle risorse è così economico. – marcamillion

+0

Non è impossibile: con un tempo sufficiente potresti forzare la forza con un hash salato. Questo è il motivo per cui fai ancora qualche tentativo per mantenere privato il tuo database :) E ovviamente non è l'unica considerazione. Altri includono l'uso di un buon algoritmo di hashing, molti dei quali si concentrano sull'essere veloci nell'hashing, che è l'opposto di ciò che si vuole quando si hanno password di hashing. – Nick

+0

@Nick. Abbastanza. Molti standard suggeriscono l'hashing delle password salate più volte (in genere> 1000) perché il calcolo extra richiesto non ostacola notevolmente il controllo di una password, ma ostacola in modo significativo gli attacchi a forza bruta. – dajames

8

Prima di tutto, quello che hai descritto non è un attacco arcobaleno, è un attacco dizionario.

In secondo luogo, il punto principale dell'uso di sale è che rende la vita più difficile per l'attaccante. Ad esempio, se si aggiunge un salt di 32 bit a ciascuna frase di accesso, l'utente malintenzionato deve eseguire hash e re-hash ogni input nel dizionario ~ 4 miliardi di volte e archiviare i risultati da tutti gli di quelli per avere un esito positivo. attacco.

Per avere qualche speranza di essere del tutto efficace, un dizionario deve includere qualcosa come un milione di input (e un milione di risultati corrispondenti). Hai menzionato SHA-1, quindi usiamolo per il nostro esempio. Produce un risultato a 20 byte (160 bit). Supponiamo che un input medio abbia qualcosa come 8 caratteri. Ciò significa che un dizionario deve essere qualcosa come 28 megabyte. Con un sale a 32 bit, tuttavia, sia la dimensione che il tempo di produzione del dizionario vengono moltiplicati per 2 -1.

Proprio come un estremamente approssimazione approssimativa, diciamo che produrre un dizionario (non salato) è durato un'ora. Fare lo stesso con un sale a 32 bit richiederebbe 2 -1 ore, che funziona a circa 15 anni. Non ci sono molte persone disposte a spendere quella quantità di tempo per un attacco.

Dato che si menzionano le tabelle arcobaleno, aggiungerò che in genere sono ancora più grandi e lente da iniziare. Una tipica tavola arcobaleno riempie facilmente un DVD, e moltiplicandola per 2 -1 dà un numero abbastanza grande che l'archiviazione diventa un problema serio (come in, questo è più di tutto lo spazio di archiviazione costruito nell'intera storia dei computer , almeno sul pianeta terra).

+0

Ok abbastanza giusto. La tua matematica ha un senso. Posso vedere come questo attacco non sia infallibile, ma abbastanza da scoraggiare gli attaccanti "indeterminati". Ma è giusto dire che l'uso di un hash + sale può ancora essere rotto, giusto? Ad esempio, 15 anni possono essere abbattuti in modo significativo con 100.000 computer che eseguono il calcolo o addirittura 1 milione. Se si presuppone che l'autore dell'attacco disponga di risorse di calcolo essenzialmente illimitate per risolvere il problema (ad esempio, ha hackerato Google e ha asso su tutti i server di Google - inverosimile, ma semplicemente illustrando un punto), allora fare un attacco con il dizionario ha senso, giusto? – marcamillion

+0

2^32-1 bit = 4,294,967,295bits = 536 MBytes. A meno che tu non intenda 2^32-1 * 32-bit, allora non è molta memoria. Anche allora, 2^32-1 * 32 = 17.179 GB. – marcamillion

+0

@marcmillion: devi anche unire i risultati, quindi anche con molti server, devi anche avere una buona comunicazione, coordinazione, ecc. Per farlo (ma sì, alla fine è possibile). Non sono sicuro di dove stai cercando di andare con i tuoi calcoli. Ogni bit che aggiungi alla chiave raddoppia la dimensione del dizionario. –