Se non viene inserita una lunghezza massima su una password, non si possono verificare collisioni?

6

Mentre stavo pensando di memorizzare gli hash delle password in un database, mi sono reso conto che potrebbero esserci collisioni hash se non c'è una lunghezza massima impostata per l'hashing della password.

La mia comprensione è che qualsiasi password genererà un hash di lunghezza fissa (ad esempio 128 bit). Quindi, non appena vengono utilizzate 2 128 + 1 password, allora abbiamo una collisione (dovuta al principio pigeonhole ), mentre è tecnicamente possibile che una collisione avvenga molto prima, a seconda dell'algoritmo di hash.

Ammesso che non esistano collisioni fino a quando non viene soddisfatto il principio del pingeonhole, sembra piuttosto assurdo avere circa 3.403e+38 di password uniche memorizzate, quindi posso capire che forse è trascurabile imporre una password massima.

C'è una legittima preoccupazione nel non avere un massimo di caratteri per le password (in riferimento alle collisioni di hash)?

Questo è relativo a questa domanda . Come menzionato da curioso , è vero che "l'impatto delle collisioni di hash è inesistente"?

    
posta Nick Miller 15.12.2015 - 22:37
fonte

2 risposte

7

Per i principianti, le funzioni di hash dovrebbero essere fondamentalmente casuali, quindi la lunghezza della stringa di input non ha importanza. La probabilità che due hash casuali di stringhe di 3 caratteri sulla stessa cosa sia uguale alla probabilità che due hash casuali di stringhe di 100 caratteri siano uguali.

Per le moderne funzioni di hash ( SHA1 , SHA2 , non MD5 ) la loro struttura è sufficientemente complessa dal punto di vista matematico che non possiamo dire molto algebricamente. Inoltre, lo spazio delle possibili stringhe di input, anche di lunghezza 32, è così grande che non possiamo verificarle sperimentalmente tutte. Quindi, in realtà non sappiamo quante collisioni ci sono nelle prime 2 stringhe 128 (stringhe la cui rappresentazione binaria è 1 , 10 , 11 ... 2 128 ). In teoria ce ne dovrebbero essere alcuni, ma per quanto ne so, non ne abbiamo ancora scoperti per SHA1 o SHA2 . Quindi la tua intuizione che limitare la lunghezza delle stringhe di input a meno di 2 128 bit eliminerà il rischio di collisioni non del tutto corretto.

In ogni caso, supponiamo che ci siano coppie di password nelle prime 2 stringhe 128 che hanno lo stesso hash, la probabilità che tu ne colpisca una nel tuo database è approssimativamente <number of entries in db> / 2 128 .

La ragione per cui

the "impact of hash collisions is non existent"?

è che 1/2 128 è un numero così inimmaginabile che anche se hai scritto un programma per generare password casuali fino a quando il sole ha esaurito l'energia, non ti aspetteresti di vedere un singola collisione per caso. (Se qualcuno sta attivamente cercando di fare un attacco di collisione, allora questa è una storia diversa).

Considera anche in che modo il rischio di collisione (~ 1/2 128 ) è paragonabile al rischio di un attacco dizionario standard. In base alla perdita di password Adobe 2013 , 1 su 68 account su Internet utilizza la password 123456 . 1/68 è un numero MOLTO più grande di 1/2 128 , quindi il fatto che una singola ipotesi di 123456 abbia una probabilità di 1/68 di avere ragione è una MOLTA cosa più importante di cui preoccuparsi di collisioni teoricamente possibili. Soluzione: consenti (o imponi ) le password non di dizionario lunghe, usa un salt unico per ogni hash della password e non preoccuparti delle collisioni.

    
risposta data 15.12.2015 - 23:09
fonte
4

Qui c'è poco da preoccuparsi, ma parliamo di questo:

Granted no collisions exist until the pingeonhole principle is satisfied

Questo non è il caso. Gli algoritmi di hashing standard sono deterministici (altrimenti non funzionerebbero.) Le password che si scontreranno (e ci sarà un numero infinito senza limite di lunghezza della password). Le collisioni non sono correlate alle dimensioni del tuo database. Ad esempio, considera il mio nuovo algoritmo di hash intero mod100. L'implementazione è che mod un intero di 100 e il resto risultante è il tuo hash. Se ho cancellato i numeri 101, 201 e 301 ho il 100% di collisione anche se il mio set è solo il 3% dello spazio hash.

Quindi c'è una possibilità astronomicamente piccola che qualcuno possa indovinare su una delle altre password che ha lo stesso hash di una vera e propria password reale. Se l'algoritmo di hashing è buono, è più probabile, tuttavia, che indovinerà la password effettiva. Non perdere il sonno su di esso.

    
risposta data 15.12.2015 - 22:57
fonte

Leggi altre domande sui tag