一、简单介绍
因为加密要对应解密,而MD5是不可逆的,所以,严格来说,MD5不是加密算法,而是一种hash算法,准确的应该叫信息摘要算法。
Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
下文中将进行MD5加密的文件(字符串、文件等)称为明文,MD5加密结果称为密文。
二、代码实现
package com.xiaodajia.modules.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
/**
* 定义char数组,16进制对应的基本字符
*/
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
'e', 'f' };
/**
* md5加密
* @param str 需要加密的数据
* @return 加密结果
* @author sucb
* @date 2017年7月26日下午5:12:16
*/
public static String getMD5String(String str) {
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
messageDigest.update(str.getBytes());
return byteArray2HexString(messageDigest.digest());
}
/**
* MD5加密结果(由byte转换成String)
* @param bytes md5加密后得到的数组
* @return md5加密结果
* @author sucb
* @date 2017年7月26日下午5:12:09
*/
private static String byteArray2HexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(HEX_DIGITS[(b & 0xf0) >> 4]).append(HEX_DIGITS[(b & 0x0f)]);
}
return sb.toString();
}
/**
* 测试方法
* @param args
* @author sucb
* @date 2017年7月26日下午5:11:50
*/
public static void main(String[] args) {
System.out.println(getMD5String("123456"));
}
}
三、应用场景
1)、密码加密
MD5的不可逆,所以很多网站会把密码转换MD5再存储。 这样就算别人获得数据库的用户资料,也没有办法获知密码。加密规则可以由你自己确定,比如:你可以用MD5(MD5(用户名) + MD5(密码))来存储密码。
2)、拦截请求
在请求中加入某个密文,只有请求中存在这个密文时,才允许这个请求执行业务逻辑,没有这个密文的请求会被拦截下来。
3)、文件完整校验
一个文件,经过MD5加密后只会产生一个密文,如果文件遭到病毒破坏或者人为修改,密文就会不一样,这样我们就知道文件已经被修改了。
从上面应用场景可以知道,MD5其实是进行身份校验。
四、安全性
关于安全性,我查了点资料,大概是这样的。
1)、MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2^128,用每秒可试验1000000000个消息的计算机需时1.07×10^22年。若采用生日攻击法,寻找有相同Hash值的两个消息需要试验2^64个消息,用每秒可试验1000000000个消息的计算机需时585年。
2)、MD5加密是一种hash算法,输入任意一段明文,得到一个定长的唯一的密文(Hash值)。密文个数是一定的,明文个数为无穷多,MD5是一个无穷多对一的映射,多对一的函数是不可逆的。使用快速产生碰撞的算法,可以找到一个密文对应的明文来欺骗密码校验(注:该明文不一定是原来的明文)。
3)、要解密MD5没有现成的算法,可以用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。
4)、关于MD5的破解
2004年,王小云教授提出了非常高效的MD5碰撞方法。
2009年,冯登国、谢涛利用差分攻击,将MD5的碰撞算法复杂度进一步降低。
解密的代价远远大于解密带来的收益,就可以认为它是安全的。所以目前来说,MD5加密是比较安全的。
【MD5反向查询】
如果有写的不对的地方,请大家多多批评指正,非常感谢!