(1) 給出散列函數的具體應用。(2) 結合生日攻擊、以及200四、2005年王曉雲教授有關MD5安全性和2017年google公司SHA-1的安全性,說明散列函數的安全性以及目前安全散列函數的發展。問題2的回答能夠參考下面給出的第一個連接。(3)結合md5算法中的選擇前綴碰撞以及第二個連接中的helloworld.exe和goodbyworld.exe兩個可執行文件的md5消息摘要值和兩個文件的執行結果說明md5算法在驗證軟件完整性時可能出現的問題。java
在此以前,須要先去簡單瞭解一下散列函數算法
Hash,通常翻譯作「散列」,也有直接音譯爲"哈希"的,就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。數據庫
數學表述爲:h = H(M) ,其中H( )--單向散列函數,M--任意長度明文,h--固定長度散列值。編程
在信息安全領域中應用的Hash算法,還須要知足其餘關鍵特性:小程序
第一固然是單向性(one-way),從預映射,可以簡單迅速的獲得散列值,而在計算上不可能構造一個預映射,使其散列結果等於某個特定的散列值,即構造相應的M=H-1(h)不可行。這樣,散列值就能在統計上惟一的表徵輸入值,所以,密碼學上的 Hash 又被稱爲"消息摘要(message digest)",就是要求能方便的將"消息"進行"摘要",但在"摘要"中沒法獲得比"摘要"自己更多的關於"消息"的信息。瀏覽器
第二是抗衝突性(collision-resistant),即在統計上沒法產生2個散列值相同的預映射。給定M,計算上沒法找到M',知足H(M)=H(M') ,此謂弱抗衝突性;計算上也難以尋找一對任意的M和M',使知足H(M)=H(M') ,此謂強抗衝突性。要求"強抗衝突性"主要是爲了防範所謂"生日攻擊(birthday attack)",在一個10人的團體中,你能找到和你生日相同的人的機率是2.4%,而在同一團體中,有2人生日相同的機率是11.7%。相似的,當預映射的空間很大的狀況下,算法必須有足夠的強度來保證不能輕易找到"相同生日"的人。安全
第三是映射分佈均勻性和差分分佈均勻性,散列結果中,爲 0 的 bit 和爲 1 的 bit ,其總數應該大體相等;輸入中一個 bit 的變化,散列結果中將有一半以上的 bit 改變,這又叫作"雪崩效應(avalanche effect)";要實現使散列結果中出現 1bit 的變化,則輸入中至少有一半以上的 bit 必須發生變化。其實質是必須使輸入中每個 bit 的信息,儘可能均勻的反映到輸出的每個 bit 上去;輸出中的每個 bit,都是輸入中儘量多 bit 的信息一塊兒做用的結果。編程語言
下面是其具體的應用函數
Hash算法在信息安全方面的應用主要體如今如下的3個方面:性能
1) 文件校驗
咱們比較熟悉的校驗算法有奇偶校驗和CRC校驗,這2種校驗並無抗數據篡改的能力,它們必定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。
MD5 Hash算法的"數字指紋"特性,使它成爲目前應用最普遍的一種文件完整性校驗和(Checksum)算法,很多Unix系統有提供計算md5 checksum的命令。它常被用在下面的2種狀況下:
第一是文件傳送後的校驗,將獲得的目標文件計算 md5 checksum,與源文件的md5 checksum 比對,由二者 md5 checksum 的一致性,能夠從統計上保證2個文件的每個碼元也是徹底相同的。這能夠檢驗文件傳輸過程當中是否出現錯誤,更重要的是能夠保證文件在傳輸過程當中未被惡意篡改。一個很典型的應用是ftp服務,用戶能夠用來保證屢次斷點續傳,特別是從鏡像站點下載的文件的正確性。
更出色的解決方法是所謂的代碼簽名,文件的提供者在提供文件的同時,提供對文件Hash值用本身的代碼簽名密鑰進行數字簽名的值,及本身的代碼簽名證書。文件的接受者不只能驗證文件的完整性,還能夠依據本身對證書籤發者和證書擁有者的信任程度,決定是否接受該文件。瀏覽器在下載運行插件和java小程序時,使用的就是這樣的模式。
第二是用做保存二進制文件系統的數字指紋,以便檢測文件系統是否未經容許的被修改。很多系統管理/系統安全軟件都提供這一文件系統完整性評估的功能,在系統初始安裝完畢後,創建對文件系統的基礎校驗和數據庫,由於散列校驗和的長度很小,它們能夠方便的被存放在容量很小的存儲介質上。此後,能夠按期或根據須要,再次計算文件系統的校驗和,一旦發現與原來保存的值有不匹配,說明該文件已經被非法修改,或者是被病毒感染,或者被木馬程序替代。TripWire就提供了一個此類應用的典型例子。
更完美的方法是使用"MAC"。"MAC" 是一個與Hash密切相關的名詞,即信息鑑權碼(Message Authority Code)。它是與密鑰相關的Hash值,必須擁有該密鑰才能檢驗該Hash值。文件系統的數字指紋也許會被保存在不可信任的介質上,只對擁有該密鑰者提供可鑑別性。而且在文件的數字指紋有可能須要被修改的狀況下,只有密鑰的擁有者能夠計算出新的散列值,而企圖破壞文件完整性者卻不能得逞。
2) 數字簽名
Hash 算法也是現代密碼體系中的一個重要組成部分。因爲非對稱算法的運算速度較慢,因此在數字簽名協議中,單向散列函數扮演了一個重要的角色。
在這種簽名協議中,雙方必須事先協商好雙方都支持的Hash函數和簽名算法。
簽名方先對該數據文件進行計算其散列值,而後再對很短的散列值結果--如Md5是16個字節,SHA1是20字節,用非對稱算法進行數字簽名操做。對方在驗證簽名時,也是先對該數據文件進行計算其散列值,而後再用非對稱算法驗證數字簽名。
對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上能夠認爲與對文件自己進行數字簽名是等效的。並且這樣的協議還有其餘的優勢:
首先,數據文件自己能夠同它的散列值分開保存,簽名驗證也能夠脫離數據文件自己的存在而進行。
再者,有些狀況下簽名密鑰可能與解密密鑰是同一個,也就是說,若是對一個數據文件簽名,與對其進行非對稱的解密操做是相同的操做,這是至關危險的,惡意的破壞者可能將一個試圖騙你將其解密的文件,充當一個要求你簽名的文件發送給你。所以,在對任何數據文件進行數字簽名時,只有對其Hash值進行簽名纔是安全的。
3) 鑑權協議
以下的鑑權協議又被稱做"挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的狀況下,這是一種簡單而安全的方法。
須要鑑權的一方,向將被鑑權的一方發送隨機串(「挑戰」),被鑑權方將該隨機串和本身的鑑權口令字一塊兒進行 Hash 運算後,返還鑑權方,鑑權方將收到的Hash值與在己端用該隨機串和對方的鑑權口令字進行 Hash 運算的結果相比較(「認證」),如相同,則可在統計上認爲對方擁有該口令字,即經過鑑權。
I)生日攻擊:
經過以前機率論課程的「生日悖論」模型來分析散列碰撞的安全性。
生日攻擊的基本原理爲假定散列函數H有種可能輸出(即輸出爲位),H做用於k個隨機輸入,則時至少有一個重複出現,發生碰撞現象。
2) MD5安全性:
3) SHA-1的安全性:
安全哈希算法SHA-1是在1993年提出並在1995年完成修訂,現在已經在許多加密安全協議中普遍使用,包括TLS和SSL、PGP 、SSH、S/MIME和IPsec等,被視爲是MD5(散列函數)的後繼者。然而從2005年開始,SHA-1的安全性就開始被密碼學家質疑,他們認爲隨着計算機性能的提高,破解SHA-1算法將不成問題。2017年2月23日Google實現了對SHA-1算法的第一次攻擊,現SHA-1算法被破解已經成爲現實。
兩個不一樣的程序,MD5多是相同的
沒法保證文件的來源可靠性,不能確認接收方接收到的文件與發送方的發出文件相同。
若是安全軟件在系統升級後沒有考慮到雙簽名驗證的狀況,頗有可能按照相似「正常」的邏輯斷定這個惡意樣本僞造的簽名有效
不能保證文件的完整性和正確性,文件可能被損壞。