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

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

提斯

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 encryption passwords salt


    【解决方案1】:

    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

    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') 时,每次调用都会得到不同的哈希值(如预期的那样)。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2011-04-03
    • 2011-08-07
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多