如何解决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;
    }


目录
相关文章
|
6月前
|
存储 缓存 算法
大文件 MD5 SHA 校验时间优化之路
【8月更文挑战第12天】处理大文件的MD5与SHA校验时,可通过选择高效算法实现、分块读取处理文件、利用多线程并行处理、采用硬件加速及缓存校验结果等方式优化校验时间。例如,使用性能良好的加密库如`pycryptodome`替代Python的标准`hashlib`库;分块读取文件并逐块计算哈希值,减少内存占用;利用多线程处理不同文件块;若条件允许,使用硬件加速如Intel AES-NI指令集;以及缓存重复校验的文件哈希值避免重算。这些策略可显著提高校验速度和系统效率。
366 1
|
8月前
|
存储 算法 安全
MD5哈希算法:原理、应用与安全性深入解析
MD5哈希算法:原理、应用与安全性深入解析
|
存储 算法 安全
【MD5】什么是MD5?md5的简要描述
【MD5】什么是MD5?md5的简要描述
306 0
|
算法 Unix Linux
MD5 生成文件校验
MD5 生成文件校验
149 0
|
C++
[C/C++]基础 %md,%0md是什么意思
[C/C++]基础 %md,%0md是什么意思
152 0
|
Windows
Windows系统下MD5,SHA1或者SHA256三种校验方式
Windows系统下MD5,SHA1或者SHA256三种校验方式
522 0
|
数据安全/隐私保护
【小工具】2. 需要对测试用的数据进行MD5加密
【小工具】2. 需要对测试用的数据进行MD5加密
|
算法 Serverless API
你怕是对MD5算法有误解
"MD5加密"纯属口嗨,MD5不是加密算法,是摘要算法。
你怕是对MD5算法有误解