在很多電子商務和社區應用中,我們都要存放很多的客戶的資料,其中包括了很多的隱私信息和客戶不願被別人看到的信息,當然好有客戶執行各種操作的密碼,此時就需要對客戶的信息進行加密再存儲,目前有兩種比較好的加密算法:MD5和sha1。
這兩種加密算法都屬於散列加密技術。所謂散列加密就是無論輸入的字符串是什么,有多大,加密后都將變成唯一的定長的加密串。
首先介紹一下MD5,MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。Message-Digest泛指字節串(Message)的Hash變換,就是把一個任意長度的字節串變換成一定長的大整數。請注意是“字節串”而不是“字符串”,是因為這種變換只與字節的值有關,與字符集或編碼方式無關。MD5將任意長度的“字節串”變換成一個128bit的大整數,並且這是一個不可逆的變換過程,要破解只能窮舉,難度很大,理論上8位的密碼組合有(26字母+10數字+21常用英文符號)的8次方種可能,以現在比較好的機器機器要算上一年多。MD5加密后的密串長度有16位和32位兩種。不過最近MD5聽說被破解了(聽說還是被我們的國人破掉的,佩服啊!),能很快碰撞到密碼,不過破解機還沒有流傳出來。
MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數字簽名應用。
在Microsoft Visual Studio 2005對MD5加密算法有了很好的支持,使用起來非常簡單,下面是在C#中使用MD5加密字符串的例子:
public string md5(string str,int code)
{
if(code==16) //16位MD5加密(取32位加密的9~25字符)
{
return System.Web.Security.FormsAuthentication.
HashPasswordForStoringInConfigFile(str,"MD5").ToLower().Substring(8,16) ;
}
else//32位加密
{
return System.Web.Security.FormsAuthentication.
HashPasswordForStoringInConfigFile(str,"MD5").ToLower();
}
}
使用sha1算法加密后的密串長度有40位,相對更安全一些。
在Microsoft Visual Studio 2005對sha1的使用也很簡單,下面是在C#中使用sha1加密字符串的例子:
public string sha1(string str)
{
return System.Web.Security.FormsAuthentication.
HashPasswordForStoringInConfigFile(str, "sha1").ToLower();
}
不過最后還有一個不幸的消息,就是sha1算法已經被破解,國家標准和科技學院(National Institute of Standards and Technology)已經推薦使用sha-256或者sha-512算法。