「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
1、MD5简介
- Message Digest algorithm 5 ,信息摘要算法
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的
- 容易计算:从源数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动(哪怕一个字节),所得到的MD5值都有很大的区别
- 强抗碰撞:向找到两个不同的数据,使它们具有相同的MD5值,是非常困难的
- 不可逆(除非暴力激活成功教程)
2、MD5加密使用
可使用Apache的一个MD5加密工具DigestUtils进行加密,具体操作如下:
@Test
void test(){
String s1 = DigestUtils.md5Hex("123456");
String s2 = DigestUtils.md5Hex("123456");
String s3 = DigestUtils.md5Hex("123456 ");
String s4 = DigestUtils.md5Hex(" 123456");
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
}
使用MD5加密,每个数据都有对应的值,这样其实是非常危险的,而且就现在而言MD5加密早就可以不称之为加密了,网上有着非常多的MD5解密工具 我们随便进入一个测试 实际开发中最好不要使用MD5加密方法,既然不使用,那么用什么呢,这就要提到==MD5盐值加密了==
3、MD5盐值加密介绍
- ==加盐(防止MD5被暴力激活成功教程)==
- 通过生成随机数与MD5生成字符串进行组合
- 数据库同时存储MD5值和salt盐值.验证正确性时使用salt进行MD5即可
4、MD5盐值加密使用
4.1、Md5Crypt加密
==Md5Crypt可以自定义盐值加密也可以使用默认的盐值加密==
==1、默认盐值加密==
@Test
void test(){
String s1 = Md5Crypt.md5Crypt("123456".getBytes());
String s2 = Md5Crypt.md5Crypt("123456".getBytes());
String s3 = Md5Crypt.md5Crypt("123456".getBytes());
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
我们来看看里面到底是怎么实现的 可见,他默认给的盐值是$1$ 加上一个随机的8位数,这样的话就不好验证了,所以最好使用自定义盐值加密
==2、自定义盐值加密==
@Test
void test(){
//前缀后面跟上几位字符
String s1 = Md5Crypt.md5Crypt("123456".getBytes(),"$1$22222222");
String s2 = Md5Crypt.md5Crypt("123456".getBytes(),"$1$22222222");
String s3 = Md5Crypt.md5Crypt("123456".getBytes(),"$1$22222222");
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
可见,==在自定义盐值一样的情况下,加密结果是一样的==,所以我们进行校验的时候,可通过比较加密结果是否一样来判断,当然,前提是要知道盐值,所以我们在==保存密码到数据库时,也要把盐值保存进去方便校验==
4.2、使用spring提供的工具 BCryptPasswordEncoder(推荐)
需要导入以下依赖
<!--Spring Security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
这时我们就可以使用spring提供的工具 BCryptPasswordEncoder来进行MD5盐值加密,具体方法如下:
@Test
void contextLoads() throws FileNotFoundException {
//new一个 BCryptPasswordEncoder
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//调用encode方法进行加密,传入我们需要加密的数据
String encode1 = passwordEncoder.encode("123456");
String encode2 = passwordEncoder.encode("123456");
System.out.println(encode1);
System.out.println(encode2);
}
加密结果如下 可以看见,尽管加密数据为同一个,但是加密结果却不同,可能会有小伙伴问了,加密结果都不同,那到时候校验时不是完蛋了嘛
不要着急,接着往下看,既然人家提供了这个工具,那肯定是考虑周全了的,这不可以使用matches方法进行校验
话不多说,咱们上代码
@Test
void contextLoads() throws FileNotFoundException {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
/** * $2a$10$dGhEGYydqI9sOGdslizdmuUKliBsyHdVhON0WVppVRoa5wRHe2SEO * $2a$10$h2PlE5DbDfiClGDw2jGJm.Dp9zNVqOHPADwScJQCDbvG/lzeKOxO6 */
boolean test1 = passwordEncoder.matches("123456", "$2a$10$dGhEGYydqI9sOGdslizdmuUKliBsyHdVhON0WVppVRoa5wRHe2SEO");
boolean test2 = passwordEncoder.matches("123456", "$2a$10$h2PlE5DbDfiClGDw2jGJm.Dp9zNVqOHPADwScJQCDbvG/lzeKOxO6");
System.out.println(test1);
System.out.println(test2);
}
最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以==一键三连哦!==,感谢支持,我们下次再见~~~
分享大纲
今天的文章别再用简单版MD5加密了,大佬们都这么是使用——>MD5盐值加密多方法详解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/18812.html