1) 文件校驗
咱們比較熟悉的校驗算法有奇偶校驗和CRC校驗,這2種校驗並無抗數據篡改的能力,它們必定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。 java
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 值,又稱"數字摘要"進行數字簽名,在統計上能夠認爲與對文件自己進行數字簽名是等效的。並且這樣的協議還有其餘的優勢: google
首先,數據文件自己能夠同它的散列值分開保存,簽名驗證也能夠脫離數據文件自己的存在而進行。
再者,有些狀況下簽名密鑰可能與解密密鑰是同一個,也就是說,若是對一個數據文件簽名,與對其進行非對稱的解密操做是相同的操做,這是至關危險的,惡意的破壞者可能將一個試圖騙你將其解密的文件,充當一個要求你簽名的文件發送給你。所以,在對任何數據文件進行數字簽名時,只有對其Hash值進行簽名纔是安全的。
3) 鑑權協議
以下的鑑權協議又被稱做"挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的狀況下,這是一種簡單而安全的方法。
須要鑑權的一方,向將被鑑權的一方發送隨機串(「挑戰」),被鑑權方將該隨機串和本身的鑑權口令字一塊兒進行 Hash 運算後,返還鑑權方,鑑權方將收到的Hash值與在己端用該隨機串和對方的鑑權口令字進行 Hash 運算的結果相比較(「認證」),如相同,則可在統計上認爲對方擁有該口令字,即經過鑑權。
1)生日攻擊
利用「兩個集合相交」問題的原理生成散列函數碰撞,達到目的的攻擊稱爲生日攻擊,也稱爲平方根攻擊。
生日攻擊方法沒有利用Hash函數的結構和任何代數弱性質,它只依賴於消息摘要的長度,即Hash的長度。
2)MD5安全性
MD5是一個較爲古老的算法,一度被普遍應用於安全領域。好比在UNIX系統中用戶的密碼就是以MD5(或其它相似的算法)經加密後存儲在文件系統中。當用戶登陸的時候,系統把用戶輸入的密碼計算成MD5值,而後再去和保存在文件系統中的MD5值進行比較,進而肯定輸入的密碼是否正確。
經過這樣的步驟,系統在並不知道用戶密碼的明碼的狀況下就能夠肯定用戶登陸系統的合法性。這不但能夠避免用戶的密碼被具備系統管理員權限的用戶知道,並且還在必定程度上增長了密碼被破解的難度。
不過,因爲MD5的弱點被不斷髮現以及計算機能力不斷的提高,經過碰撞的方法有可能構造兩個具備相同MD5的信息,使MD5算法在目前的安全環境下有一點落伍。從實踐角度,不一樣信息具備相同MD5的可能性仍是很是低的,一般認爲是不可能的,經過碰撞的方法也很難碰撞出複雜信息的MD5數值。
所以,MD5算法仍是被普遍的用做檢驗文件是否變化的散列函數,不少相似迅雷、旋風這樣的下載工具,均可以經過MD5來驗證,用戶下載下來的文件是否被修改。
3)SHA-1安全性
SHA-1 算法是一種密碼散列函數,美國國家安全局設計,並由美國國家標準技術研究所(NIST)發佈爲聯邦數據處理標準(FIPS),被普遍用於:
儘管早在 2005 年其理論上的攻擊方法就已經被熟知,SHA-1 也在 2011 年被 NIST 正式棄用,但依舊仍是有許多公司和我的在使用 SHA-1 算法。
2017 年 2 月 23 日,CWI Amsterdam 與 Google 宣佈了一個實現了的 SHA-1 碰撞攻擊。Google 但願用這樣的方式,推進業界儘快棄用 SHA-1,而使用安全性更高的算法,好比 SHA-256。
4)散列函數的安全性
Hash的安全要求:
(1)H可適用於任意長度的數據塊。
(2)H可以生成固定長度的輸出。
(3)對於任意給定的x,計算H(x)相對容易,而且能夠用軟/硬件實現。
(4)對於任意給定的h,找到知足H(x)=h的x在計算上不可行,知足這一特性的散列函數稱之爲:具有抗原像攻擊性。
(5)對於任意給定的數據塊x,找到知足H(y)=H(x)的y ≠ x在計算上是不可行;知足這一特性的散列函數稱之爲:抗弱碰撞性。
(6)找到知足H(x) = H(y)的任意一對(x,y)在計算上是不可行的。知足這一特性的散列函數稱之爲:抗碰撞性。
有兩種方法能夠攻擊安全散列函數:密碼分析法和暴力攻擊法。散列函數抵抗暴力攻擊的強度徹底依賴於算法生成的散列碼長度。Van Oorschot和Wiener曾經提出,花費1000萬美圓涉及一個被專門用來搜索MD5算法碰撞的機器,則平均24天內就能夠找到一個碰撞。
2004年8月中國密碼學家王小云教授等首次公佈了提出一種尋找MD5碰撞的新方法。目前利用該方法用普通微機幾分鐘內便可找到MD5的碰撞。MD5已經唄完全攻破。
5)安全散列函數的發展
SHA家族的五個算法,分別是SHA-一、SHA-22四、SHA-25六、SHA-384,和SHA-512,由美國國家安全局(NSA)所設計,並由美國國家標準與技術研究院(NIST)發佈;是美國的政府標準。後四者有時並稱爲SHA-2。SHA-1在許多安全協定中廣爲使用,包括TSL和SSL,PGP,SSH、S/MIME和IPsec,曾被視爲是MD5(更早以前被廣爲使用的雜湊函數)的後繼者。但SHA-1的安全性現在被密碼學家嚴重質疑;雖然至今還沒有出現對SHA-2有效的攻擊,它的算法跟SHA-1基本上仍然類似;所以有些人開始發展其餘替代的雜湊算法。
最初載明的算法於1993年發佈,稱作安全雜湊標準(Secure Hash Standard),FIPS PUB 180。這個版本如今常被稱爲SHA-0。它在發佈以後很快就被NSA撤回,而且由1995年發佈的修訂版本FIPS PUB 180-1(一般稱爲SHA-1)取代。
(1)不一樣的程序也會有相同的MD5;
(2)不能肯定網站是否被黑客入侵篡改,是否被植入病毒或木馬;
(3)當軟件過大時,在驗證過程當中所需的時間也會大大增長,對於第三方而言,攻擊的成功機率也會增長。
(4)若是有第三方在驗證軟件完整性時截取軟件代碼,使用快速MD5碰撞生成器,在短期內僞造一份相同的MD5,並惡意篡改軟件,那麼安全性將會大大降低。