Como ha dicho Thomas, una función de hash criptográfica verdadera y adecuada no debería filtrar ninguna información sobre la contraseña. Esto se debe a algunas cosas:
-
Salida de longitud fija: la salida de hash siempre tendrá una cierta longitud (varía según el algoritmo), independientemente de cuán larga o corta sea la contraseña.
-
Salidas únicas y diferentes: cualquier cambio en la contraseña debe dar como resultado un cambio tan significativo en la salida, que dos contraseñas muy similares (es decir, "password1" y "password2") no son similares después del hashing.
-
Sal única para cada usuario: se utiliza un elemento agregado en la función de hashing que es única para cada usuario, de modo que dos usuarios que elijan la misma contraseña no tendrán el mismo hash de contraseña.
Como se ha mencionado en mis comentarios, e incluido en la respuesta de grawulf, históricamente ha habido ejemplos de funciones de hashing que violan estos principios. Quizás el ejemplo más conocido de esto es LANMAN (a.k.a .: LM hash, o LAN Manager hash). Esta función de hashing se usó en versiones de Windows anteriores a NT, y aún se incluye (aunque está deshabilitada de forma predeterminada) para compatibilidad con versiones anteriores en versiones modernas.
Los problemas con LANMAN son muchos, pero la mayoría de ellos están arraigados en su uso de DES - especialmente la parte que Permite adivinar la longitud de la contraseña de un usuario. El DES está limitado a una longitud de clave de 56 bits, que se traduce en 7 bytes o caracteres ASCII. Por supuesto, esto debe haber sido conocido, incluso en los días anteriores al NT, por ser demasiado pequeño para una contraseña razonablemente segura.
Entonces, la solución alternativa de Microsoft fue dividir la contraseña del usuario a la mitad, hacer hash cada mitad por separado y luego unir las cadenas de hash para formar el hash final de LM. Esto permitiría a los usuarios crear contraseñas de hasta 14 caracteres de largo. Para contraseñas de menos de 14 caracteres, habrá un relleno adicional de caracteres nulos al final (antes de dividir la contraseña) para completar el resto de la (s) clave (s) DES. Por supuesto, esto significa que todas las contraseñas de menos de 7 caracteres terminarán con la última mitad de su hash (habiendo comenzado como todos los caracteres nulos, y hash sin sal) siendo idénticas a todas las demás contraseñas de menos de 7 caracteres.
Si Microsoft hubiera usado un sal por usuario, al menos habría evitado la fácil adivinación de la longitud de la contraseña de un usuario a partir de la salida de hash. También habría hecho más difíciles los ataques de diccionario. Sin embargo, hay otras debilidades inherentes (más allá del alcance de esta pregunta) en la función que aún la dejan totalmente inadecuada para su uso en el mundo de hoy.
Las funciones criptográficas modernas son mucho más fuertes y más inteligentes que esto, y por lo tanto son mucho menos propensas a filtrar datos particulares sobre la longitud de su contraseña. Sin embargo, es bueno tener en cuenta este detalle histórico como un ejemplo de cómo not para las contraseñas de hash. (Por supuesto, de todos modos, nunca es una buena idea rodar tu propio cripto).
CONSEJO: si bien las contraseñas de hash con LANMAN se han deshabilitado de forma predeterminada desde Vista, todavía es una característica disponible para la compatibilidad con versiones anteriores. Si desea asegurarse de que sus contraseñas de Windows no puedan y, por lo tanto, no se procesarán como hashes LM en ningún sistema Windows, a pesar de cómo el administrador del sistema puede configurarlo, asegúrese de sus contraseñas tienen al menos 15 caracteres.