使用 MD5 雜湊作為密碼
假設 Alice 使用的密碼提示最多只能接受 32 個字元的任何特定密碼。
記住長串隨機字元並不是 Alice 的強項之一,因此她選擇了一個令人難忘的密碼片語,該密碼片語由2000 個最常見的英語單詞中的 7個排列組成。不幸的是,這個密碼超過了提示允許的最大密碼長度(即密碼很容易超過 32 個字元)。
這是普通使用者面臨的一個常見問題,他們經常需要輸入密碼到具有最大密碼長度限制的站點或伺服器。我想知道的是這個解決方案是否相對安全:
- 愛麗絲散列她的密碼:
passphrase --> MD5(passphrase) --> new_passhash
- MD5 摘要的長度為 128 位或32 個十六進制數字。
- Alice 將
new_passhash
長度為32 個字元的密碼用作她的新密碼。從表面上看,她的密碼似乎被強化了。假設攻擊者正在執行暴力攻擊:
Permutations for passphrase = 2000^7 (set of 2000 words, 7 choices) Permutations for MD5 string = 16^32 (set of 16 alphanum characters, 32 choosen) (2000^7) is strictly less than (16^32)
但是,如果攻擊者確實知道密碼是使用MD5散列的,那麼 MD5 容易受到衝突攻擊這一事實是否會導致其安全性
new_passhash
低於原始密碼?
密碼強度通常用熵位來衡量,或者用外行的話來說,就是系統中“真正的隨機性”的數量。這是通過密碼生成的過程而不是輸出中的位數來衡量的。這是Kerckhoffs 原則的簡單擴展:假設您的攻擊者知道您的程序,並且他/她唯一不知道的資訊是密鑰。
你是正確的,密碼的排列數量是 $ 2000^7 $ . 這大約等於 $ 2^{77} $ ,所以用這種方法生成的密碼大約有 77 位的熵,這是一個非常好的密碼強度。但是,通過像 MD5 這樣的摘要函式傳遞輸出實際上並不會增加可能排列的數量。MD5有 $ 2^{128} $ 可能的輸出,但我們只是實際使用 $ 2^{77} $ 其中。換句話說,假設攻擊者知道我們的程序,他們不必猜測所有可能的 MD5 輸出;他們只需要嘗試與 2,000 個最常見的英語單詞中的 7 個雜湊相對應的單詞。這相對容易做到。
然而,在實踐中,77 位的熵對於密碼來說仍然是相當不錯的。MD5 本身不會增加任何強度,但也不一定會消除任何強度。作為一種“編碼”(假設您使用 32 個字元的十六進製表示)將七個隨機單詞填充到限制為 32 個字元(並且通常只包含字母數字值)的欄位中,在我看來這很實用。
一個輕微的改進是對二進制 MD5 輸出使用Base32 編碼而不是十六進制。這會將輸出的長度減少到 26 個字元(也允許使用大寫字母),並且可以允許您將此方案用於限制為少於32 個字元的密碼欄位。
編輯:其他人對 MD5 的弱點表示擔憂。雖然我也普遍厭惡 MD5,但我相信這種使用是完全可以接受的。它在這裡不是因為它的原像抗性而被使用,因為攻擊者不需要確定最初使用的七個單詞;擁有雜湊本身就足夠了。鑑於所選單詞和 MD5 雜湊本身都被認為是秘密的,我認為沒有理由擔心。