在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加密算法: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算法。