首先我们来认识一下什么是MD5。
MD5是一种数字摘要运算,什么是数字摘要呢?其实就是给我一个输入,给你一个固定格式的输出。
MD5经常用在哪些地方呢?
1.口令的摘要。我们在注册一个用户的时候,经常要输入密码(口令),其实在服务器数据库中保存的并不是你输入的密码(口令)本身,而是密码(口令)的md5,所以我们在验证登录成功的时候并不是比较密码本身,而是比较密码(口令)的md5值是否相等。由于md5是一个不可逆的运算(后面会提到),所以这也就是为什么很多系统的找回密码功能并不是告诉你你的密码本身是什么而是再让你输入一个新的密码(口令),就是因为md5运算不可逆,系统本身也无法根据md5值计算出明文。
2.数字签名。对于大多数用户来说,数字签名的应用可能遥远了一些。那么我提一个比较简单的例子,假设你是一个公司的老板,你现在在外面出差,这时候你想让财务给你打一笔钱,如果这时候你不方便打电话,那么在没有使用数字签名的时候,你通常会给财务发邮件或者发短信“小丽,给这个账户xxxxxxxxxxxxxxxxxxx上打10万。”那么小丽凭什么相信这句话是你的意思而不是别人仿冒你说的呢?所以数字签名就来了,这时只要老板用自己的私钥给这个信息的MD5值加密,并和信息本身一同发送给小丽,那么小丽就能将收到的消息拆分成明文和密文,用老板的公钥将密文解密,如果密文能打开,说明是老板授权的,接着比对密文解密后得到的信息的MD5和收到明文的MD5,如果相同就能证明信息在传输过程中没有被篡改。所以这样就能确保消息是老板指示的并且消息是正确完整的,可以打钱。
MD5有两种格式,一种是有16位16进制构成,一种是有32位16进制构成,而后者的格式更为常用。md5运算中每一种输入都能得到一个与之对应的摘要值,理论上来说就是有16^32种可能。也就是说假设有16^32+n个不同的字符串作为输入的话,是能够得到n个相同的结果的。这一点叫做碰撞,而我们国家的王小云,正是发现了md5的碰撞性,并且成功通过碰撞还原了原信息,因此在国际密码学界名声大噪。(注意:王小云并没有真正意义上破解md5)。
很多书本上包括百度百科都解释说md5具有抗强碰撞性和抗弱碰撞性,这么说的确是正确的,因为抗碰撞性并不是无碰撞性。抗碰撞性的意义是说出现碰撞的情况是非常困难的,而不是说找不到。md5从格式上来说有16^32个可能,这个数字是多少呢?是3.4028236692094 * (10^38) 这个数是非常巨大的,所以说找到一个碰撞很困难。
MD5理论上是不可破解的,为什么呢,因为md5底层是hash运算。hash运算实际上是明文到密文的不可逆映射。所以md5理论上也不可逆。如果真的破解了md5的话,那么就得先破解hash运算,如果连hash运算都被破解,那整个互联网就不再安全了。
==================咳咳,学的是这个专业,扯得有点多,回归正题===================
Java也提供了一套API来实现数字摘要(MessageDigest)
这个类在java.security.MessageDigest包下。
class Md5_Utils{
public static String getMD5Value(String str){
//定义一个加密字节数组
byte[] secretBytes = null;
try {
//创建运算是md5算法的数字摘要对象
MessageDigest md5 = MessageDigest.getInstance("md5");
/*
* 计算摘要:
* 这里计算的摘要,并不是最终结果,这只是计算后的数值。
* 这些数值中是带有正负的十进制,并且这些负数需要与256进行加法运算得到一个正值,
* 而且里的结果有的也是不满32位的,所以到下面还要进行填充0。
*/
secretBytes = md5.digest(str.getBytes());
} catch (Exception e) {
new Exception("没有MD5这个算法。").printStackTrace();
}
for (int i = 0; i < secretBytes.length; i++) {
System.out.println(secretBytes[i]);
}
//加密数组中的负数与256进行加法运算得到一个正值,并且整个数组转化为16进制
String value = new BigInteger(1, secretBytes).toString(16);
//md5性质:如果计算后不足32位前面补0
for (int i = 0; i < 32 - value.length(); i++) {
value = "0" + value;
}
return value;
}
}
前面说了一大堆,飒的一下把代码一贴。。。该说的都在注释里。。。