MD5、盐值加密

本文探讨了MD5信息摘要算法的特点,包括压缩性、易计算性、抗修改性和抗碰撞性,以及其不可逆性。由于MD5的安全隐患,文章介绍了盐值加密作为增强安全性的方法,通过结合随机数与MD5生成更复杂的加密字符串,并展示了如何使用默认盐值和自定义盐值进行加密。最后,提到了BCryptPasswordEncoder的盐值加密和校验过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值