寫給開發者:MD5算法的安全性

散列算法(Hash Function)中,最為常用的是MD5(Message-Digest Algorithm 5)算法,MD5是一個較為古老的算法,一度被廣泛應用於安全領域。比如在UNIX系統中用戶的密碼就是以MD5(或其它類似的算法)經加密後存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成MD5值,然後再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。

通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。

不過,由於MD5的弱點被不斷髮現以及計算機能力不斷的提升,通過碰撞的方法有可能構造兩個具有相同MD5的信息,使MD5算法在目前的安全環境下有一點落伍。從實踐角度,不同信息具有相同MD5的可能性還是非常低的,通常認為是不可能的,通過碰撞的方法也很難碰撞出複雜信息的MD5數值。

因此,MD5算法還是被廣泛的用作檢驗文件是否變化的散列函數,很多類似迅雷、旋風這樣的下載工具,都可以通過MD5來驗證,用戶下載下來的文件是否被修改。

在用戶密碼的處理方面,MD5總的來看還算是安全的,至少比明文保存密碼要好的多,目前破解MD5主要依靠大型字典的方法,將常用密碼進行MD5後建立數據庫,然後和MD5數值進行對比,通過這樣的方法來“破解”MD5,因此,通常直接將密碼進行MD5處理的話,一些弱密碼很容易可以通過這種手段“破解”出來。

不過,如果在散列的過程中,加入足夠長的salt(即干擾字符串),並且salt加入一些動態信息,例如username、隨機碼等,這樣生成的MD5還是很難被破解的,因為僅僅從數據庫無法看到MD5具體的處理過程,必須同時看到處理時的源代碼才可以,這就給破解MD5帶來相當大的難度。

還有一個方法,既然簡單密碼的MD5是不安全的,網站的開發者只需要一個簡單的技巧就能提高密碼的安全度:在用戶註冊的時候,錄入新密碼後進行判斷,強制密碼必須8位以上,幷包含字母和數字,否則不讓註冊,這樣用戶註冊後使用的密碼就都是不容易被破解的密碼了。

如果需要更安全的算法,建議不用MD5,而使用SHA-256, SHA(Secure Hash Algorithm,安全散列算法)是美國國家安全局(NSA)設計,美國國家標準與技術研究院(NIST)發佈的一系列密碼散列函數。目前還沒有出現針對SHA-256算法的有效碰撞攻擊方法,該算法也是開源算法,在很多地方可以找到,是MD5的一個不錯的後繼者。


分享到:


相關文章: