2009-06-18 69 views
5

如果密碼存儲爲散列值,用戶是否可以請求將其密碼通過電子郵件發送給自己?將密碼存儲爲散列值時檢索密碼

有沒有什麼辦法的哈希值轉換爲明文值用正確的信息(&你需要什麼樣的信息)?

如果用戶存儲在兩個網站使用同一個密碼的哈希值,將其密碼是爲這兩個網站一樣嗎?

回答

28

如果你只存儲了密碼的散列,那麼沒有。 ...無論如何,你只應該存儲密碼的正確醃製散列。

密碼重置機制是正確的選擇。

+6

+1用於提醒使用SALT ... – 2009-06-18 16:11:10

+1

請參閱我的回答以下正確使用鹽...儲存鹽不利於使用它的目的.. – jrista 2009-06-18 16:40:39

+11

salt的目的是破壞查找表,因此不可能簡單地散列大量可能的密碼並查找它們的散列值。這並不依賴於保持鹽的祕密。而且,如果你不存儲它,那你怎麼檢查密碼? – 2009-06-18 17:43:45

7

總之,沒有。使用大多數散列算法,您可以擁有多個具有相同輸出的輸入。提供密碼重置選項通常會更好。

10

散列密碼不能在一般的檢索(這依賴於哈希函數的,安全散列無法檢索)。如果他們在兩個站點上具有相同的散列,他們可以具有相同的密碼,這取決於站點使用的散列鹽,什麼方法等。

如果您的密碼安全地存儲在一個好的散列系統中,應該永遠無法通過電子郵件向您發送密碼,如果您忘記密碼,則必須重置密碼。

3

有不同類型的散列算法。有些人比其他人更安全。 MD5是一個流行的,但不安全的。 SHA系列是另一組更安全的算法。

根據定義,散列是一種單向函數。它不可逆轉。

http://en.wikipedia.org/wiki/Sha-1

+0

Plain SHA-1/2是一個壞主意。你需要一個鹽,並減緩哈希。 PBKDF2,bcrypt,scrypt是標準選擇。 – CodesInChaos 2012-05-11 21:24:02

3

如果有一個簡單的方法來恢復明文密碼,就在哈希開始與密碼是沒有意義的。那時你可能只需要base64或者ROT13。 (不這樣做!)

正如其他人所提到的,使用其他的密碼恢復方法。確實無法獲得明文密碼。

如果在兩個站點哈希是一樣的,用戶最有可能具有在兩個相同的密碼。但不是100%保證,可能會有散列衝突,但這是非常不可能的。

-1

背後存儲密碼的哈希的總體思路是,以確保密碼是安全的......甚至那些誰擁有對數據庫的訪問。信任從不隱含。哈希是一種單向算法,因此無法從哈希碼獲取原始密碼。通常,當用戶需要恢復作爲散列存儲的密碼時,您應該向他們提出他們的祕密問題,並通過電子郵件將他們的臨時密碼發送給他們,或者通過電子郵件發送臨時鏈接,以便他們更改密碼。這確保了密碼永遠不會被存儲爲明文,並且可以避免所有窺探的眼睛,甚至那些可能被認爲值得信賴的人。

2

沒有辦法扭轉常用的哈希值。他們可以被強制使用(嘗試每一個可能的密碼),或者你可以使用一個詞彙表(使用一個常用密碼列表)來組合蠻力來加速它,但它仍然是一個非常緩慢和CPU密集型的過程。

許多網站使用的最佳方式是創建一個「密碼重置」按鈕,您可以在其中輸入用戶名和電子郵件地址,如果它們匹配,它會向您發送一個隨機密碼,併爲您提供指向登錄頁面的鏈接您可以使用隨機密碼登錄並更改密碼。

0

要做到這一點,你必須有一個領域的模型:

Hashed_password 
Salt 

你需要知道的方法,用戶哈希密碼(這裏我使用SHA1) 然後你就可以在你的控制器定義:

def self.encrypted_password(password, salt) 
    string_to_hash = password + "wibble" + salt 
    Digest::SHA1.hexdigest(string_to_hash) 
end 

下一頁你可以比較:

user.Hashed_password == encrypted_password(password, user.salt) 

True表示THA t「密碼」是用戶「用戶」的密碼