Una función hash pura es determinista, lo que significa que si hash cualquier valor dado, siempre deberías obtener el mismo hash. 5f4dcc3b5aa765d61d8327deb882cf99 es siempre el hash MD5 de "contraseña". Puede probarlo en diferentes máquinas, con implementaciones de MD5 escritas en diferentes idiomas y, suponiendo que sean implementaciones correctas, siempre debe obtener el mismo hash al llamar a md5 ("contraseña") o el equivalente de idioma específico.
Sin embargo, esa es una propiedad realmente mala de tener en un sistema de almacenamiento de contraseñas. Para mezclar las cosas, mejores métodos de almacenamiento de contraseña utilizan un salt. En ese caso, la cadena que se está procesando se cambia para cada registro. En lugar de que todos los que usaron "password" obtengan el mismo hash de salida, el hash se genera con "password + salt" (o "salt + password", "pass + salt + word", o cualquier otra combinación. No importa para esta pregunta), para que obtengas un montón de hashes distintos:
- b305cadbb3bce54f3aa59c64fec00dea - contraseña:
- 67a1e09bb1f83f5007dc119c14d663aa - saltpassword
- 9eee04c6cecbc87f7699823f559b820d - passsaltword
Como puede verse, no hay ninguna característica común en particular en esto, incluso si se utiliza el algoritmo de hash MD5, que es una mala elección para el almacenamiento de contraseñas. (El par de "b" en las posiciones 8 y 9 en las dos primeras son solo una coincidencia).
Esto se debe a que MD5 implementa el efecto de "avalancha": el cambio de un solo bit de entrada hará que cambie una cantidad significativa de la salida (idealmente, aproximadamente el 50% por varios motivos de análisis).
Todo esto combinado significa que incluso con la sal corta utilizada anteriormente, la única manera de determinar que la palabra "contraseña" está en las tres entradas de hash es probar todas las posibilidades.
Esto depende de la función hash utilizada: se podría construir una función hash en la que agregar un salt similar provocara un cambio similar en la salida (por lo que "passwordsalt" y "passwordsals" solo varían en una pequeña cantidad cuando se utiliza el hash) pero eso no es típico de las funciones hash utilizadas para el almacenamiento de contraseñas.
Además, las recomendaciones modernas de almacenamiento de contraseñas sugieren el uso de algo como bcrypt o scrypt, que generan una sal fuerte como parte de la inicialización del hash:
- $ 2a $ 08 $ WCUycJKlopCnpbAoYIQBj.wlsQA3iC2QhLOBpMMVZZtSO8hsXP1SW
- $ 2a $ 08 $ 8s89Oz3AsJ.Dv.HAjIGKC.JdZJwzQUAkSX7Mels1Cc6Zwter.z7NO
- $ 2a $ 08 $ r5lrQviZKBDgLS4z8OKVWOnlza16.tLDCqjq8pdQ1wY.iDSldXCFW
Todos estos son hashes de "contraseña", y tener los tres no te ayuda en absoluto.