【问题标题】:What password hashing algorithm does devise use?设计使用什么密码哈希算法?
【发布时间】:2017-08-31 19:24:27
【问题描述】:

我想在不使用 devise 的 ruby​​ 应用程序中存储和验证密码,并让它们与将来使用 devise 的应用程序兼容。 devise 使用的默认密码哈希方案是什么,是否可以从 devise 中仅提取和使用这个组件?

【问题讨论】:

    标签: ruby-on-rails ruby authentication devise


    【解决方案1】:

    Devise 的 DatabaseAuthenticatable 模块使用 BCrpyt 对密码进行哈希处理,封装在 Devise::Encryptor 模块中。相关的方法digest很简单:

    def self.digest(klass, password)
      if klass.pepper.present?
        password = "#{password}#{klass.pepper}"
      end
      ::BCrypt::Password.create(password, cost: klass.stretches).to_s
    end
    

    klass 仅用于获取几个参数:pepper,附加到密码预散列但存储在数据库中的字符串(与附加的盐不同也一样,但与密码一起存储在数据库中);和cost,衡量哈希应该有多安全(参见the docs)。这两个都是静态的,您可以将它们硬编码到您的非设计应用程序中(但请确保将pepper 保密!)。

    所以,你的哈希方法可以写成:

    def self.digest(password)
      password = "#{password}#{ENV['PASSWORD_PEPPER']}"
      ::BCrypt::Password.create(password, cost: 10).to_s
    end
    

    【讨论】:

    • 辣椒对所有用户都一样吗?
    • 这不应该是从一个范围内随机分配的吗?然后在验证密码时测试每个可能的值?也可以用盐吗?
    • Pepper 对所有用户都是相同的,但不存储在数据库中(即不与哈希一起存储)。 Salt 是每个用户随机生成的(由 Bcrpyt 生成,因此上面没有提到它),但与哈希一起存储。两者的结合提供了一些额外的安全性,因为攻击者需要您的数据库和您的代码库才能进行暴力攻击。
    • 我忘了提——如果你看一下 Encryptor 模块,当检查输入的密码与存储的密码时,它使用 BCrypt 库从哈希中提取盐并获取摘要。
    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2012-08-19
    • 2015-02-15
    • 2016-02-22
    • 2016-06-23
    • 2020-09-16
    • 2012-05-24
    相关资源
    最近更新 更多