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导致的。

相关推荐
码路飞1 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing2 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven974 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德15 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆16 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌19 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊20 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang20 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang21 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解1 天前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端