|
在上數(shù)字簽名這道密碼學的主菜前,今天先品嘗一下數(shù)字摘要這道重要的前菜,因為數(shù)字摘要是數(shù)字簽名的組成部分。數(shù)字摘要,英文叫Hash,所以它也被叫做哈希、熵等名字。它是一種算法,可以將任意長度的原數(shù)據(jù)運算變換成一個固定長度的結果數(shù)據(jù),這個結果數(shù)據(jù)有兩個特點:一是相對于原數(shù)據(jù),其長度比較短,比如有16字節(jié)、20字節(jié)、32字節(jié)等等;二是它可以體現(xiàn)原數(shù)據(jù)的特征,也就是說原數(shù)據(jù)如果發(fā)生變化,計算出來的結果數(shù)據(jù)也會變化(注意,這里其實有一個大坑,后面會談到)。 前面講過,非對稱加密的一個特點就是慢。所以在使用非對稱加密算法的時候,一般不對原數(shù)據(jù)進行直接加密。后面講到的數(shù)字簽名,實質上也是非對稱加密運算,就采取了原文的摘要,而不是原文進行加密。這樣無論原數(shù)據(jù)有多大,被加密的數(shù)據(jù)只有幾十個字節(jié),保證了整體運算速度。雖然說數(shù)字摘要總是和數(shù)字簽名在一起,但我想很多程序員都接觸過數(shù)字摘要,拿它來做單向加密。所謂單向加密,就是指加密結果沒辦法再解密回明文(對稱加密、非對稱加密都屬于雙向加密)。單向加密主要是用做驗證,最常見的一個應用場景就是用戶口令的單向加密。數(shù)據(jù)庫中存儲了用戶口令的摘要值,用戶登錄系統(tǒng)時,系統(tǒng)計算其口令明文的摘要值,然后送到后臺對比。這樣系統(tǒng)中傳輸、對比、儲存的都是用戶口令的摘要值,而不是口令明文,加強了口令的安全性。數(shù)字摘要的另一個常用領域就是檢查程序的完整性,一個程序運行前,可以計算一下它的摘要值,再與其自帶摘要值對比,以確定程序有沒有被篡改過。 常用的數(shù)字摘要算法(后面是其摘要值長度)有MD5(16字節(jié))、SHA1(20字節(jié))、SHA256(32字節(jié)),國產(chǎn)算法的有SM3(32字節(jié))。 最后照例談一下安全問題。2004年有一個報道說山東大學的王小云教授破解了MD5算法,對于一向不為公眾所知的密碼領域,這條新聞算是很有轟動效應了。當時很多非專業(yè)領域的媒體也紛紛跟進,“MD5已經(jīng)坍塌”、“密碼學的基礎已經(jīng)動搖”這些新聞標題很是帶了一波流量。因為使用MD5做單向加密的系統(tǒng)不在少數(shù),所以當時也有很多公司、程序員開始忐忑了。 其實,這些都是非專業(yè)的觀點。前面講過了,數(shù)字摘要指是有固定長度的,也就是說,每一種摘要算法計算出的摘要值的個數(shù)是有限的,比如SHA256算法,它的摘要值個數(shù)是2的256次方,這個數(shù)量大到已經(jīng)不是天文數(shù)字了,而是在人類已知的宇宙里已經(jīng)沒有可以拿來說明這個數(shù)到底有多大的實例了。但是,它畢竟還是個數(shù)字,SHA256摘要的個數(shù)還是有限的,而原數(shù)據(jù)的數(shù)量是無限的。無限的原數(shù)據(jù)對應有限的摘要值,想象一下小時候學的抽屜原則:三個蘋果放進兩個抽屜,至少有兩個蘋果在同一個抽屜里。所以,必然有多個原數(shù)據(jù)(而且還是無限多個),被放進了同一個抽屜,就是擁有相同的摘要值。這種不同原數(shù)據(jù),擁有相同數(shù)據(jù)摘要現(xiàn)象,叫做碰撞。說到這,肯定有同學會問這不顛覆了最開始說的原數(shù)據(jù)如果發(fā)生變化,數(shù)字摘要指也會變化的特征嗎?是這樣的,這也就是前面說的那個大坑。不管哪種算法,數(shù)字摘要必然存在碰撞。其實Hash這個單詞來源于拉丁文,本意就有碰撞的意思,那些發(fā)明它的數(shù)學家一開始就知道數(shù)字摘要的吊詭之處。 另外,一些宣稱可以破解摘要算法的網(wǎng)站(比如http://www./index_cn.htm),其實是保存了一個原文與對應摘要值的數(shù)據(jù)庫,所謂破解是查詢摘要值對應的明文。你輸入的摘要值要是不在庫里,它就無能為力了。 |
|
|
來自: 吳雨虹2kzpi83a > 《密碼學》