MD5玩翻车了-0缺失

废话背景:

跟别人集成免密登录,用到了MD5加密,做好的数据偶尔行,偶尔不行,深刻怀疑别人代码有问题。(从不怀疑自己),理直气壮的找了别个对接人好几次。最后发现自己做的MD5位数不对,丢了数据。(尴尬啊,只好悄悄的说可以了,不解释,不道歉)

正文:

自己写的MD5加密,网上找到copy来的。

复制代码
    /**
     * md5加密,返回32位小写的结果
     * @param data 需要加密的数据
     * @return 32位小写的结果
     */
    public static String encrypt(String data) throws NoSuchAlgorithmException {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        StringBuilder result = new StringBuilder(32);
        byte[] digest = messageDigest.digest(data.getBytes());

        for (byte b : digest) {
            result.append(Integer.toHexString(b & 0xff));
        }
        return result.toString();
    }

加密内容,拼的时间戳和UUID,非常容易复现丢失精度的数据。

正确的md5用法

复制代码
import org.apache.commons.codec.digest.DigestUtils;

DigestUtils.md5Hex(md5String);

没错,用现成的,舒服。也可以用hutool的工具类来做,也舒服。

问题分析:

主要问题是这里不对

复制代码
        for (byte b : digest) {
            result.append(Integer.toHexString(b & 0xff));
        }

可以使用

复制代码
return Hex.encodeHexString(digest);

来替换这个for循环,就能解决问题了。

原因:十进制转换成为16进制的时候,个位数在转换时,只保留一位,没有补一个0导致的。

相关推荐
多云几多2 分钟前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
Jabes.yang2 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪2 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
执尺量北斗2 小时前
[特殊字符] 基于 Qt + OpenGL 实现的入门级打砖块游戏
开发语言·qt·游戏
夏子曦2 小时前
C#内存管理深度解析:从栈堆原理到高性能编程实践
开发语言·c#
兮动人2 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR222 小时前
Spring IOC(控制反转)中常用注解
java·spring
摇滚侠3 小时前
Spring Boot 3零基础教程,Demo小结,笔记04
java·spring boot·笔记
笨手笨脚の4 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式·行为型设计模式
spencer_tseng4 小时前
Eclipse 4.7 ADT (Android Development Tools For Eclipse)
android·java·eclipse