• 关于加密---BCrypt和MD5


    目录

    1.MD5

    1.1MD5不安全的原因:MD5不安全的3个原因

    1.2解决MD5不安全的方法:解决MD5不安全的方法

    1.3细说解决MD5不安全的方法---加盐

    1.3.1在项目中添加依赖

    1.3.2在项目路径下创建一个tools包,在这个包中新建类

    2.BCrypt

    2.1BCrypt是如何加密的

    2.1.1项目中添加依赖

    2.1.2在springboot启动类中添加如下代码

    2.1.3在项目路径下创建一个tools包,在这个包中新建类

     3.对于这两种加密方式的对比和总结


    1.MD5

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆.但是虽然不可逆,但是不是说就是安全的。因为自从出现彩虹表后,这样的密码也"不安全"

    彩虹表:彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码。越是复杂的密码,需要的彩虹表就越大,现在主流的彩虹表都是100G以上

    1.1MD5不安全的原因:MD5不安全的3个原因

    1.2解决MD5不安全的方法:解决MD5不安全的方法

    1.3细说解决MD5不安全的方法---加盐

    (盐是在每个密码中加入一些单词来变成一个新的密码,存入数据库当中)

    1.3.1在项目中添加依赖

    1. <dependency>
    2.   <groupId>commons-codecgroupId>
    3.   <artifactId>commons-codecartifactId>
    4. dependency>
    5. <dependency>
    6.   <groupId>org.apache.commonsgroupId>
    7.   <artifactId>commons-lang3artifactId>
    8.   <version>3.9version>
    9. dependency>

    1.3.2在项目路径下创建一个tools包,在这个包中新建类

    这个路径是这样的:com.example.anitamusicspace.tools,我的这个项目叫anitamusicspace

    1. package com.example.anitamusicspace.tools;
    2. import org.apache.commons.codec.digest.DigestUtils;
    3. /**
    4. * Created with IntelliJ IDEA.
    5. * Description:
    6. * User: 小梅就是酱子
    7. * Date: 2022-08-02
    8. * Time: 15:28
    9. */
    10. public class MD5Util {
    11. //定义一个固定的盐值
    12. private static final String salt = "1b2i3t4e";
    13. public static String md5(String src) {
    14. return DigestUtils.md5Hex(src);
    15. }
    16. /**第一种方法
    17. * 第一次加密 :模拟前端自己加密,然后传到后端
    18. * @param inputPass
    19. * @return
    20. */
    21. public static String inputPassToFormPass(String inputPass) {
    22. String str = ""+salt.charAt(1)+salt.charAt(3) + inputPass +salt.charAt(5) + salt.charAt(6);
    23. return md5(str);
    24. }
    25. /**第一种方法
    26. * 第2次MD5加密
    27. * @param formPass 前端加密过的密码,传给后端进行第2次加密
    28. * @param salt 用户数据库当中的盐值
    29. * @return
    30. */
    31. public static String formPassToDBPass(String formPass, String salt) {
    32. String str = ""+salt.charAt(0)+salt.charAt(2) + formPass +salt.charAt(5) + salt.charAt(4);
    33. return md5(str);
    34. }
    35. /**第二种方法
    36. * 上面两个函数合到一起进行调用
    37. * @param inputPass
    38. * @param saltDB
    39. * @return
    40. */
    41. public static String inputPassToDbPass(String inputPass, String saltDB) {
    42. String formPass = inputPassToFormPass(inputPass);
    43. String dbPass = formPassToDBPass(formPass, saltDB);
    44. return dbPass;
    45. }
    46. public static void main(String[] args) {
    47. System.out.println("对用户输入密码进行第1次加密:"+inputPassToFormPass("123456"));
    48. System.out.println("对用户输入密码进行第2次加密:"+formPassToDBPass(inputPassToFormPass("123456"), "1b2i3t4e"));
    49. System.out.println("对用户输入密码进行第2次加密:"+inputPassToDbPass("123456", "1b2i3t4e"));
    50. }
    51. }

    输出结果:

    注:因为这里没有用随机盐值,所以不管运行多少次,这个密码是规定的。当密码长度很大,盐值也是随机的情况下,密码的强度也加大了。破解成本也增加了

     

    2.BCrypt

    Bcrypt就是一款加密工具,可以比较方便地实现数据的加密工作。你也可以简单理解为它内部自己实现了随机加盐处理 

    2.1BCrypt是如何加密的

    2.1.1项目中添加依赖

    1. <dependency>
    2.   <groupId>org.springframework.securitygroupId>
    3.   <artifactId>spring-security-webartifactId>
    4. dependency>
    5. <dependency>
    6.   <groupId>org.springframework.securitygroupId>
    7.   <artifactId>spring-security-configartifactId>
    8. dependency>

    2.1.2在springboot启动类中添加如下代码

    @SpringBootApplication(exclude ={org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})

    2.1.3在项目路径下创建一个tools包,在这个包中新建类

    这个路径是这样的:com.example.anitamusicspace.tools,我的这个项目叫anitamusicspace

    1. package com.example.anitamusicspace.tools;
    2. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    3. /**
    4. * Created with IntelliJ IDEA.
    5. * Description:
    6. * User: 小梅就是酱子
    7. * Date: 2022-08-02
    8. * Time: 16:06
    9. */
    10. public class BCryptTest {
    11. public static void main(String[] args) {
    12. //模拟从前端获得的密码
    13. String password = "123456";
    14. BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
    15. String newPassword = bCryptPasswordEncoder.encode(password);
    16. System.out.println("加密的密码为: "+newPassword);
    17. //使用matches方法进行密码的校验
    18. boolean same_password_result = bCryptPasswordEncoder.matches(password,newPassword);
    19. //返回true
    20. System.out.println("加密的密码和正确密码对比结果: "+same_password_result);
    21. boolean other_password_result = bCryptPasswordEncoder.matches("987654",newPassword);
    22. //返回false
    23. System.out.println("加密的密码和错误的密码对比结果: " + other_password_result);
    24. }
    25. }

    解释:

     

    输出结果:(可以看到,同一个密码,每次加密后都不一样)

     3.对于这两种加密方式的对比和总结

    (1)BCrypt加密: 一种加盐的单向Hash,不可逆的加密算法,同一种明文(plaintext),每次加密后的密文都不一样,而且不可反向破解生成明文,破解难度很大。

    (2)MD5加密: 是不加盐的单向Hash,不可逆的加密算法,同一个密码经过hash的时候生成的是同一个hash值,在大多数的情况下,有些经过md5加密的方法将会被破解。

    (3)Bcrypt生成的密文是60位的。而MD5的是32位的。

    (4)目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全(因为破解难度更大了),但加密更慢。 虽然BCrupt也是输入的字符串+盐,但是与MD5+盐的主要区别是:每次加的盐不同,导致每次生成的结果也不相同。两种加密方式无法对比

    (5)BCrypt的破解增加了,就会导致系统的运行成本也增加

    (6)最后需要知道的是,密码学的应用安全是建立在破解所要付出的成本远超过能得到的利益上的

     

  • 相关阅读:
    Oracle生成AWR报告
    文件系统(七):文件系统崩溃一致性、方法、原理与局限
    获得New Bing资格后,在Ubuntu环境下使用New Bing
    使用TortoiseGit建立本地仓库,上传初版工程
    三、python Django ORM操作数据库[命令、postgresql操作]
    C语言好好题(一维数组)
    伯俊ERP与金蝶云星空对接集成表头表体组合查询连通分布式调出单新增(调拨出库对接分布式调出(KD调拨)6月)
    雅思核心词拾遗01----Politics + Culture
    Express的基本使用app.post()app.get()res.send()
    window环境下Redis7服务器的安装和运行
  • 原文地址:https://blog.csdn.net/m0_58157267/article/details/126335183