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

相关推荐
天雪浪子4 分钟前
Python入门教程之逻辑运算符
开发语言·python
叫我阿柒啊15 分钟前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
落羽的落羽18 分钟前
【C++】特别的程序错误处理方式——异常机制
开发语言·c++
凯尔萨厮31 分钟前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质32 分钟前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散1333 分钟前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构
通达的K34 分钟前
Java实战项目演示代码及流的使用
java·开发语言·windows
David爱编程41 分钟前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
索迪迈科技44 分钟前
Protobuf 新版“调试表示为什么有链接?为什么会打码?我该怎么改代码?
java·log4j·apache