什么密码哈希算法设计使用?

时间:2017-08-31 19:24:28

标签: ruby-on-rails ruby authentication devise

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

1 个答案:

答案 0 :(得分:3)

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,一个字符串,附加到密码预先散列但存储在数据库中(与salt不同) ,也附加,但密码存储在DB中);和cost,衡量哈希的安全程度(见the docs)。这两个都是静态的,您可以将它们硬编码到非Devise应用程序中(但请确保pepper保密!)。

因此,您的哈希方法可能写成:

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