Lo primero es lo primero: esto NO es cifrado. Esto es hash. Si su libro habla de "hash cifrado", entonces ese libro está confundido y, por lo tanto, confuso. En particular, las contraseñas con hash nunca se "descifran", ya que no están cifradas en primer lugar.
Una función hash criptográfica ofrece un tamaño de salida fijo. En el caso de contraseñas , uno tiene que hacer algo específico llamado "password-hashing", que tiene su propia teoría (consulte esta respuesta para más detalles). Sin embargo, el principio principal todavía está allí: al verificar una contraseña entrante, la contraseña se convierte en un valor x , y ese x se compara con el valor que se almacenó. Si la contraseña es la correcta, se obtiene el mismo x . Sin embargo, si se ingresó una contraseña incorrecta, se obtiene otro valor x ', que es distinto de x con alta probabilidad .
Este es el punto importante aquí: un atacante aún podría tener (mucha) suerte y, en lugar de enviar la contraseña correcta, podría en teoría tropezar con otra contraseña distinta que, por pura casualidad, arrojaría el mismo valor de hash.
Por supuesto, no queremos que ocurra algo así, y la mejor manera de hacer que ese evento sea totalmente improbable es hacer que estos valores x (es decir, la salida de la función hash) sean lo suficientemente grandes como para Mala suerte de no ocurrir en la práctica. Las funciones hash existentes tienen un tamaño de salida que suele ser de 16 bytes (128 bits) o más. Esto también se aplica a las funciones de hashing de contraseñas; p.ej. bcrypt genera 192 bytes.
(Para aumentar el efecto, las salidas de hash son binarias, pero a menudo están codificadas en Base64 antes del almacenamiento en la base de datos, lo que aumenta el tamaño; además, las funciones de hashing de contraseña necesitan algunos parámetros adicionales, por ejemplo, un salt las cuales, en algunas funciones, también están codificadas en la salida, expandiendo aún más la salida.)
Las contraseñas elegidas por el usuario rara vez superan una docena de caracteres de longitud, por lo que, en general, la salida de hash será mayor. Sin embargo, las funciones de hash pueden usar entradas grandes, por lo que no hay intrinsic por lo que las salidas de hash siempre deben ser más grandes que las contraseñas. Simplemente sucede que necesitamos, para frustrar al "atacante afortunado" descrito anteriormente, un tamaño de salida que es "suficientemente grande", y que "suficientemente grande" es mayor que el tamaño promedio de las contraseñas elegidas por los usuarios humanos.