别再用所谓的MD5加密了,大佬们都用它——>MD5盐值加密多方法详解

举报
Code皮皮虾 发表于 2021/07/12 18:03:30 2021/07/12
【摘要】 别再用所谓的MD5加密了,大佬们都用它——>MD5盐值加密多方法详解

MD5简介

  • Message Digest algorithm 5 ,信息摘要算法
    • 压缩性:任意长度的数据,算出的MD5值长度都是固定的
    • 容易计算:从源数据计算出MD5值很容易
    • 抗修改性:对原数据进行任何改动(哪怕一个字节),所得到的MD5值都有很大的区别
    • 强抗碰撞:向找到两个不同的数据,使它们具有相同的MD5值,是非常困难的
    • 不可逆(除非暴力破解)

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盐值加密了==


MD5盐值加密介绍

  • ==加盐(防止MD5被暴力破解)==
    • 通过生成随机数与MD5生成字符串进行组合
    • 数据库同时存储MD5值和salt盐值.验证正确性时使用salt进行MD5即可

MD5盐值加密使用

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);

    }

可见,==在自定义盐值一样的情况下,加密结果是一样的==,所以我们进行校验的时候,可通过比较加密结果是否一样来判断,当然,前提是要知道盐值,所以我们在==保存密码到数据库时,也要把盐值保存进去方便校验==
在这里插入图片描述


使用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);
    }

在这里插入图片描述




看到这里相信大家都已经学会了MD5盐值加密方法,本篇博文也到此结束了,觉得不错的小伙伴可以一键三连哦!,感谢支持!!!



更多优质博文



【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。