2012-04-13 9 views
61

Quiero usar has_secure_password para almacenar contraseñas encriptadas en la base de datos. No puedo encontrar en Internet si has_secure_password usa cualquier forma de salazón. Si usa salazón, ¿cómo funciona? ¿Alguien puede aclarar esto por mí?¿has_secure_password utiliza alguna forma de salazón?

Thijs

Respuesta

79

has_secure_password utiliza bcrypt-ruby. bcrypt-ruby maneja automáticamente el almacenamiento y la generación de sales para usted. Un hash típico de bcrypt-ruby tiene este aspecto: $2a$10$4wXszTTd7ass8j5ZLpK/7.ywXXgDh7XPNmzfIWeZC1dMGpFghd92e. Este hash se divide internamente usando la siguiente función:

def split_hash(h) 
    _, v, c, mash = h.split('$') 
    return v, c.to_i, h[0, 29].to_str, mash[-31, 31].to_str 
end 

Para el ejemplo de hash esta función se obtiene:

  • versión: 2a
  • costo: 10
  • sal: $ 2a $ 10 $ 4wXszTTd7ass8j5ZLpK/7.
  • de hash: ywXXgDh7XPNmzfIWeZC1dMGpFghd92e

El == -función de BCrypt::Password extrae la sal y la aplica a la cadena pasada:

BCrypt::Password.create('bla') == 'bla' # => true 
+1

que creían que el autor estaba preguntando por una columna separada para la sal. No hay forma de que controlemos esta sal, por lo que para el usuario actúa como un extensor de hash, ya que comprometer solo una columna hace que se rompa nuestra contraseña solo por cuestión de tiempo. – jdoe

+11

La pregunta era '¿has_secure_password utiliza alguna forma de salazón?', Y lo hace. Creo que la mayoría de las veces una base de datos completa está en peligro, por lo que no importa si la sal se guarda en una columna adicional. Sin embargo, tiene razón en que es más seguro en el caso de que solo una sola columna de la base de datos se vea comprometida. – fabi

+0

Hola Fabi, gracias por la respuesta, por favor, vota la pregunta si crees que es interesante/aplicable para un público más amplio. –

Cuestiones relacionadas