前面一篇文章講述了為什么應(yīng)該放棄或減少使用MD5,意料之外的是,線上線下都有不少讀者表示希望知道更多信息。也有一些專家級讀者指出了文章中的一些不足和不夠詳細(xì)的地方。希望能在這篇文章中一并補(bǔ)充,如有錯誤,也煩請指正。
首先,原文是說MD5算法在很多場合都不再安全,應(yīng)該幸免使用,并不是全面否定其他安全哈希算法。SHA-2系列算法在最近幾年應(yīng)該還是足夠安全和可靠的。另外,按照計劃,SHA-3系列的哈希算法也馬上在近期公開公布。
因此,對讀者而言,這篇文章最有意義的提示是:“在使用安全哈希算法時,考慮使用SHA-2系列算法乃至更高級別算法,而不是MD5“。
MD5最大的問題在于,通過我國的王曉云教授等學(xué)者的工作,md5已經(jīng)被證明可以進(jìn)行碰撞攻擊。也就是說,攻擊者可以產(chǎn)生兩個應(yīng)用程序,內(nèi)容不一樣,但是哈希值完全一樣。
在云存儲的應(yīng)用場合中,這種危害表現(xiàn)為攻擊者可以偽造一個Windows 的安裝光盤,在其中嵌入木馬,通過上述手段讓MD5哈希值和微軟官方公布的光盤一致,搶先上傳到分享類網(wǎng)盤中。如果該網(wǎng)盤采納MD5檢查重復(fù)文件(例如離線下載服務(wù)), 木馬就會被植入到希望下載原版光盤用戶的電腦中。
這種攻擊形式不是天方夜談,根據(jù)微軟官方的報告,一款名為Flame的木馬就用了類似的手段。當(dāng)然,這種方式目前還是非常高級的攻擊手段。
另外,實(shí)際應(yīng)用中我們也常需要驗證對方發(fā)送的數(shù)據(jù)沒有經(jīng)過任何攻擊者篡改。 例如,微博的API(應(yīng)用接口)服務(wù)就需要驗證請求來自于一個合法的授權(quán)方,而不是一個借用第三方名義的攻擊者。
使用私鑰加密,公鑰解密驗證的方式是完全可行的,但是因為非對稱加密算法執(zhí)行效率低下。因此,很多時候會用類似MD5的哈希算法驗證哈希值和內(nèi)容一致來保證數(shù)據(jù)未被篡改。
從前一篇文章的描述可以看出,MD5在這種場景是不安全的,不過需要額外注意的是,即使SHA-2系列的算法用于這個場景也是不安全的,這個時候應(yīng)該考慮使用HMAC系列的對稱驗證算法。這個問題的根源是,從理論上上來說,如果知道hash(secret key +X),即使不知道secret key的內(nèi)容, 仍然可能通過對X的分析,計算得到hash(secret key +Y),從而將X成功的替換成Y,導(dǎo)致接收誤以為Y就是X。而HMAC盡管基于安全哈希算法,卻能幸免這個類型的攻擊。
從開放API的實(shí)例來看,F(xiàn)lickr的API在早期犯過這個錯誤。
當(dāng)然,如果用于驗證通信中的數(shù)據(jù)是否因為信道干擾損壞(而非攻擊者人為干擾),或者將數(shù)據(jù)進(jìn)行足夠均勻的分布,MD5還是完全稱職的,甚至是優(yōu)秀的。關(guān)于這方面的內(nèi)容,如果讀者有興趣,歡迎通過微博或者評論反饋,我們也可以再行補(bǔ)充。