引言
开发中经常涉及MD5(中文信息摘要、非对称性)的加密,用于确保信息传递过程中的完整一致性。它将数字、字母、汉字甚至是文件等解析为一串固定的字符值。场景有密码加密、接口参数加密、文件上传时判断文件是否重复等
MD5算法特点
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的
2、容易计算:原数据很容易生成MD5值
3、抗修改性:对原数据有任何的改动,生成的MD5值都不一样
4、强抗碰撞:不同原数据生成相同MD5值的概率极其小
实现上可以自定义生成MD5值方法,也可以使用封装好的生成MD5的方法库,例如Guava、commons.codec的DigestUtils、spring的工具类DigestUtils
Guava库生成md5
<!--guava依赖-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>
测试代码(这里对图片生成md5,常见的是字符串)
public static void getMd5ByGuava() throws Exception {
File file = new File("D:/测试图片.png");
String context = IOUtils.toString(new FileInputStream(file));
String md5 = Hashing.md5().newHasher().putString(context, Charsets.UTF_8).hash().toString();
System.out.println( md5);
}
commons-codec库生成md5
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
public static void getMd5ByDigestUtil() throws Exception {
try {
File file = new File("D:/测试图片.png");
String context = IOUtils.toString(new FileInputStream(file));
String md5 = DigestUtils.md5Hex(context);
System.out.println(md5);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
spring的工具类DigestUtils
DigestUtils类封装在spring-core包下
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.0</version>
</dependency>
String md5 = DigestUtils.md5DigestAsHex("sdfsds".getBytes());
注意
md5加密虽然是非对称性加密(有人认为md5不是严格意义上的加密,因为非对称性),但是利用彩虹表、碰撞法、穷举法等方式还有有可能对称解析的,故而md5一般会加上个盐值(salt)来增加md5加密的复杂性,如下
public void testMd5(){
String content = "MVB_467961616";
String salt = "q7er0et9u7oh1a6sdf5jlzv2zn4c.!@#$%^,./[]*&"; //salt值,增加破解难度
String md5Hex = DigestUtils.md5Hex(content+salt); //一般持久化存的值也是增加salt后进行md5后的值
}