MD5加密返回32位密文字符串

前言:

项目中需要调用其他系统的 api 接口,接口使用的是按一定规则生成 MD5 密文作为签名来进行身份验证,本文仅记录 32 位 MD5 密文的生成方式,仅供参考。

什么是MD5 加密?

MD5 加密是一种加密算法,MD5 加密算法被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致,同时 MD5 加密是一种不可逆的加密算法,不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样加密算法处理,得到相同的密文被系统重新识别后,才能真正解密。

对方系统签名规则:

1、构造签名因子:将Headers除"sign"外的所有参数按key进行字!典升序排列。
2、构造签名因子:将第1步中排序后的参数(key=value)用&拼接起来。
2、对构造的签名因子执行md5_32位算法,sign=uppercase (md5_32(s))得到签名。

生成 MD5 签名规则的工具类:

@Slf4j
public class MD5Utils {

    /**
     * @Description: MD5 加密
     * @Date: 2024/4/3 13:38
     */
    public static String md5Encrypt(String plainText) {
        String cipherText;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(plainText.getBytes());
            byte[] bytes = md.digest();
            int i;
            StringBuilder buf = new StringBuilder();
            for (byte aByte : bytes) {
                i = aByte;
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            cipherText = buf.toString();
        } catch (NoSuchAlgorithmException e) {
            log.error("MD5 加密失败,失败原因:", e);
            throw new BusinessException("MD5 加密失败");
        }
        return cipherText;
    }


    /**
     * @Description: 排序并构造参数
     * @Date: 2024/4/3 13:57
     */
    public static String formatParam(Map<String, String> param) {
        String params;
        try {
            List<Map.Entry<String, String>> itmes = new ArrayList<>(param.entrySet());
            //对所有传入的参数按照字段名从小到大排序
            //Collections.sort(items); 默认正序
            //可通过实现Comparator接口的compare方法来完成自定义排序
            itmes.sort(Map.Entry.comparingByKey());
            /*Collections.sort(itmes, new Comparator<Map.Entry<String, String>>() {
                @Override
                public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                    return (o1.getKey().toString().compareTo(o2.getKey()));
                }
            });*/
            //构造key=value键值对的形式
            StringBuilder sb = new StringBuilder();
            for (Map.Entry<String, String> item : itmes) {
                if (StringUtils.isNotBlank(item.getKey())) {
                    sb.append(item.getKey()).append("=").append(item.getValue());
                    sb.append("&");
                }
            }
            params = sb.toString();
            if (!params.isEmpty()) {
                params = params.substring(0, params.length() - 1);
            }
        } catch (Exception e) {
            log.error("sign 签名构造失败,失败原因:", e);
            throw new BusinessException("sign 签名构造失败");
        }
        return params;
    }
}

如有错误的地方欢迎指出纠正。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MD5是一种不可逆的加密算法,即无法通过密文还原出原始的明文。MD5算法通过将输入的明文进行压缩计算,输出一个固定长度为16字节的密文。在Python中,可以使用hashlib库中的md5函数进行MD5加密的实现。以下是一个简单的Python代码示例: ``` from hashlib import md5 def encrypt_md5(s): # 创建md5对象 new_md5 = md5() # 对字符串进行编码并进行加密 new_md5.update(s.encode(encoding='utf-8')) # 返回加密后的密文 return new_md5.hexdigest() if __name__ == '__main__': # 调用示例函数进行加密 encrypted_text = encrypt_md5('000000') print(encrypted_text) ``` 以上代码中,首先导入了hashlib库中的md5函数。然后定义了一个名为encrypt_md5的函数,该函数接收一个字符串作为输入,并使用encode()函数对字符串进行编码后再进行加密。最后,使用hexdigest()函数获取加密后的密文,并将其打印输出。通过调用encrypt_md5函数并传入明文字符串作为参数,即可得到相应的MD5密文。需要注意的是,由于MD5算法是不可逆的,无法直接进行解密。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MD5 算法加密、撞库破解及Python实现和操作演示](https://blog.csdn.net/qq_40506723/article/details/124189145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值