最近在准备毕业设计的用户管理模块式时在考虑用户密码的加密方式,一个web系统用户资料的密码如果存储明文绝对是愚蠢的。采用MD5加密后存储密文,用户登录验证时把用户密码再次加密,如果与原密文相符合则通过,否则拒绝。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述, 也无法将一个MD5的值变换回原始的字符串,从理论上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。MD5的典型应用是对一段Message产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内 容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的, 用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。以下是我的实现过程已经试验通过
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
publicclass md5 {
public String MD5psw;
public void tomd5code(String plainText) {
try {
MessageDigest md =MessageDigest.getInstance("MD5");//使用MD5加密
md.update(plainText.getBytes()); //string.getBytes()用来获取字节编码
byte b[] = md.digest(); //进行哈希计算
int i;
//重新整理字节码产生32位字符串
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset <b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
MD5psw = buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static void main(String agrs[]) {
md5 MD5 = new md5();
String psw="12345678";
MD5.tomd5code(psw);
System.out.println("mimashi: "+MD5.MD5psw);
}
}
另外有事用户会设置如451286这种比较短且纯数字的密码,这种加密后很容易被解密。我们可以使用MD5加密产生32位字符串后再加密一次,这种加密两次的方法简单且有效。其实MD5的解密不是逆向算出来的,一般是对撞。举例:某个网站宣称可以加密解密MD5密码,网友A输入888888查询后产生那个了MD5密文,于是密文和888888成为一对网站的记录,某B同学获得一密文输入网站,网站发现改密文与888888对应的密文一致,于是宣称破解了了改密文,明码是888888。
这是我的第一篇博客欢迎大家指正我的错误。
(文中MD5的介绍来自http://www.iplaysoft.com/encrypt-arithmetic.html)