2017-08-31 78 views
0

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

回答

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)。这两个都是静态的,您可以将它们硬编码到您的非Devise应用程序中(但请确保保持pepper的秘密!)。

所以,你的哈希方法可能会被写成一样:

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

的辣椒是所有用户一样吗? – fields

+0

不应该从一个范围中随机分配吗?然后在验证密码时测试每个可能的值?它也可以使用盐吗? – fields

+0

胡椒对于所有用户都是一样的,但不存储在数据库中(即,不与散列一起存储)。盐是随机产生的(由Bcrpyt,因此为什么没有提到它),但与散列一起存储。两者的结合提供了一些额外的安全性,因为攻击者需要数据库和代码库才能进行强力攻击。 –