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。 哈希:ywXXgDh7XPNmzfIWeZC1dMGpFghd92eBCrypt::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 成本因素(又名工作因素)