has_secure_password是否使用任何形式的腌制?

时间:2012-04-13 11:27:40

标签: ruby-on-rails encryption passwords salt

我想使用has_secure_password将加密密码存储在数据库中。如果has_secure_password使用任何形式的腌制,我都无法在互联网上找到。如果它使用盐腌,它是如何工作的?谁能为我澄清这个?

泰斯

1 个答案:

答案 0 :(得分:86)

has_secure_password使用bcrypt-rubybcrypt-ruby会自动为您存储和生成盐。 bcrypt-ruby的典型哈希值如下所示:$2a$10$4wXszTTd7ass8j5ZLpK/7.ywXXgDh7XPNmzfIWeZC1dMGpFghd92e。使用以下函数在内部拆分此哈希:

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

对于示例哈希,此函数会产生:

  • 版本:2a
  • 费用:10
  • 盐:$ 2a $ 10 $ 4wXszTTd7ass8j5ZLpK / 7.
  • hash:ywXXgDh7XPNmzfIWeZC1dMGpFghd92e

== - BCrypt::Password的函数提取salt并将其应用于传递的字符串:

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