什么密码散列算法确实使用?
答
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)。这两个都是静态的,您可以将它们硬编码到您的非Devise应用程序中(但请确保保持pepper
的秘密!)。
所以,你的哈希方法可能会被写成一样:
def self.digest(password)
password = "#{password}#{ENV['PASSWORD_PEPPER']}"
::BCrypt::Password.create(password, cost: 10).to_s
end
的辣椒是所有用户一样吗? – fields
不应该从一个范围中随机分配吗?然后在验证密码时测试每个可能的值?它也可以使用盐吗? – fields
胡椒对于所有用户都是一样的,但不存储在数据库中(即,不与散列一起存储)。盐是随机产生的(由Bcrpyt,因此为什么没有提到它),但与散列一起存储。两者的结合提供了一些额外的安全性,因为攻击者需要数据库和代码库才能进行强力攻击。 –