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