Una funzione di hash pura è deterministica, il che significa che se hai un qualsiasi valore dato, dovresti sempre ottenere lo stesso hash. 5f4dcc3b5aa765d61d8327deb882cf99 è sempre l'hash MD5 di "password". Puoi provarlo su macchine diverse, con implementazioni MD5 scritte in lingue diverse e, supponendo che siano implementazioni corrette, dovresti sempre ottenere lo stesso hash dal chiamare md5 ("password") o l'equivalente linguaggio specifico.
Tuttavia, questa è una proprietà davvero pessima da avere in un sistema di memorizzazione delle password. Per mescolare le cose, i migliori metodi di memorizzazione delle password usano un sale. In tal caso, la stringa da sottoporre a hash viene modificata per ogni record. Invece di tutti coloro che hanno usato "password" per ottenere lo stesso hash dell'output, viene generato l'hash di "password + salt" (o "salt + password", "pass + salt + word" o qualsiasi altra fusione. questa domanda), quindi ottieni un sacco di hash distinti:
- b305cadbb3bce54f3aa59c64fec00dea - passwordsalt
- 67a1e09bb1f83f5007dc119c14d663aa - saltpassword
- 9eee04c6cecbc87f7699823f559b820d - passsaltword
Come si può vedere, non ci sono particolari caratteristiche comuni in questi, anche usando l'algoritmo di hashing MD5, che è una cattiva scelta per l'archiviazione delle password. (La coppia di "b" s nelle posizioni 8 e 9 nei primi due è solo una coincidenza).
Questo perché MD5 implementa l'effetto "valanga": la modifica di un singolo bit di input causerà una significativa modifica dell'output (idealmente circa il 50% per vari motivi di analisi).
Tutto questo combinato significa che anche con il sale breve usato sopra, l'unico modo per determinare che la parola "password" è nei tre ingressi hash è provare tutte le possibilità.
Dipende dalla funzione di hash utilizzata - puoi costruire una funzione di hash in cui l'aggiunta di un sale simile ha comportato una modifica simile all'output (quindi "passwordsalt" e "passwordsals" variano solo di una piccola quantità quando sono sottoposti a hash), ma questo non è tipico delle funzioni di hash utilizzate per l'archiviazione delle password.
Inoltre, le moderne raccomandazioni sull'archiviazione delle password suggeriscono l'uso di qualcosa come bcrypt o scrypt, che generano entrambi un strong effetto come parte dell'inizializzazione dell'hash:
- $ 2a $ 08 $ WCUycJKlopCnpbAoYIQBj.wlsQA3iC2QhLOBpMMVZZtSO8hsXP1SW
- $ 2a $ 08 $ 8s89Oz3AsJ.Dv.HAjIGKC.JdZJwzQUAkSX7Mels1Cc6Zwter.z7NO
- $ 2a $ 08 $ r5lrQviZKBDgLS4z8OKVWOnlza16.tLDCqjq8pdQ1wY.iDSldXCFW
Tutti questi sono hash di "password" - e avere tutti e tre non ti aiuta affatto.