md5概述與應用

md5是一種公開的不可逆算法。而不是一種加密算法(雖然其常被用來加密數據)。md5允許對小到一個字符,大到數G的文件進行運算。並得出一個唯一的由32位字符組成的值。其重碼率小到只存在理論可能。

          一、md5是否可以被破解

         md5常被用於加密,或爲數據進行安全認證。所以是否可以被破解一直被受討論。

         首先,md5是不可逆算法,所以靠逆運算破解是不可能的,甚至不存在理論可能性。而如果進行窮舉法破解,在無提示的情況下,需要數百年,因此只存在理論可能性。因此md5算法本身不可破解,只要應用合理,是決對安全的。

        關於md5被破解的報道,在論壇中常有關於md5被破解的報道。這裏要弄清,有些人聲稱掌握了md5算法。那我只能恭喜這些人,因爲md5算法是公開的,所以知道md5的運算規則只能說明你掌握了一門知識,是值得恭喜的。

        再一種情況是有人聲稱打開了經md5加密的文章。我很好奇,後來一打聽,才知道他用他女友的生日,打開了他女友的日誌。然後說自已破解了md5算法。我只能以“...”迴應。因爲他不是破解了md5,而是猜出了他女友使用的密碼,在知道密碼的情況下,當然是能打開的,別說是md5,就算是任何加密方法都沒用。

       網上有一些專門破解md5的論壇和個人,而且有些是收費的。那麼他們是如何破解的呢?

       他們使用的是窮舉法,也就是我們俗稱的暴破。你會問:你不是說了嗎?用窮舉法存md5要上百年。事實上如果密碼很簡單就可以暴破,比如,密碼是6位數字,那隻要用程序從000000~999999都試一遍就試出來了。這樣的運算量計算機還是可以很快完成的。但是純數字密碼每增加1位運算量增加10倍。如果是英文和數字混排而且還有大小寫區分。則每增加1位運算量增加62倍。這回明白有些網站要求密碼是英文和數字混排了吧。

        二、md5的應用

       1.數據加密

       這幾乎是最爲人常用的用途。將用戶設置的密碼進行md5運算後存入數據庫。當用戶登錄時,只需再求一次md5值,並與數據庫中的值進行比對。判斷密碼是否正確就知道用戶的合法性了。因爲md5不可逆,所以即使數據庫被突破或下載,也不可能知道用戶密碼。而這樣帶來的問題就是用戶也不能找回密碼,而只能在達成一定的條件後讓用戶重置密碼。這就是爲什麼現在越來越多的網站不能找回密碼,而只能重置密碼。因爲多數使用了不可逆算法(此處不只md5,也包括其它不可逆算法的應用).
        c#

        c#實例,用戶註冊與登錄時的密碼校驗:
       

        註冊時,假設用戶在名爲password的文本框中設置了密碼,我們做如下運算:
       password.Text=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,"MD5");//

       password.Text=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,"MD5");//對設置的密碼求md5值,然後將這個值傳入數據庫存起來,就行了。

        當用戶登錄時,同樣假設用戶在名爲password的文本框中設置了密碼,只需再做如下運算

       password.Text=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,"MD5");//將這個值送入數據庫進行比對,就知道登錄時輸入的密碼和註冊時輸入的密碼是否一樣了

        2.數據校驗

        因爲md5的重碼率低到只存在理論可能,因此常被用來校驗數據是否被篡改。我們常見的,一些下載網站會給出文件的md5值,以供用戶在下載後校驗,因爲即使在下載過程中,只改動了一個字節,其md5值也會改變。

        c#實例,求文件的md5

        string filename="c:\\aa.text";//文件路徑

        System.IO.FileStream fs = newSystem.IO.FileStream(filename, System.IO.FileMode.Open,System.IO.FileAccess.Read);//打開文件

        System.Security.Cryptography.HashAlgorithm md5 =System.Security.Cryptography.MD5.Create();

        filemd5 =BitConverter.ToString(md5.ComputeHash(fs)).Replace("-","");//md5值並轉爲32位字符串,這就是文件的md5值,也被稱爲文件指紋

        3.通訊安全

        通訊安全,是對數據校驗的一種升級應用。因爲md5算法是公開的,所以是兼容所有語言和系統,同一個數據,不同語言和不同系統求出來的值是一樣的。所以可以應用此進行數據安全校驗,防止數據在通訊中被僞造和篡改。比如網站引用支付寶的支付接口,那麼網站和支付寶之間的通訊就是經過md5安全校驗的。如果將md5應用到通訊安全則要在求算md5前設置一密鑰,這個密鑰只有你和支付寶知道。別人在不知道密鑰的情況下是不可能僞造或篡改你發到支付寶的數據的。

        c#實例,將登錄後的用戶名,存在cookie中並用md5防止被篡改和僞造:
       

        我們假設用戶名爲"sa",我們將這個值存在cookie"userid"字段上。

        我們設置一個密鑰爲"abc",這個密鑰可以是任何字符串,只要自已知道就行了代碼如下:

        當用戶登錄成功後,我們用如下代碼設置cookie
        string key="abc";//

        string key="abc";//設置密鑰爲"abc"
       System.Web.HttpContext.Current.Response.Cookies["userid"]="sa";//

       System.Web.HttpContext.Current.Response.Cookies["userid"]="sa";//將用戶名"sa"設置在cookie"userid"字段上

        stringmd5=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("sa"+key,"MD5");//將用戶名與密鑰一起求出md5

       System.Web.HttpContext.Current.Response.Cookies["userid_md5"]=md5;//md5值存在cookie"userid_md5"字段上

        //以上完成了用戶名的設置,注意千萬別把密鑰也設置進cookie裏,那樣用戶就能看見密鑰了

   

       當用戶進行操作時,我們從cookie中讀取用戶名時先進行一次校驗,以防止被僞造或篡改

       string key="abc";//密鑰爲"abc",保存時用的密鑰與讀取時用的密鑰必需要同

       stringuserid=System.Web.HttpContext.Current.Request.Cookies["userid"];//cookie中取出登錄的id
       string md5=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(userid+key,"MD5");//

       string md5=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(userid+key,"MD5");//求這個ID與密鑰的md5

       //如果兩次md5值不相等,則代表用戶名被篡改

      if(md5!=(string)System.Web.HttpContext.Current.Request.Cookies["userid_md5"])

      {

           System.Web.HttpContext.Current.Response.Clear();

          System.Web.HttpContext.Current.Response.Write("MD5校驗失敗,您可能須要重新登錄");
          System.Web.HttpContext.Current.Response.End();
      }
      //

          System.Web.HttpContext.Current.Response.End();

      }

      //經過以上的檢驗如果登錄名被修改,則會校驗失敗,這樣可以防止通過僞造用戶名登錄

     一些安全性要求高的網站,不止有自已的類似md5那樣的不可逆算法,甚至每個用戶使用的密鑰都不一樣.

 

轉自:http://blog.csdn.net/mniwc/article/details/7233706

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章