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

相关推荐
baivfhpwxf20236 分钟前
用TCP服务端向多个客户端分发图片,客户端接收并处理图片,再将处理结果返回给服务端
服务器·开发语言·网络·tcp/ip·c#
资深web全栈开发7 分钟前
Golang Cobra 教程:构建强大的CLI应用
开发语言·后端·golang
u***27617 分钟前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
J***793916 分钟前
Python在机器学习中的数据处理
开发语言·python·机器学习
子不语18021 分钟前
Matlab(一)——绘图
开发语言·matlab
222you22 分钟前
MyBatis-Plus当中BaseMapper接口的增删查改操作
java·开发语言·mybatis
纪莫1 小时前
技术面:MySQL(一条SQL在MySQL的执行过程?、MyISAM和InnoDB的区别?数据库事务机制?)
java·数据库·java面试⑧股
闲人编程1 小时前
Python协程的演进:从yield到async/await的完整历史
java·前端·python·async·yield·await·codecapsule
q***92511 小时前
PHP操作redis
开发语言·redis·php
帅中的小灰灰1 小时前
C++编程建造器设计模式
java·c++·设计模式