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.