一、散列函數的具體應用
1.文件檢驗
校驗算法有奇偶檢驗和CRC校驗,都沒有抗數據篡改的能力,它們一定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。MD5 有"數字指紋"的特性,所以他成為一種文件完整性校驗和(Checksum)算法,部分unix提供了計算checksum的命令。
2.數字簽名
在數字簽名中,單向散列函數很重要。Hash作為現代密碼體系中的重要組成部分,可以用於數字簽名。HASH函數,又稱雜湊函數,它有一種類似於指紋的應用。在網絡安全協議中,雜湊函數用來處理電子簽名,將很長的簽名文件縮短為少量的數字信息。Hash值,又可以叫做"數字摘要",在統計上可以認為與對文件本身進行數字簽名是等效的,而且這樣的協議還有其他的優點。
3.鑒權協議
在傳輸信道是可被偵聽,但不可被篡改的情況下,挑戰--認證模式是一種簡單而安全的方法。
4.快速訪問
散列表的尋址時間復雜度為0(1),在數據存儲中運用較多,這里不作詳述。
5.安全訪問認證
MD5廣泛用於操作系統的登陸認證上,如在Unix系統中用戶的密碼是以MD5 (或其它類似的算法)經Hash運算后存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼進行MD5 Hash 運算,然后再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這可以避免用戶的密碼被具有系統管理員權限的用戶知道。
消息認證如下圖:


6.偽隨機數生成
通過散列化處理對所傳輸數據的完整性進行安全校驗,如下圖:

二、結合生日攻擊、以及2004、2005年王曉雲教授有關MD5安全性和2017年google公司SHA-1的安全性,說明散列函數的安全性以及目前安全散列函數的發展。
1.散列函數的安全性有涉及三個方面。
安全性的解析如下圖:

第一方面,生日攻擊。
生日攻擊利用“兩個集合相交”問題的原理生成散列函數碰撞,達到目的的攻擊稱為生日攻擊,也稱為平方根攻擊。生日攻擊方法沒有利用Hash函數的結構和任何代數弱性,它只依賴於消息摘要的長度,即散列值的長度。中間相遇攻擊是生日攻擊的一種變形,它不看Hash值,而是比較鏈中的中間變量。中間相遇攻擊的基本原理為:將消息分成兩部分,對偽造消息的第一部分從初試值開始,逐步向中間階段產生r1個變量;對偽造消息的第二部分從Hash結果開始逐步退回中間階段產生r2個變量。在中間階段有一個匹配的概率與生日攻擊成功的概率一樣。
第二方面,MD5的破解。
王小雲教授發表了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報告。我們知道,MD5是一個有廣泛的應用的雜湊函數,它一度被認為是安全的。然而,王小雲教授發現,可以找到MD5的“碰撞”,也就是兩個文件有相同的“指紋”。換句話說,當使用電子簽名簽合同后,還可能找到另外一份具有相同簽名但內容不同的合同,這樣兩份合同的真偽不能分辨。所以,王小雲教授的結論證實:用MD5的碰撞會非常嚴重威脅信息安全,這對電子簽名的技術體系是一種挑戰。
第三方面,SHA-1的破解。
Google宣布攻破SHA-1,從此SHA-1不安全。尋找SHA-1碰撞,2013年,Marc Stevens發表一篇論文,專門介紹了創建SHA-1碰撞的理論性方法。下面這些數字是計算任務的規模水平:總計900萬兆(即百萬的五次冪,具體為9,223,372,036,854,775,808)次SHA1計算。要完成攻擊的首個階段需要單一CPU計算6500年。要完成攻擊的第二階段需要單一GPU計算110年。雖然這些數字巨大,但SHA-1破壞性攻擊的速度,比暴力破解攻擊多10萬倍,意味着前者確實有可行性。
2.安全散列函數的發展。
目前使用最多的哈希函數有MD(Message-Digest Algorithm)系列(MD4、MD5、HAVAL、RIPEMD)和SHA系列(SHA-1、SHA-256)。
MD4
1990年Ronald L. Rivest設計,通過3圈的操作將任意長度的消息變換成128位的哈希值。
MD5
MD5(RFC 1321)是 Rivest 於1991年對MD4的改進版本。它對輸入仍以512位分組,經過一系列處理之后,其輸出是4個32位字的級聯,與 MD4 相同。MD5算法被王小雲證明是可攻破的,因此也已經不安全了。MD5與MD4的區別:MD5用了4輪變換,比MD4多一輪;MD4中第一輪沒有常量加,MD5中64步每一步用了一個不同的常量K[i];MD5每輪加上前一步的結果,MD4沒有。
大部分安全散列函數都是迭代結構的。圖中Mi為被分成L塊的原始信息,f為雜湊函數,IV為初始向量。

四輪中的F函數各不相同,分別為:
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
HAVAL
HAVAL是MD5的改進版本,其輪數可以是3、4或5(每輪16步),輸出長度分別為128、160、192或224位。HAVAL用高非線性的7-變量函數取代了MD5的簡單非線性函數。
SHA1
SHA由美國國家標准技術研究所NIST開發,與1993年發表,SHA-1是基於MD4設計的。輸入最大長度為2^64位的數據,輸出160位的消息摘要,同樣以512位數據塊進行處理。具體這里不詳述。
SHA-256
輸出由SHA-1的160位擴大到256位,迭代次數由SHA-1的80次增加到128次
SHA-384
輸出擴大到384位,迭代次數增加到192次
SHA-512
輸出擴大到512位,迭代次數增加到256次
|
|
輸入位數 |
輸出位數 |
迭代次數 |
分組長度 |
找到碰撞 |
|
| MD4 |
無限 |
128bit |
48 |
512bit |
是 |
|
| MD5 |
無限 |
128bit |
64 |
512bit |
是 |
|
| SHA-1 |
264-1 |
160bit |
80 |
512bit |
理論260 |
|
| SHA-2 |
SHA-256 |
264-1 |
256bit |
64 |
512bit |
否 |
| SHA-384 |
2128-1 |
384bit |
80 |
1024bit |
否 |
|
| SHA-512 |
2128-1 |
512bit |
80 |
1024bit |
否 |
|
| SHA-3 |
|
224/256/384/512 |
24 |
|
否 |
|
三、結合md5算法中的選擇前綴碰撞以及helloworld.exe和goodbyworld.exe兩個可執行文件的md5消息摘要值和兩個文件的執行結果說明md5算法在驗證軟件完整性時可能出現的問題
第一方面,md5算法中的選擇前綴碰撞。
選擇前綴碰撞是指選取一對任意的MD5消息前綴后,再構造一對后綴使得兩部分級聯后的消息對發生碰撞。
第二方面,兩個可執行文件的md5消息摘要值。
兩個文件如下圖:

HelloWorld.exe和GoodbyeWorld.exe是兩個不同的可執行文件,下載效驗工具MD5校驗工具,下圖下載成功:

點擊“瀏覽”,選擇HelloWorld-colliding.exe文件,然后如下圖,MD5: 18FCC4334F44FED60718E7DACD82DDDF

點擊“瀏覽”,選擇GoodbyeWorld-colliding.exe文件,然后如下圖,MD5: 18FCC4334F44FED60718E7DACD82DDDF

發現新的兩個文件的MD5是相同的,但在窗口上兩者輸出的字符不同,這就找到了MD5的一對碰撞。附加選擇前綴碰撞的好處在於,任何程序可以毫無影響地與其它任何程序碰撞。所以,MD5 算法不應再被用於任何軟件完整性檢查或代碼簽名的用途。
第三方面,兩個不同的文件的執行結果。
HelloWorld.exe文件的執行結果,命令串窗口執行,出現“Hello World:- )”的結果:

GoodbyeWorld.exe文件直接鼠標雙擊的執行結果,死循環“Goodbye World :-(”語句: 
總之,MD5值文件可以偽造,那么文件完整性得不到保障,而且文件簽名也不能實現。
參考鏈接:
鏈接1:https://www.win.tue.nl/hashclash/
鏈接2:http://www.win.tue.nl/hashclash/SoftIntCodeSign/

