Lo que está viendo aquí es más que un hash de contraseña, hay una gran cantidad de metadatos sobre el hash incluido en esas cadenas. En términos de bcrypt, la cadena completa se consideraría el hash bcrypt. Esto es lo que incluye:
$ es el delimitador en bcrypt.
$ 2a $ es el algoritmo bcrypt que se utilizó.
$ $ es el factor de costo que se utilizó. Es por eso que bcrypt es muy popular para almacenar hashes. Cada hash tiene una complejidad/costo asociado, que se puede pensar en cuán rápido le tomará a una computadora generar este hash. Este número es, por supuesto, relativo a la velocidad de las computadoras, así que a medida que las computadoras se vuelven más y más rápidas con el paso de los años tomará menos tiempo generar un hash con un costo de 10. Así que el próximo año aumentará su costo a 11, luego a 12 ... 13 ... y así sucesivamente. Esto permite que tus valores hash futuros permanezcan fuertes mientras conservas tus valores hash más antiguos aún en vigencia. Simplemente tenga en cuenta que no puede cambiar el costo de un hash sin volver a procesar la cadena original.
El $ QyrjMQf ... es una combinación de la sal y el hash. Esta es una cadena codificada en base64.
Los primeros 22 caracteres son la sal.
Los caracteres restantes son el hash cuando se usa con el algoritmo 2a, el costo de 10 y la sal dada. La razón de la sal es que un atacante no puede calcular hash de brypt para evitar pagar el costo de generarlos.
De hecho, esta es la respuesta a su pregunta original: La razón de los valores hash son diferentes se debe a que si se tratara de la misma usted sabe que en cualquier momento que vio la cadena bcrypt $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
usted conoce la contraseña sería abcd
. De modo que podría escanear una base de datos de hash y encontrar rápidamente a todos los usuarios con la contraseña abcd buscando ese hash.
No se puede hacer esto con bcrypt porque $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem
es también abcd
. Y hay muchos muchos más hashes que serán el resultado de bcrypt('abcd')
. Esto hace que escanear una base de datos para contraseñas abcd sea casi imposible.
Quizás (afortunadamente) la contraseña es [salada] (http://en.wikipedia.org/wiki/Salt_ (criptografía))? –
[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –
Este comportamiento es _emphatically_ por diseño. – SLaks