has_secure_password是否使用任何形式的加盐?


68

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

蒂斯

Answers:


89

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

1
我相信作者正在询问有关盐的单独专栏。我们无法控制这种盐,因此对于用户而言,它的作用就像哈希扩展器一样-仅破坏1列就可以只用一次时间就可以破解密码。
jdoe 2012年

13
问题是“ has_secure_password是否使用任何形式的加盐?”并且确实如此。我认为大多数情况下都会破坏整个数据库,因此,如果将盐保存在额外的列中也不会造成任何影响。但是,很正确的做法是,如果只破坏数据库的单个列,这样做会更安全。

1
为了弄清楚FAB在说什么,bcrypt-ruby自动生成一个salt并将其与password_digest列中的哈希密码连接起来。见github.com/codahale/bcrypt-ruby#salts
Ryan Crispin Heneise 2015年

1
不回答用户的要求。用户问我们是否可以自己加盐?因为当我测试示例密码“ indu”并检查了由不同版本的bcrypt以及在不同计算机上生成的哈希时,哈希是相同的。如果添加了盐,则不同的安装/应用程序将生成不同的哈希,因此,如果数据库被黑客入侵,但未提及盐所在的文件,则黑客将无法针对某个哈希数据库检查密码哈希。
Indu Pillai

1
我猜您的环境有问题,当我BCrypt::Password.create('indu')在irb中重复运行时,每次调用都会得到不同的哈希值(与预期的一样)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.