2012-06-24 21 views
8

im trabajando con rieles y me di cuenta de que mi password_digest es diferente para 2 usuarios con todos los demás campos distintos al resumen de contraseña diferente. pero he utilizado la misma contraseña "ABCD" para ambos ..
terminó generando estos 2 diferentes hashes¿por qué el hash de contraseña es diferente para 2 usuarios con la misma contraseña?

  1. $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

pensé que la gema bcrypt genera el hash solo basado en el campo de contraseña! ¿Me equivoco? gracias :)

+0

Quizás (afortunadamente) la contraseña es [salada] (http://en.wikipedia.org/wiki/Salt_ (criptografía))? –

+0

[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –

+0

Este comportamiento es _emphatically_ por diseño. – SLaks

Respuesta

16

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.

+1

¡gracias! :) que fue realmente útil y mucho más de lo que esperaba! – viswa

2

bcrypt almacena la sal en el hash de la contraseña.

Esos son dos hash diferentes de la misma contraseña con dos sales diferentes.

Al verificar las contraseñas, bcrypt leerá la sal del campo hash, luego volverá a calcular el hash utilizando esa sal.

Cuestiones relacionadas