數據摘要算法的測試效率(SHA、MD5和CRC32)

一、算法概述

數據摘要算法是密碼學算法中很是重要的一個分支,它經過對全部數據提取指紋信息以實現數據簽名、數據完整性校驗等功能,因爲其不可逆性,有時候會被用作敏感信息的加密。數據摘要算法也被稱爲哈希(Hash)算法或散列算法。php

1.1 CRC八、CRC1六、CRC32

CRC(Cyclic Redundancy Check,循環冗餘校驗)算法出現時間較長,應用也十分普遍,尤爲是通信領域,如今應用最多的就是 CRC32 算法,它產生一個4字節(32位)的校驗值,通常是以8位十六進制數,如FA 12 CD 45等。CRC算法的優勢在於簡便、速度快,嚴格的來講,CRC更應該被稱爲數據校驗算法,但其功能與數據摘要算法相似,所以也做爲測試的可選算法。html

  在 WinRAR、WinZIP 等軟件中,也是以 CRC32 做爲文件校驗算法的。通常常見的簡單文件校驗(Simple File Verify – SFV)也是以 CRC32算法爲基礎,它經過生成一個後綴名爲.SFV 的文本文件,這樣能夠任什麼時候候能夠將文件內容 CRC32運算的結果與 .SFV 文件中的值對比來肯定此文件的完整性。與 SFV 相關工具軟件有不少,如MagicSFV、MooSFV等。python

1.2 MD2 、MD四、MD5

  這是應用很是普遍的一個算法家族,尤爲是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD二、MD三、MD4發展而來,由Ron Rivest(RSA公司)在1992年提出,目前被普遍應用於數據完整性校驗、數據(消息)摘要、數據加密等。MD二、MD四、MD5 都產生16字節(128位)的校驗值,通常用32位十六進制數表示。MD2的算法較慢但相對安全,MD4速度很快,但安全性降低,MD5比MD4更安全、速度更快。算法

  目前在互聯網上進行大文件傳輸時,都要得用MD5算法產生一個與文件匹配的、存儲MD5值的文本文件(後綴名爲 .md5或.md5sum),這樣接收者在接收到文件後,就能夠利用與 SFV 相似的方法來檢查文件完整性,目前絕大多數大型軟件公司或開源組織都是以這種方式來校驗數據完整性,並且部分操做系統也使用此算法來對用戶密碼進行加密,另外,它也是目前計算機犯罪中數據取證的最經常使用算法。與MD5 相關的工具備不少,如 WinMD5等。segmentfault

1.3 SHA一、SHA25六、SHA38四、SHA512

  SHA(Secure Hash Algorithm)是由美國專門制定密碼算法的標準機構——美國國家標準技術研究院(NIST)制定的,SHA系列算法的摘要長度分別爲:SHA爲20字節(160位)、SHA256爲32字節(256位)、 SHA384爲48字節(384位)、SHA512爲64字節(512位),因爲它產生的數據摘要的長度更長,所以更難以發生碰撞,所以也更爲安全,它是將來數據摘要算法的發展方向。因爲SHA系列算法的數據摘要長度較長,所以其運算速度與MD5相比,也相對較慢。安全

  目前SHA1的應用較爲普遍,主要應用於CA和數字證書中,另外在目前互聯網中流行的BT軟件中,也是使用SHA1來進行文件校驗的。服務器

1.4 RIPEMD、PANAMA、TIGER、ADLER32 等

  RIPEMD是Hans Dobbertin等3人在對MD4,MD5缺陷分析基礎上,於1996年提出來的,有4個標準12八、160、256和320,其對應輸出長度分別爲16字節、20字節、32字節和40字節。TIGER由Ross在1995年提出。Tiger號稱是最快的Hash算法,專門爲64位機器作了優化。網絡

二、算法測試

2.1 測試方法

  • 測試範圍 :常見的數據校驗、摘要算法,主要有 CRC3二、MD五、SHA一、SHA25六、SHA38四、SHA512
  • 樣本數據 :2G大小Vmware 虛擬機操做系統的磁盤文件,其中包含其中各類類型的文件,如二進制文件和文本文件等。
  • 軟件平臺 :Windows、.NET Framework 2.0
  • 硬件平臺 :
    • 機器A(SCSI Disk):軟件配置 Windows 2000 + .Net Framework 2.0;硬件配置 CPU:4 (Xeon),2.8G,RAM:2G ,HD:70 GB SCSI
    • 機器B(IDE Disk):軟件配置 Windows 2003 + .Net Framework 2.0;硬件配置 CPU:1 (P4),2.8G,RAM:1G,HD:40 GB IDE

  考慮到整個測試過程只是涉及到文件讀取與哈希值的計算,並沒有過多的與操做系統、軟件平臺、開發語言相關的操做,所以能夠認爲上述測試方法的結果具備廣泛性,即也適用於其它操做系統平臺(如Linux/Unix)或應用語言/平臺(C、Java)。多線程

2.2 測試結果

  1)不一樣配置機器間的對比函數

  在不一樣機器配置上的平均運算結果以下表所示:

  注1:配有SCSI磁盤的機器運行時間反而比 IDE 磁盤時間長,多是因爲前者具備較多的應用負載形成的,如Oracle、WebSphere等,並且其OS爲 Windows 2000,在之上運行 .NET 應用程序可能與 Windows 2003 的效率有所差異

  注2:上述算法中,只有 CRC32 沒有包含在.NET Framework 中,而是使用C#單獨實現的,所以可能會對其測試結果帶來一些影響。

  2)不一樣算法的CPU佔用率比較

  在不一樣的算法運行時,在機器B上監控其對於 CPU 的平均使用時間,結果以下表所示:

三、實驗結論

  • 數據摘要算法的處理是很快的,在通常配置的PC機上使用MD5算法,處理1G的文件數據只需20-30秒(有些專用設備聲稱達 3GB/秒),不會對應用或機器帶來過多負載
  • MD五、SHA1雖然被發現存在缺陷(碰撞),但在近幾年內,仍然能夠大量使用
  • SHA256/384/512 的速度較慢,能夠用於少許數據摘要,目前不適合用於大文件校驗

  CRC32爲32bit的簡單hash,MD5爲128bit較複雜的hash算法。直覺上貌似CRC32的計算速度要比MD5快的。今天用FlexHEX計算大文件的hash時發現CRC32相對MD5並無明顯優點。

  實驗發現:Linux操做系統下用md5sum和cksum取文件哈希:MD5僅花費CRC32時間的72%左右。

  • MD5計算速度要明顯優於CRC32!

四、文章來源

    1)http://dearymz.blog.163.com/blog/static/205657420116205415458/

    2)http://www.getcn.net/index.php?mod=skill&action=detail&id=43881

 

備註:以上關於MD5和CRC的比較應該是錯誤的。由於MD5和CRC測試的

網上有人用python計算MD5和crc的速度。

https://segmentfault.com/a/1190000004000838

PASS
BenchmarkCrc32-4 20000000 64.9 ns/op
BenchmarkMd5-4 5000000 274 ns/op
ok test 3.022s

md5大體慢4倍左右

CRC3二、MD五、SHA1概念及可靠性現狀

轉自http://www.metsky.com/archives/337.html

昨天介紹了Windows 7的版本識別問題,不得不提到經常使用的CRC3二、MD五、SHA1等校驗算法可靠性問題,若是隻是單純的編碼理論,天緣還算是能夠看懂,但對密碼學總體認識畢竟不是行內人,因此也只能從一些皮毛概念上簡單介紹一下,實際上這些算法自己並不複雜,但每種算法的創立都是偉大壯舉,這裏天緣也把他們(W. Wesley Peterson和Ronald L. Rivest)請到摘要裏,感恩一下。

如今網上流傳最廣的文件校驗方式是MD5和SHA1,微軟發佈的操做系統如今都是採用CRC32結合SHA1發佈。這三種算法中屬CRC最年長,也是應用最普遍,若是不考慮碰撞的條件下,這些算法均可以發現傳輸或保存的信息受到的損壞或篡改,好比文件校驗能夠防止文件被惡意篡改,數字簽名能夠保護合法者不被仿冒,系統鑑權一方面要保護用戶存儲信息不受侵害,還須要保護信息傳輸過程不受干擾破壞等等,下面具體看一下。

 

一、CRC校驗

CRC全稱Cyclic Redundancy Check,又叫循環冗餘校驗。它是一種散列函數(HASH,把任意長度的輸入經過散列算法,最終變換成固定長度的摘要輸出,其結果就是散列值,按照HASH算法,HASH具備單向性,不可逆性),用來檢測或校驗傳輸或保存的數據錯誤,在通訊領域普遍地用於實現差錯控制,好比通訊系統多使用CRC12和CRC16,XMODEM使用CRC16等等(十二、1六、32等值均是指多項式的最高階N次冪),天緣早前在作通訊方面工做時也是最經常使用到這個校驗方法,由於其編解碼方法都很是簡單,運算時間也很短。

但從理論角度,CRC不能徹底可靠的驗證數據完整性,由於CRC多項式是線性結構,很容易經過改變數據方式達到CRC碰撞,天緣這裏給一個更加通俗的解釋,假設一串帶有CRC校驗的代碼在傳輸中,若是連續出現差錯,當出錯次數達到必定次數時,那麼幾乎能夠確定會出現一次碰撞(值不對但CRC結果正確),但隨着CRC數據位增長,碰撞概率會顯著下降,好比CRC32比CRC16具備更可靠的驗證性,CRC64又會比CRC32更可靠,固然這都是按照ITU規範標準條件下。

正由於CRC具備以上特色,對於網絡上傳輸的文件類不多隻使用CRC做爲校驗依據,文件傳輸相比通訊底層傳輸風險更大,很容易受到人爲干預影響。

二、MD5

MD全稱Message Digest,又稱信息摘要算法,MD5從MD2/3/4演化而來,MD5散列長度一般是128位, 也是目前被大量普遍使用的散列算法之一,主要用於密碼加密和文件校驗等。MD5的算法雖然很是「牢靠」,不過也已經被找到碰撞的方法,網上雖然出現有些碰撞軟件,天緣沒用過,但能夠確定,實際做用範圍至關有限,好比,及時黑客拿到了PASSWORD MD5值,除了暴力破解,即便找到碰撞結果也未必可以影響用戶安全問題,由於對於密碼還要限定位數、類型等,可是若是是面向數字簽名等應用,可能就會被破解掉,不過,MD5同下文的SHA1還是目前應用最普遍的HASH算法,他們都是在MD4基礎上改進設計的。

三、SHA1

SHA全稱Secure Hash Standard,又稱安全哈希標準,SHA家族算法有SHA-一、SHA-22四、SHA-25六、SHA-384和SHA-512(後四者一般並稱SHA2),原理和MD四、MD5原理類似,SHA是由美國國家安全局(NSA)所設計,由美國國家標準與技術研究院(NIST)發佈。SHA可將一個最大2^64位(2305843009213693952字節)信息,轉換成一串160位(20字節)的散列值(摘要信息),目前也是應用最普遍的HASH算法。同MD5同樣,從理論角度,SHA1也不是絕對可靠,目前也已經找到SHA1的碰撞條件,但「實用」的碰撞算法軟件還沒出現。因而美國NIST又開始使用SHA2,研究更新的加密算法。

校驗工具下載:

三 款主流文件校驗碼工具HashCalc、WinMD五、Hasher

補 充

一、上文「碰撞」的解釋,碰撞就是不一樣明文經過HASH後的結果相同。

二、MD5和SHA1都具備高度的離散性,哪怕是隻修改一個字節值都會致使MD5或SHA1值「巨大」變化,從實踐角度,不一樣信息具備相同MD5或SHA1碼 的可能性很是低,一般認爲是不可能的。

三、對於普通的下載文件或操做系統,想經過簡單的修改某個字節或某些字節,又要保證文件名、大小和安裝可靠性的前提下,想達到MD五、SHA1碰撞效果也幾乎是不可能的。

四、關於單線程下載和多線程下載是否會對下載文件的準確性有影響,像電驢、迅雷都是按照HASH碼進行合法校驗「拼裝」的,除非是軟件出了錯誤,不然單線程多線程跟最終下載結果沒有區別,從微軟服務器下載跟從山寨網站下載結果也沒有區別。

五、總之,有生之年,你們能夠不相信CRC,可是MD5和SHA1絕對值得信賴,敬請放心,他們比天氣預報要可靠的多了。

相關文章
相關標籤/搜索