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