MD5
Message Digest algorithm 5,信息摘要算法
特点
-
压缩性:任意长度的数据,算出的 MD5 值长度都是固定的;
-
容易计算:从原数据计算出 MD5 值很容易;
-
抗修改性:对原数据进行任何改动,哪怕只修改 1 个字节,所得到的 MD5 值都有很大区别;
-
强抗碰撞:想找到两个不同的数据,使它们具有相同的 MD5 值是非常困难的;
-
不可逆:
- 举一个最简单的例子:有一个作坊可以将面粉加工成面条,生意很火,有很多人都在那里加工面条,你将一袋面粉也送了过去,要求加工成面条,没过多久,作坊给你把加工好的面条拿了出来,你能判断出这个面条是用你的面粉加工的吗?
- 总结:由于 MD5 是一个消息摘要,它会损失原数据,所以我们不能通过最终打散的 MD5 值计算出的 MD5 值,来推断出原数据
总结
MD5 不能直接存储,容易被暴力破解,所以我们选择盐值加密
盐值加密
特点
- 通过生成随机数与MD5生成字符串进行组合
- 数据库同时存储MD5值与salt值。验证正确性时使用salt进行MD5即可
测试
@Test
public void testMd5() {
// 普通MD5:e10adc3949ba59abbe56e057f20f883e
String s = DigestUtils.md5Hex("123456");
System.out.println("普通MD5:" + s);
// 默认盐值加密:$1$mfFO0ZtW$XI6iWQ1H.sg9mwq0NSBgD.
// 加密方式:$1$+随机的8位字符
String md5Crypt = Md5Crypt.md5Crypt("123456".getBytes());
System.out.println("默认盐值加密:" + md5Crypt);
// 自定义盐值加密
String md5Crypt1 = Md5Crypt.md5Crypt("123456".getBytes(), "$1$1" + System.currentTimeMillis());
System.out.println("自定义盐值加密:" + md5Crypt1);
// yyds BCryptPasswordEncoder盐值加密:$2a$10$tsxedWVtV1SuaDIqUp4K2e8eK16dCq7DoNx.ovq7G3UTw44c.hyQe
// 方法内部融合了盐值
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encode = passwordEncoder.encode("123456");
System.out.println("BCryptPasswordEncoder盐值加密:" + encode);
boolean matchResult = passwordEncoder.matches("123456", "$2a$10$tsxedWVtV1SuaDIqUp4K2e8eK16dCq7DoNx.ovq7G3UTw44c.hyQe");
System.out.println("校验结果:" + matchResult);
}