【发布时间】:2017-08-31 19:24:27
【问题描述】:
我想在不使用 devise 的 ruby 应用程序中存储和验证密码,并让它们与将来使用 devise 的应用程序兼容。 devise 使用的默认密码哈希方案是什么,是否可以从 devise 中仅提取和使用这个组件?
【问题讨论】:
标签: ruby-on-rails ruby authentication devise
我想在不使用 devise 的 ruby 应用程序中存储和验证密码,并让它们与将来使用 devise 的应用程序兼容。 devise 使用的默认密码哈希方案是什么,是否可以从 devise 中仅提取和使用这个组件?
【问题讨论】:
标签: ruby-on-rails ruby authentication devise
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
【讨论】: