MD5值

MD5值

簡介MD5的全稱是Message-Digest MD5的實際套用是對一段Message(位元組串)產生fin MD5校驗值軟體Win

簡介

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc 發明,由 MD2/MD3/MD4 發展而來的。MD5的實際套用是對一段Message(位元組串)產生fingerprint(數字指紋,MD5值就是指經MD5計算得到的這種數字指紋。),可以防止被“篡改”。舉個例子,天天安全網提供下載的MD5校驗值軟體WinMD5.zip,其MD5值是1e07ab3591d25583eff5129293dc98d2,但你下載該軟體後計算MD5發現其值卻是81395f50b94bb4891a4ce4ffb6ccf64b,那說明該ZIP已經被他人修改過,那還用不用該軟體那你可自己琢磨著看啦。
MD5廣泛用於加密解密技術上,在很多作業系統中,用戶的密碼是以MD5值(或類似的其它算法)的方式保存的,用戶登錄的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,來驗證該用戶的合法性。
MD5校驗值軟體WinMD5.zip漢化版使用極其簡單,運行該軟體後,
把需要計算MD5值的檔案用滑鼠拖到正在處理的框裡邊,下面將直接顯
示其MD5值以及所測試的檔案名稱稱,可以保留多個檔案測試的MD5值,
選定所需要複製的MD5值,用CTRL+C就可以複製到其它地方了。

Md5原理

MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
在MD5算法中,首先需要對信息進行填充,使其位元組長度對512求餘數的結果等於448。因此,信息的位元組長度(Bits Length)將被擴展至N*512+448,即N*64+56個位元組(Bytes),N為一個正整數。填充的方法如下,在信息的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然後再在這個結果後面附加一個以64位二進制表示的填充前的信息長度。經過這兩步的處理,現在的信息位元組長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍數。這樣做的原因是為滿足後面處理中對信息長度的要求。MD5中有四個32位被稱作連結變數(Chaining Variable)的整數參數,他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 當設定好這四個連結變數後,就開始進入算法的四輪循環運算,循環的次數是信息中512位信息分組的數目。
將上面四個連結變數複製到另外四個變數中:A到a,B到b,C到c,D到d。 主循環有四輪(MD4隻有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函式運算,然後將所得結果加上第四個變數(文本中的一個子分組和一個常數)。
再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。
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))
其中,♁是異或,∧是與,∨是或, 是反符號。
如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。F是一個逐位運算的函式。即,如果X,那么Y,否則Z。函式H是逐位奇偶操作符。所有這些完成之後,將A,B,C,D分別加上a,b,c,d。然後用下一分組數據繼續運行算法,最後的輸出是A,B,C和D的級聯。最後得到的A,B,C,D就是輸出結果,A是低位,D為高位,DCBA組成128位輸出結果。

MD5的安全性

從安全的角度講,MD5的輸出為128位,若採用純強力攻擊尋找一個訊息具有給定Hash值的計算困難性為2128,用每秒可試驗1000000000個訊息的計算機需時1.07×1022年。
MD5是不可逆的,因此只能加密,不可解密。

Md5加密算法的套用

MD5加密算法由於其具有較好的安全性,加之商業也可以免費使用該算法,因此該加密算法被廣泛使用,md5算法主要運用在數字簽名、檔案完整性驗證以及口令加密等方面。

MD5的破解

2004年8月17日的美國加州聖巴巴拉的國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小雲教授做了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報告,公布了MD系列算法的破解結果。宣告了固若金湯的世界通行密碼標準MD5的堡壘轟然倒塌,引發了密碼學界的軒然大波。
令世界頂尖密碼學家想像不到的是,破解MD5之後,2005年2月,王小雲教授又破解了另一國際密碼SHA-1。因為SHA-1在美國等國際社會有更加廣泛的套用,密碼被破的訊息一出,在國際社會的反響可謂石破天驚。換句話說,王小雲的研究成果表明了從理論上講電子簽名可以偽造,必須及時添加限制條件,或者重新選用更為安全的密碼標準,以保證電子商務的安全。MD5驗證執行檔不再可靠的訊息
MD5破解工程權威網站是為了公開徵集專門針對MD5的攻擊而設立的,網站於2004年8月17日宣布:“中國研究人員發現了完整MD5算法的碰撞;Wang, Feng, Lai與Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128幾個 Hash函式的碰撞。這是近年來密碼學領域最具實質性的研究進展。使用他們的技術,在數個小時內就可以找到MD5碰撞。……由於這個裡程碑式的發現,MD5CRK項目將在隨後48小時內結束”。
在2004年8月之前,國際密碼學界對王小雲這個名字並不熟悉。2004年8月,在美國加州聖芭芭拉召開的國際密碼大會上,並沒有被安排發言的王小雲教授拿著自己的研究成果找到會議主席,沒想到慧眼識珠的會議主席破例給了她15分鐘時間來介紹自己的成果,而通常發言人只被允許有兩三分鐘的時間。王小雲及其研究同工展示了MD5、SHA-0及其他相關雜湊函式的雜湊衝撞。所謂雜湊衝撞指兩個完全不同的訊息經雜湊函式計算得出完全相同的雜湊值。根據鴿巢原理,以有長度限制的雜湊函式計算沒有長度限制的訊息是必然會有衝撞情況出現的。可是,一直以來,電腦保全專家都認為要任意製造出衝撞需時太長,在實際情況上不可能發生,而王小雲等的發現可能會打破這個必然性。就這樣,王小雲在國際會議上首次宣布了她及她的研究小組近年來的研究成果——對MD4、MD5、HAVAL-128和RIPEMD等四個著名密碼算法的破譯結果。
在公布到第三個成果的時候,會場上已經是掌聲四起,報告不得不一度中斷。報告結束後,所有與會專家對他們的突出工作報以長時間的掌聲,有些學者甚至起立鼓掌以示他們的祝賀和敬佩。由於版本問題,作者在提交會議論文時使用的一組常數和先行標準不同,在發現這一問題之後,王小雲教授立即改變了那個常數,在很短的時間內就完成了新的數據分析,這段有驚無險的小插曲更證明了他們論文的信服力,攻擊方法的有效性,驗證了研究工作的成功。
2005年8月,王小雲、姚期智,以及姚期智妻子姚儲楓(即為Knuth起名高德納的人)聯手於國際密碼討論年會尾聲部份提出SHA-1雜湊函式雜湊衝撞演算法的改良版。
2006年6月8日,王小雲教授於中國科學院第13次院士大會和中國工程院第8次院士大會上以“國際通用Hash函式的破解”獲頒陳嘉庚科學獎信息技術科學獎。

MD5的消亡

實際上,從MD5誕生之日起,來自美國名為Van Oorschot和Wiener的兩位密碼學專家就發現了一個暴力搜尋衝突的函式,並預算出"使用一個專門用來搜尋MD5衝突的機器可以平均每24天就找到一個衝突"。不過由於該方案僅僅從理論上證明了MD5的不安全性,且實現的代價及其誇張(當時要製造這種專門的計算機,成本需要100萬美元),於是MD5自其誕生十多年來一直未有新版本或者被其它算法徹底取代。
在接下來的日子裡,有關MD5的破譯又誕生了"野蠻攻擊",也就是用"窮舉法"從所有可能產生的結果中找到被MD5加密的原始明文,不過由於MD5採用128位加密方法,即使一台機器每秒嘗試10億條明文,那么要破譯出原始明文大概需要10的22次方年,而一款名為"MD5爆破工具"的軟體,每秒進行的運算僅僅為2萬次! 經過無數MD5算法研究專家的努力,先後又誕生了"生日攻擊"、"微分攻擊"等多種破譯方法(相關信息大家可以參考研究成果,大大推進了md5算法消亡的進程。儘管在研究報告中並沒有提及具體的實現方法,我們可以認為,md5被徹底攻破已經掃除了技術上的障礙,剩下的僅僅是時間和精力上的問題。。此次山東大學幾位教授的最新研究成果,大大推進了MD5算法消亡的進程。儘管在研究報告中並沒有提及具體的實現方法,我們可以認為,MD5被徹底攻破已經掃除了技術上的障礙,剩下的僅僅是時間和精力上的問題。由於MD5套用極其廣泛,即使是在銀行數字簽名證書中,它依然占據著比較重要的地位,此次MD5被成功破譯的新聞讓不少不明所以的人感到"恐懼",認為這是對整個密碼界的徹底顛覆,甚至有人開始擔心"自己放在銀行或者網路銀行賬戶中的存款也有被盜取的可能"。 其實這種憂慮完全是杞人憂天,以目前主流的網路銀行的加密技術為例,它們都構建於PKI(Pubic Key Infrastructure,公鑰加密技術)平台之上,與公鑰成對的私鑰只掌握在與之通信的另一方,這一"信任關係"是通過公鑰證書來實現的。PKI的整個安全體系由加密、數字簽名、數據完整性機制等技術來共同保障,其密碼算法包括對稱密碼算法(如DES、3DES)、公開密鑰密碼算法(如ECC、RSA),即使在同樣有套用的HASH算法方面,目前網路銀行所採用的大多是SHA-1算法,該算法與MD5的128位加密相比,使用了160位加密方式,比MD5安全性高不少。

MD5套用到網站建設的代碼

<%
Private Const BITS_TO_A_BYTE = 8
Private Const BYTES_TO_A_WORD = 4
Private Const BITS_TO_A_WORD = 32
Private m_lOnBits(30)
Private m_l2Power(30)
Private Function LShift(lValue, iShiftBits)
If iShiftBits = 0 Then
LShift = lValue
Exit Function
ElseIf iShiftBits = 31 Then
If lValue And 1 Then
LShift = &H80000000
Else
LShift = 0
End If
Exit Function
ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
Err.Raise 6
End If
If (lValue And m_l2Power(31 - iShiftBits)) Then
LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
Else
LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
End If
End Function
Private Function RShift(lValue, iShiftBits)
If iShiftBits = 0 Then
RShift = lValue
Exit Function
ElseIf iShiftBits = 31 Then
If lValue And &H80000000 Then
RShift = 1
Else
RShift = 0
End If
Exit Function
ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
Err.Raise 6
End If
RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
If (lValue And &H80000000) Then
RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
End If
End Function
Private Function RotateLeft(lValue, iShiftBits)
RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
End Function
Private Function AddUnsigned(lX, lY)
Dim lX4
Dim lY4
Dim lX8
Dim lY8
Dim lResult
lX8 = lX And &H80000000
lY8 = lY And &H80000000
lX4 = lX And &H40000000
lY4 = lY And &H40000000
lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
If lX4 And lY4 Then
lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
ElseIf lX4 Or lY4 Then
If lResult And &H40000000 Then
lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
Else
lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
End If
Else
lResult = lResult Xor lX8 Xor lY8
End If
AddUnsigned = lResult
End Function
Private Function md5_F(x, y, z)
md5_F = (x And y) Or ((Not x) And z)
End Function
Private Function md5_G(x, y, z)
md5_G = (x And z) Or (y And (Not z))
End Function
Private Function md5_H(x, y, z)
md5_H = (x Xor y Xor z)
End Function
Private Function md5_I(x, y, z)
md5_I = (y Xor (x Or (Not z)))
End Function
Private Sub md5_FF(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_GG(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_HH(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Sub md5_II(a, b, c, d, x, s, ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
a = RotateLeft(a, s)
a = AddUnsigned(a, b)
End Sub
Private Function ConvertToWordArray(sMessage)
Dim lMessageLength
Dim lNumberOfWords
Dim lWordArray()
Dim lBytePosition
Dim lByteCount
Dim lWordCount
Const MODULUS_BITS = 512
Const CONGRUENT_BITS = 448
lMessageLength = Len(sMessage)
lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
lByteCount = 0
Do Until lByteCount >= lMessageLength
lWordCount = lByteCount \ BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
lByteCount = lByteCount + 1
Loop
lWordCount = lByteCount \ BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
End Function
Private Function WordToHex(lValue)
Dim lByte
Dim lCount
For lCount = 0 To 3
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
Next
End Function
Public Function MD5(sMessage)
m_lOnBits(0) = CLng(1)
m_lOnBits(1) = CLng(3)
m_lOnBits(2) = CLng(7)
m_lOnBits(3) = CLng(15)
m_lOnBits(4) = CLng(31)
m_lOnBits(5) = CLng(63)
m_lOnBits(6) = CLng(127)
m_lOnBits(7) = CLng(255)
m_lOnBits(8) = CLng(511)
m_lOnBits(9) = CLng(1023)
m_lOnBits(10) = CLng(2047)
m_lOnBits(11) = CLng(4095)
m_lOnBits(12) = CLng(8191)
m_lOnBits(13) = CLng(16383)
m_lOnBits(14) = CLng(32767)
m_lOnBits(15) = CLng(65535)
m_lOnBits(16) = CLng(131071)
m_lOnBits(17) = CLng(262143)
m_lOnBits(18) = CLng(524287)
m_lOnBits(19) = CLng(1048575)
m_lOnBits(20) = CLng(2097151)
m_lOnBits(21) = CLng(4194303)
m_lOnBits(22) = CLng(8388607)
m_lOnBits(23) = CLng(16777215)
m_lOnBits(24) = CLng(33554431)
m_lOnBits(25) = CLng(67108863)
m_lOnBits(26) = CLng(134217727)
m_lOnBits(27) = CLng(268435455)
m_lOnBits(28) = CLng(536870911)
m_lOnBits(29) = CLng(1073741823)
m_lOnBits(30) = CLng(2147483647)
m_l2Power(0) = CLng(1)
m_l2Power(1) = CLng(2)
m_l2Power(2) = CLng(4)
m_l2Power(3) = CLng(8)
m_l2Power(4) = CLng(16)
m_l2Power(5) = CLng(32)
m_l2Power(6) = CLng(64)
m_l2Power(7) = CLng(128)
m_l2Power(8) = CLng(256)
m_l2Power(9) = CLng(512)
m_l2Power(10) = CLng(1024)
m_l2Power(11) = CLng(2048)
m_l2Power(12) = CLng(4096)
m_l2Power(13) = CLng(8192)
m_l2Power(14) = CLng(16384)
m_l2Power(15) = CLng(32768)
m_l2Power(16) = CLng(65536)
m_l2Power(17) = CLng(131072)
m_l2Power(18) = CLng(262144)
m_l2Power(19) = CLng(524288)
m_l2Power(20) = CLng(1048576)
m_l2Power(21) = CLng(2097152)
m_l2Power(22) = CLng(4194304)
m_l2Power(23) = CLng(8388608)
m_l2Power(24) = CLng(16777216)
m_l2Power(25) = CLng(33554432)
m_l2Power(26) = CLng(67108864)
m_l2Power(27) = CLng(134217728)
m_l2Power(28) = CLng(268435456)
m_l2Power(29) = CLng(536870912)
m_l2Power(30) = CLng(1073741824)
Dim x
Dim k
Dim AA
Dim BB
Dim CC
Dim DD
Dim a
Dim b
Dim c
Dim d
Const S11 = 7
Const S12 = 12
Const S13 = 17
Const S14 = 22
Const S21 = 5
Const S22 = 9
Const S23 = 14
Const S24 = 20
Const S31 = 4
Const S32 = 11
Const S33 = 16
Const S34 = 23
Const S41 = 6
Const S42 = 10
Const S43 = 15
Const S44 = 21
x = ConvertToWordArray(sMessage)
a = &H67452301
b = &HEFCDAB89
c = &H98BADCFE
d = &H10325476
For k = 0 To UBound(x) Step 16
AA = a
BB = b
CC = c
DD = d
md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478
md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756
md5_FF c, d, a, b, x(k + 2), S13, &H242070DB
md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A
md5_FF c, d, a, b, x(k + 6), S13, &HA8304613
md5_FF b, c, d, a, x(k + 7), S14, &HFD469501
md5_FF a, b, c, d, x(k + 8), S11, &H698098D8
md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE
md5_FF a, b, c, d, x(k + 12), S11, &H6B901122
md5_FF d, a, b, c, x(k + 13), S12, &HFD987193
md5_FF c, d, a, b, x(k + 14), S13, &HA679438E
md5_FF b, c, d, a, x(k + 15), S14, &H49B40821
md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562
md5_GG d, a, b, c, x(k + 6), S22, &HC040B340
md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51
md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D
md5_GG d, a, b, c, x(k + 10), S22, &H2441453
md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681
md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6
md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87
md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED
md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905
md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9
md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942
md5_HH d, a, b, c, x(k + 8), S32, &H8771F681
md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122
md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C
md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6
md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA
md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085
md5_HH b, c, d, a, x(k + 6), S34, &H4881D05
md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039
md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665
md5_II a, b, c, d, x(k + 0), S41, &HF4292244
md5_II d, a, b, c, x(k + 7), S42, &H432AFF97
md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7
md5_II b, c, d, a, x(k + 5), S44, &HFC93A039
md5_II a, b, c, d, x(k + 12), S41, &H655B59C3
md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92
md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D
md5_II b, c, d, a, x(k + 1), S44, &H85845DD1
md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F
md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
md5_II c, d, a, b, x(k + 6), S43, &HA3014314
md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1
md5_II a, b, c, d, x(k + 4), S41, &HF7537E82
md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235
md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
md5_II b, c, d, a, x(k + 9), S44, &HEB86D391
a = AddUnsigned(a, AA)
b = AddUnsigned(b, BB)
c = AddUnsigned(c, CC)
d = AddUnsigned(d, DD)
Next
'MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
MD5=LCase(WordToHex(b) & WordToHex(c)) 'I crop this to fit 16byte database password :D
End Function
%>

MD5的繼承者?

"天下沒有不透風的牆",任何一種算法都會有其漏洞,即使是目前大行其道的MD5和SHA-1,當對漏洞的研究發展到其能夠被有效利用時,則標誌著該算法滅亡的時候到了。所謂"天下無不散之筵席",MD5逐漸退出歷史舞台後,下一個接任者又會是誰呢?
長期以來,密碼界一直在致力於對新加密算法的研究,而且在高度機密的安全領域,所採用的加密算法也絕非MD5,各國政府、各大公司都在研究擁有獨立技術的加密算法,其中比較出色的代表有SHA-1、SHA-224等。此次MD5破譯報告發表後,美國國家技術與標準局(NIST)表示,鑒於MD5被破譯以及SHA-1漏洞被發現,他們將逐漸放棄目前使用的SHA-1,於2010年前逐步推廣更安全的SHA-224、SHA-256、SHA-384和SHA-512。這些算法與MD5的128位加密相比,加密位數和安全性能都提高了很多倍。 儘管MD5被淘汰已經成為必然,不過鑒於它開源以及免費的特性,而且目前還沒有真正有效的快速破解方法,因此它還將繼續在歷史舞台活躍一段時間。

MD5到底有什麼用

當我們下載了如圖1所示之類的檔案後,如果想知道下載的這個檔案和網站的原始檔案是否一模一樣,就可以給自己下載的檔案做個MD5校驗。如果得到的MD5值和網站公布的相同,可確認所下載的檔案是完整的。如有不同,說明你下載的檔案是不完整的:要么就是在網路下載的過程中出現錯誤,要么就是此檔案已被別人修改。為防止他人更改該檔案時放入病毒,最好不要使用。
當我們用E-mail給好友傳送檔案時,可以將要傳送檔案的MD5值告訴對方,這樣好友收到該檔案以後即可對其進行校驗,來確定檔案是否安全。
再比如:在剛安裝好系統後可以給系統檔案做個MD5校驗,過了一段時間後如果你懷疑某些檔案被人換掉,

如何讀取和校驗MD5信息

Windows 下

了解了MD5信息以後,下面我們來看一看如何讀取並校驗檔案的MD5信息。這需要一款檢測MD5值的專門小軟體,這是一款綠色軟體解壓縮後運行其中的MD5.EXE檔案即可。軟體的使用非常簡單,點擊“Open”按鈕,選擇並打開想要進行校驗的檔案,稍等片刻後,在MD5一欄中便會顯示該檔案的MD5值,將該數值同網站公布的數值進行比較即可確定檔案是否完整了。點擊“Save”按鈕可以將讀取的MD5保存為一個.MD5檔案,用記事本打開該檔案,可以將MD5值複製出來。
為了驗證檔案修改後的MD5值是否發生變化,筆者用一個文本檔案進行了測試。如圖2所示,第一個檔案為進行測試的原始檔案,第二個檔案為進行修改後的檔案(不過只是在打開原始檔案的基礎上加入了一個空格),第三個檔案為原始檔案的複製檔案。從圖中可以看出,儘管改動不大,但是兩個檔案的MD5值卻大相逕庭,而複製得到的檔案則不會發生變化。

Linux 下

Linux 下計算或校驗 MD5 就方便很多,可以用 md5sum 這個工具 (在大多數 Linux 系統中這個工具默認就已經安裝好了)。
先說如何用 md5sum 來計算校驗信息, 比方說我有一個檔案叫 a.c ,我要計算出它的 MD5 校驗值,那么就可以用下面的命令:
$ md5sum a.c
ba88309771bdaef9db77695ef0c59d3c a.c
上面的列印說明 a.c 這個檔案的 MD5 校驗值為 ba88309771bdaef9db77695ef0c59d3c 。我如果通過電子郵件傳送 a.c 給其他人, 其他人就可以用同樣的命令來檢查接收到的檔案的校驗值。 如果對方算出來的值和我原始算出來的一樣,就說明收到的檔案是正確的,反之,則是錯誤的。
為了方便接收方進行 MD5 校驗,傳送方可以將自己計算出的(多個)檔案校驗值存入一個檔案,然後將這個檔案和原始檔案一起傳送給接收方,接收方可以用一條 md5sum 命令來對所有的檔案的校驗碼進行檢測,下面的例子說明這個用法:
【傳送方:】
$ md5sum a.c a.h > my.sig
上面的命令會計算 a.c 和 a.h 兩個檔案的 MD5 值,並存入 my.sig 檔案中。
【接收方:】
接收方收到 a.c a.h 和 my.sig 後,用下面的命令
$ md5sum -c my.sig
來校驗,如果一切正常,應該得到以下輸出:
$ md5sum -c my.sig
a.c: OK
a.h: OK

Mac OS X下

校驗檔案的MD5值在Mac OS X上非常便捷,系統自帶了MD5和SHA1校驗。
打開“終端”(Terminal),輸入MD5,空格,把需要校驗的檔案拖入,確定即可:
md5 filename.ext

熱門詞條

聯絡我們