has_secure_password 是不是使用任何形式的盐渍?

Posted

技术标签:

【中文标题】has_secure_password 是不是使用任何形式的盐渍?【英文标题】:Does has_secure_password use any form of salting?has_secure_password 是否使用任何形式的盐渍? 【发布时间】:2012-04-25 18:22:53 【问题描述】:

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

提斯

【问题讨论】:

【参考方案1】:

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

对于这个函数产生的示例哈希:

版本:2a 花费:10 盐:$2a$10$4wXszTTd7ass8j5ZLpK/7。 哈希:ywXXgDh7XPNmzfIWeZC1dMGpFghd92e

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

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

【讨论】:

我相信作者是在询问关于盐的单独列。我们无法控制这种盐,所以对于用户来说,它就像一个哈希扩展器——只破坏 1 列使得破解我们的密码只是时间问题。 问题是“has_secure_password 是否使用任何形式的盐渍?”,确实如此。我认为大多数时候整个数据库都会受到损害,因此如果将盐保存在额外的列中并没有什么区别。但是,您是对的,在数据​​库的单个列被破坏的情况下更安全。 为了澄清 fabi 的意思,bcrypt-ruby 自动生成一个 salt 并将其与 password_digest 列中的散列密码连接起来。见github.com/codahale/bcrypt-ruby#salts 不回答用户的问题。用户问我们是否可以自己加盐?因为当我测试一个示例密码“indu”并检查不同版本的 bcrypt 生成的哈希值时,在不同的机器上,哈希值是相同的。如果它被加盐,不同的安装/应用程序将生成不同的哈希,所以如果数据库被黑客入侵,但不是提到盐的文件,那么黑客将无法根据某些哈希数据库检查密码哈希。 我猜你的环境有问题,当我在 irb 中反复运行 BCrypt::Password.create('indu') 时,每次调用都会得到不同的哈希值(如预期的那样)。

以上是关于has_secure_password 是不是使用任何形式的盐渍?的主要内容,如果未能解决你的问题,请参考以下文章

Rails has_secure_password 更改 BCrypt 成本因素(又名工作因素)

ruby 用户模型w / has_secure_password,可以更新

随机生成的密码 Rails 3.1

rails--bcrypt对密码加密

Ruby on Rails 无需密码即可更新用户属性

user.save 在控制台中返回 false,但通过 UI 完成时返回 true