這次“泄密門事件”對用戶影響最大的恐怕是明文保存密碼的CSDN和天涯社區(qū),如果當(dāng)初他們使用散列算法將密碼進(jìn)行處理,就不會有這么大的影響,而對于散列算法,就不得不說一下MD5這個算法。
散列算法(Hash Function)中,最為常用的是MD5(Message-Digest Algorithm 5)算法,MD5是一個較為古老的算法,一度被廣泛應(yīng)用于安全領(lǐng)域。比如在UNIX系統(tǒng)中用戶的密碼就是以MD5(或其它類似的算法)經(jīng)加密后存儲在文件系統(tǒng)中。當(dāng)用戶登錄的時候,系統(tǒng)把用戶輸入的密碼計算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。
通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。
不過,由于MD5的弱點被不斷發(fā)現(xiàn)以及計算機(jī)能力不斷的提升,通過碰撞的方法有可能構(gòu)造兩個具有相同MD5的信息,使MD5算法在目前的安全環(huán)境下有一點落伍。從實踐角度,不同信息具有相同MD5的可能性還是非常低的,通常認(rèn)為是不可能的,通過碰撞的方法也很難碰撞出復(fù)雜信息的MD5數(shù)值。
因此,MD5算法還是被廣泛的用作檢驗文件是否變化的散列函數(shù),很多類似迅雷、旋風(fēng)這樣的下載工具,都可以通過MD5來驗證,用戶下載下來的文件是否被修改。
在用戶密碼的處理方面,MD5總的來看還算是安全的,至少比明文保存密碼要好的多,目前破解MD5主要依靠大型字典的方法,將常用密碼進(jìn)行MD5后建立數(shù)據(jù)庫,然后和MD5數(shù)值進(jìn)行對比,通過這樣的方法來“破解”MD5,因此,通常直接將密碼進(jìn)行MD5處理的話,一些弱密碼很容易可以通過這種手段“破解”出來。
不過,如果在散列的過程中,加入足夠長的salt(即干擾字符串),并且salt加入一些動態(tài)信息,例如username、隨機(jī)碼等,這樣生成的MD5還是很難被破解的,因為僅僅從數(shù)據(jù)庫無法看到MD5具體的處理過程,必須同時看到處理時的源代碼才可以,這就給破解MD5帶來相當(dāng)大的難度。
還有一個方法,既然簡單密碼的MD5是不安全的,網(wǎng)站的開發(fā)者只需要一個簡單的技巧就能提高密碼的安全度:在用戶注冊的時候,錄入新密碼后進(jìn)行判斷,強(qiáng)制密碼必須8位以上,并包含字母和數(shù)字,否則不讓注冊,這樣用戶注冊后使用的密碼就都是不容易被破解的密碼了。
如果需要更安全的算法,建議不用MD5,而使用SHA-256, SHA(Secure Hash Algorithm,安全散列算法)是美國國家安全局(NSA)設(shè)計,美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布的一系列密碼散列函數(shù)。目前還沒有出現(xiàn)針對SHA-256算法的有效碰撞攻擊方法,該算法也是開源算法,在很多地方可以找到,是MD5的一個不錯的后繼者。