2017-08-31 40 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,因此爲什麼沒有提到它),但與散列一起存儲。兩者的結合提供了一些額外的安全性,因爲攻擊者需要數據庫和代碼庫才能進行強力攻擊。 –