如何解决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】什么是MD5?md5的简要描述
【MD5】什么是MD5?md5的简要描述
105 0
|
5月前
|
Java 数据安全/隐私保护 Spring
java实现MD5加密
java实现MD5加密
|
10月前
|
C++
[C/C++]基础 %md,%0md是什么意思
[C/C++]基础 %md,%0md是什么意思
79 0
|
存储 算法 安全
浅析MD5及其用途
简介 MD5(Message-Digest Algorithm,对应的中文名为消息摘要算法)是计算机安全领域广泛使用的散列函数(又称哈希算法、摘要算法),可以产生出一个128位(16字节)的散列值(hash value),主要用来确保信息(message)传输完整和一致。常见的应用场景有密码保护、下载文件校验等。
|
数据安全/隐私保护
【小工具】2. 需要对测试用的数据进行MD5加密
【小工具】2. 需要对测试用的数据进行MD5加密
|
算法 Serverless API
你怕是对MD5算法有误解
"MD5加密"纯属口嗨,MD5不是加密算法,是摘要算法。
你怕是对MD5算法有误解
|
安全
通过MD5校验游戏安装文件完整性实例演示,MD5校验工具Hash使用演示
通过MD5校验游戏安装文件完整性实例演示,MD5校验工具Hash使用演示
755 0
通过MD5校验游戏安装文件完整性实例演示,MD5校验工具Hash使用演示
|
存储 算法 安全
MD5加密原理解析及OC版原理实现
MD5加密原理解析及OC版原理实现
197 0
|
算法 C# 数据库
c#进行MD5加密方式和解密算法
原文:c#进行MD5加密方式和解密算法       --------------- 因为加密个解密都需要用到key所有在加密的后需要把key和加密码都存到数据库中   /// /// 唯一加密方式 /// /// /// ...
2833 0