MD5加密

 MD5(單向散列算法)的全稱是Message-Digest Algorithm 5(信息-摘要算法),經MD2、MD3和MD4發展而來。MD5算法的使用不需要支付任何版權費用。

    MD5功能:
    輸入任意長度的信息,經過處理,輸出爲128位的信息(數字指紋);
    不同的輸入得到的不同的結果(唯一性);
    根據128位的輸出結果不可能反推出輸入的信息(不可逆); 

    MD5屬不屬於加密算法:
    認爲不屬於的人是因爲他們覺得不能從密文(散列值)反過來得到原文,即沒有解密算法,所以這部分人認爲MD5只能屬於算法,不能稱爲加密算法;
    認爲屬於的人是因爲他們覺得經過MD5處理後看不到原文,即已經將原文加密,所以認爲MD5屬於加密算法;我個人支持後者。

    MD5用途:
    1、防止被篡改
    1)比如發送一個電子文檔,發送前,我先得到MD5的輸出結果a。然後在對方收到電子文檔後,對方也得到一個MD5的輸出結果b。如果a與b一樣就代表中途未被篡改。2)比如我提供文件下載,爲了防止不法分子在安裝程序中添加木馬,我可以在網站上公佈由安裝文件得到的MD5輸出結果。3)SVN在檢測文件是否在CheckOut後被修改過,也是用到了MD5.

    2、防止直接看到明文
    現在很多網站在數據庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算不法分子得到數據庫的用戶密碼的MD5值,也無法知道用戶的密碼(其實這樣是不安全的,後面我會提到)。(比如在UNIX系統中用戶的密碼就是以MD5(或其它類似的算法)經加密後存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成MD5值,然後再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)

    3、防止抵賴(數字簽名):
    這需要一個第三方認證機構。例如A寫了一個文件,認證機構對此文件用MD5算法產生摘要信息並做好記錄。若以後A說這文件不是他寫的,權威機構只需對此文件重新產生摘要信息,然後跟記錄在冊的摘要信息進行比對,相同的話,就證明是A寫的了。這就是所謂的“數字簽名”。



我在實踐中常常會用到的MD5校驗加密一般運用場景:用戶密碼,請求參數,文件校驗

2.1.用戶密碼

對於用戶密碼加密最高境界就是:別人獲得你數據庫的用戶資料別人也沒有辦法獲知密碼.要達到就要有一套複雜的加密規則,一般常用的規則比如:

MD5(MD5(用戶名+用戶密碼)+MD5(KEY+項目名+公司名)) 這樣可以避免和別人碰庫不排除別人用MD5來攻擊你的服務器來匹配.

當然還可以自定很多種加密方法,就算知道加密方法也幾乎無法去推送出用戶原密碼是什麼

2.2.請求參數校驗

都與服務器來言排除系統問題最大的問題就是害怕請求被攔截,攔截修改之後就有很多漏洞的可能性了

爲了避免被攔截,參數被修改這種文件的常用方法就是對請求參數進行校驗,就算攔截了請求參數修改了只要模擬不出MD5加密出來的值,在服務器過濾器直接就會進行攔截.

我這邊推薦的請求校驗方法在傳遞參數的時候帶上 MD5值 隨機數 時間戳 當然這幾個都是由客戶端生成 
MD5=MD5(隨機數+時間戳+MD5(KEY+公司名+項目名)) 當然這個規則也是可以定製的

請求參數在服務器攔截器就用客戶端傳遞過來的 隨機數 時間戳 來做校驗如果不通過就不讓繼續訪問(在這裏的隨機數 時間戳在後面的請求安全請求唯一性驗證中會起到很大的作用所以建議保留)

2.3文件校驗

當然對於一些圖片已經一些很小很小的文件來說可以不用MD5校驗應爲基本上都是一次請求就完成了上傳,而且顯示的時候也不需要驗證圖片完不整.

但是如果是遇到了大文件上傳MD5 就起到作用了,當然不是吧一個幾個G 的文件一次性上傳使用MD5校驗,這邊100%會失敗 就算傳遞到服務端了 這個時間是不能被接受的 ,而且服務器最好是對請求做好限制(以後會開一篇來單獨探討文件上傳的問題)

我們對於大文件上傳的處理方式是進行分片上傳,也就是所謂的斷點續傳,裏面的實現機制

如果有一個5MB的文件 客戶端把它分割成5份 1MB的文件 在上傳的時候 上傳兩個MD5值 一個是當前上傳的片1MB文件流的MD5 還有一個就是拼接之後的MD5(如果現在上傳的是第二片 這個MD5就應該是第一片加上第二片的MD5)通過這樣的方式能保證文件的完整性

當如果文件傳到一半斷了,用戶換了臺機器傳 通過驗證文件MD5 值就可以得知用戶已經傳到了第幾片 就可以告訴用戶從第幾片開始傳遞 就解決了這個問題





    MD5算法過程:
    對MD5算法簡要的敘述可以爲:MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。

     第一步、填充:如果輸入信息的長度(bit)對512求餘的結果不等於448,就需要填充使得對512求餘的結果等於448。填充的方法是填充一個1和n個0。填充完後,信息的長度就爲N*512+448(bit);

     第二步、記錄信息長度:用64位來存儲填充前信息長度。這64位加在第一步結果的後面,這樣信息長度就變爲N*512+448+64=(N+1)*512位。

     第三步、裝入標準的幻數(四個整數):標準的幻數(物理順序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定義應該是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。有點暈哈,其實想一想就明白了。

     第四步、四輪循環運算:循環的次數是分組的個數(N+1) 

     1)將每一512字節細分成16個小組,每個小組64位(8個字節)
     
     2)先認識四個線性函數(&是與,|是或,~是非,^是異或)
  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))
    
    3)設Mj表示消息的第j個子分組(從0到15),<<<s表示循環左移s位,則四種操作爲:
  FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
  GG(a,b,c,d,Mj,s,ti)表示a
=b+((a+G(b,c,d)+Mj+ti)<<<s)
  HH(a,b,c,d,Mj,s,ti)表示a
=b+((a+H(b,c,d)+Mj+ti)<<<s)
  II(a,b,c,d,Mj,s,ti)表示a
=b+((a+I(b,c,d)+Mj+ti)<<<s)

    4)四輪運算
第一輪
a
=FF(a,b,c,d,M0,7,0xd76aa478)
b
=FF(d,a,b,c,M1,12,0xe8c7b756)
c
=FF(c,d,a,b,M2,17,0x242070db)
d
=FF(b,c,d,a,M3,22,0xc1bdceee)
a
=FF(a,b,c,d,M4,7,0xf57c0faf)
b
=FF(d,a,b,c,M5,12,0x4787c62a)
c
=FF(c,d,a,b,M6,17,0xa8304613)
d
=FF(b,c,d,a,M7,22,0xfd469501)
a
=FF(a,b,c,d,M8,7,0x698098d8)
b
=FF(d,a,b,c,M9,12,0x8b44f7af)
c
=FF(c,d,a,b,M10,17,0xffff5bb1)
d
=FF(b,c,d,a,M11,22,0x895cd7be)
a
=FF(a,b,c,d,M12,7,0x6b901122)
b
=FF(d,a,b,c,M13,12,0xfd987193)
c
=FF(c,d,a,b,M14,17,0xa679438e)
d
=FF(b,c,d,a,M15,22,0x49b40821)

第二輪
a
=GG(a,b,c,d,M1,5,0xf61e2562)
b
=GG(d,a,b,c,M6,9,0xc040b340)
c
=GG(c,d,a,b,M11,14,0x265e5a51)
d
=GG(b,c,d,a,M0,20,0xe9b6c7aa)
a
=GG(a,b,c,d,M5,5,0xd62f105d)
b
=GG(d,a,b,c,M10,9,0x02441453)
c
=GG(c,d,a,b,M15,14,0xd8a1e681)
d
=GG(b,c,d,a,M4,20,0xe7d3fbc8)
a
=GG(a,b,c,d,M9,5,0x21e1cde6)
b
=GG(d,a,b,c,M14,9,0xc33707d6)
c
=GG(c,d,a,b,M3,14,0xf4d50d87)
d
=GG(b,c,d,a,M8,20,0x455a14ed)
a
=GG(a,b,c,d,M13,5,0xa9e3e905)
b
=GG(d,a,b,c,M2,9,0xfcefa3f8)
c
=GG(c,d,a,b,M7,14,0x676f02d9)
d
=GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三輪
a
=HH(a,b,c,d,M5,4,0xfffa3942)
b
=HH(d,a,b,c,M8,11,0x8771f681)
c
=HH(c,d,a,b,M11,16,0x6d9d6122)
d
=HH(b,c,d,a,M14,23,0xfde5380c)
a
=HH(a,b,c,d,M1,4,0xa4beea44)
b
=HH(d,a,b,c,M4,11,0x4bdecfa9)
c
=HH(c,d,a,b,M7,16,0xf6bb4b60)
d
=HH(b,c,d,a,M10,23,0xbebfbc70)
a
=HH(a,b,c,d,M13,4,0x289b7ec6)
b
=HH(d,a,b,c,M0,11,0xeaa127fa)
c
=HH(c,d,a,b,M3,16,0xd4ef3085)
d
=HH(b,c,d,a,M6,23,0x04881d05)
a
=HH(a,b,c,d,M9,4,0xd9d4d039)
b
=HH(d,a,b,c,M12,11,0xe6db99e5)
c
=HH(c,d,a,b,M15,16,0x1fa27cf8)
d
=HH(b,c,d,a,M2,23,0xc4ac5665)

第四輪
a
=II(a,b,c,d,M0,6,0xf4292244)
b
=II(d,a,b,c,M7,10,0x432aff97)
c
=II(c,d,a,b,M14,15,0xab9423a7)
d
=II(b,c,d,a,M5,21,0xfc93a039)
a
=II(a,b,c,d,M12,6,0x655b59c3)
b
=II(d,a,b,c,M3,10,0x8f0ccc92)
c
=II(c,d,a,b,M10,15,0xffeff47d)
d
=II(b,c,d,a,M1,21,0x85845dd1)
a
=II(a,b,c,d,M8,6,0x6fa87e4f)
b
=II(d,a,b,c,M15,10,0xfe2ce6e0)
c
=II(c,d,a,b,M6,15,0xa3014314)
d
=II(b,c,d,a,M13,21,0x4e0811a1)
a
=II(a,b,c,d,M4,6,0xf7537e82)
b
=II(d,a,b,c,M11,10,0xbd3af235)
c
=II(c,d,a,b,M2,15,0x2ad7d2bb)
d
=II(b,c,d,a,M9,21,0xeb86d391)

    5)每輪循環後,將A,B,C,D分別加上a,b,c,d,然後進入下一循環。

MD5安全性:
    普遍認爲MD5是很安全,因爲暴力破解的時間是一般人無法接受的。實際上如果把用戶的密碼MD5處理後再存儲到數據庫,其實是很不安全的。因爲用戶的密碼是比較短的,而且很多用戶的密碼都使用生日,手機號碼,身份證號碼,電話號碼等等。或者使用常用的一些吉利的數字,或者某個英文單詞。如果我把常用的密碼先MD5處理,把數據存儲起來,然後再跟你的MD5結果匹配,這時我就有可能得到明文。比如某個MD5破解網站http://www.cmd5.com/default.aspx,我把其網站下的公告複製如下

本站針對md5等全球通用公開的加密算法進行反向查詢,建立了密文對應查詢數據庫,很多複雜密文只有本站纔可查詢,支持多種算法,實時查詢記錄超過24萬億條,共佔用160T硬盤,成功率95%以上,建站十年,國內外享有盛譽。 
本站對於md5、sha1、mysql、ntlm等的實時解密成功率在全球遙遙領先。成立10年,從未被超越。本站自行開發的程序,對於vb、dz、ipb、mssql等大量加密方式,實現了實時破解,這在全球也是唯一的。 
   你可以用你的生日,手機號碼去測試一下。
   我覺得只需要將上面我寫的MD5的標準幻數A,B,C,D的值修改一下,修改後也不是MD5算法了,因爲不能保證唯一性。這樣就算別人得到32位的值,他如果不知道幻數的值是無法還原明文的。就算得到了幻數,也是很難破解的。

發佈了35 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章