如何解决MD5后只有31位的坑

简介: 如何解决MD5后只有31位的坑

引言


在和银行进行数据传输的时候, 签名采用了参数MD5的方式,具体做法参考我的博客《请求参数按照ASCII码从小到大排序后追加秘钥再进行加密得到签名值》


由于在和行内进行交互的时候,起作用的一些 接口并没有采用验签的环节,所以签名的问题也一直没有暴露 出来,最近要上一个新接口,需要用到签名,在进行批量测试的时候,有些数据签名验证失败,而大部分数据是可以验签成功的, 这让我一时半会有些不解啊,最后我对比成功和失败的签名发现,失败的签名竟然只有31位,而MD5 一般是16位或者32位,那么问题肯定是出现在工具类代码上。


原始代码,bug代码:

/**
     * 对字符串进行MD5加密
     *
     * @param str 需要加密的字符串
     * @return 小写MD5字符串 32位
     */
    static public String MD5(String str) {
        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
            digest.update(str.getBytes());
            return new BigInteger(1, digest.digest()).toString(16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }

上面代码有bug是因为,在转换成字符串的时候,如果首位是两个0,这会 只保留一位数,这就导致生成的MD5只有31位。


正确代码:

 public static String toMd5(String str) {
        String re = null;
        byte encrypt[];
        try {
            byte[] tem = str.getBytes();
            MessageDigest md5 = MessageDigest.getInstance("md5");
            md5.reset();
            md5.update(tem);
            encrypt = md5.digest();
            StringBuilder sb = new StringBuilder();
            for (byte t : encrypt) {
                String s = Integer.toHexString(t & 0xFF);
                if (s.length() == 1) {
                    s = "0" + s;
                }
                sb.append(s);
            }
            re = sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return re;
    }


目录
相关文章
西门子S7-1200程序状态监视,监视表格的使用方法,如何使用交叉引用列表
本篇我们来学习西门子S7-1200程序状态监视、监视表格、交叉引用的使用方法。
西门子S7-1200程序状态监视,监视表格的使用方法,如何使用交叉引用列表
|
前端开发 JavaScript 数据可视化
Vue项目打包完后如何自动上传至服务器
Vue项目打包完后如何自动上传至服务器
1387 0
Vue项目打包完后如何自动上传至服务器
|
机器学习/深度学习 JSON Linux
NSLog日志输出不全问题分析与解决方案
NSLog日志输出不全问题分析与解决方案
433 0
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
205 0
|
JavaScript
vue 打包后自动部署到云服务器——scp2教程
vue 打包后自动部署到云服务器——scp2教程
270 0
|
存储 Java
Java实现简易待办事项列表
Java实现简易待办事项列表
490 2
|
SQL 数据采集 JSON
MaxCompute中的JSON数据处理
MaxCompute中的JSON数据处理
3903 0
|
机器学习/深度学习 存储 弹性计算
阿里云服务器X86计算、ARM计算、GPU/FPGA/ASIC等架构区别及选择参考
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群之分,很多初次接触阿里云服务器的用户并不知道他们之间有何区别,本文来介绍一下阿里云服务器各个架构的特点及适用场景,以供大家了解他们之间的区别,从而对选择哪种架构做一个参考。
1796 2
阿里云服务器X86计算、ARM计算、GPU/FPGA/ASIC等架构区别及选择参考
|
关系型数据库 MySQL Shell
4.5 sqlmap注入获取webshell及系统权限研究
4.5 sqlmap注入获取webshell及系统权限研究
1140 0
|
关系型数据库 MySQL 数据库
MySQL 绿色版安装说明
MySQL 绿色版安装说明
289 0