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

相关推荐
小小啊python几秒前
IDEA中SpringBoot项目配置热部署
java·ide·intellij-idea·springboot·热部署
JavaPub-rodert7 分钟前
我把 OpenAI 协议塞进了 Go 工具库:go-commons 开始支持 AI 了
开发语言·人工智能·golang
caimouse7 分钟前
ReactOS 图形系统分析(23):引擎内存管理 — mem.c
c语言·开发语言
caimouse8 分钟前
ReactOS 图形系统分析(15):窗口对象 — EWNDOBJ(engwindow.c)
c语言·开发语言
青 春 记 忆11 分钟前
零基础入门python07:让程序记住数据——JSON文件和异常处理
开发语言·windows·python·json·python3.11
Java成神之路-24 分钟前
Spring AI Alibaba 实现多轮对话记忆:ChatMemory 与 Redis 持久化实战
java·springaialibaba
JAVA面经实录91727 分钟前
网络编程基础(Java Web/分布式前置·完整版)(十一)
java·前端·网络
W_3260033 分钟前
Python 常用标准 / 第三方库:random、tqdm、turtle、jieba 用法
开发语言·python
Escalating_xu40 分钟前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器
城管不管43 分钟前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试