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

Thi*_*ijs 67 encryption passwords ruby-on-rails salt

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

泰斯

fab*_*abi 87

has_secure_password使用bcrypt-ruby.bcrypt-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
Run Code Online (Sandbox Code Playgroud)

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

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

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

BCrypt::Password.create('bla') == 'bla' # => true
Run Code Online (Sandbox Code Playgroud)

  • 问题是'has has_secure_password是否使用任何形式的腌制?',它确实如此.我认为大多数情况下整个数据库都会受到损害,因此如果将盐保存在额外的列中,则没有任何区别.但是,如果只有一列数据库受到攻击,那么它是更安全的. (13认同)