Lo primero que se debe tener en cuenta es que un "hash de contraseña" no es simplemente un hash de la contraseña, es una estructura de varios campos que contiene no solo el hash en sí, sino una indicación de qué esquema de hash se utiliza y de cualquier parámetro necesario. (en el caso de bcrypt un parámetro de sal y un costo)
Por lo tanto, la respuesta a la pregunta de si un "hash de contraseña" no válido da como resultado que no haya contraseñas que funcionen no tiene nada que ver con las funciones de hash, se reduce a cómo el código de verificación maneja las entradas que no representan un hash de contraseña válido en una. de los formatos soportados. Uno esperaría que considerara un hash no válido como no coincidente, pero la documentación no está clara, por lo que necesitamos leer la fuente.
enlace
enlace
Al leer el código de php's password_verify, encontramos que primero llama "php_password_determine_algo", si la contraseña comienza con $ 2y $ se considera "bcrypt", si comienza con "$ argon2i $" se considera argon2 De lo contrario, se considera "desconocido".
Si el hash es "bcrypt" o "desconocido", entonces pasa a llamar a php_crypt y le pasa la contraseña y el hash, esto intenta hacer un hash de la contraseña proporcionada usando el método y salt de la contraseña existente, puede hacer esto mediante el uso de una implementación interna o llamando a la función de cifrado del sistema operativo. Parece que dado un hash existente no válido, el código interno retrocederá al DES de la vieja escuela, sin estar seguro de lo que hará la implementación del sistema.
Volviendo a la sección unknown / bcrypt en password_verify, parece que no podrá coincidir si se cumple alguna de las siguientes condiciones.
- php_crypt devuelve un error.
- la longitud del hash devuelto por php_crypt no coincide con la longitud del hash con contraseña para password_verify
- el hash pasado a password_verify tiene menos de 13 caracteres de longitud
- el contenido del hash devuelto por php_crypt no coincide con el contenido del hash pasado a password_verify
Su hash de "-" será rechazado por al menos la regla 3 de esta lista (probablemente también las reglas 1 o 2, pero eso depende del comportamiento de la implementación de criptografía utilizada).