70

我想用来has_secure_password在数据库中存储加密的密码。has_secure_password如果使用任何形式的盐渍,我在互联网上找不到。如果它使用盐渍,它是如何工作的?任何人都可以为我澄清这一点吗?

蒂斯

4

1 回答 1

91

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。
  • 哈希:ywXXgDh7XPNmzfIWeZC1dMGpFghd92e

==-functionBCrypt::Password提取盐并将其应用于传递的字符串:

BCrypt::Password.create('bla') == 'bla' # => true
于 2012-04-13T15:01:38.960 回答