java实现md5签名算法

作者: java 发布时间: 2022-10-17 浏览: 1060 次 编辑

签名计算过程如下:

1.将请求头公共参数appkey、nonce、timestamp参数名和参数值进行拼接;
2.拼接业务入参Json格式字符串;
3.拼接链多多系统颁发的授权秘钥secret,组成签名计算的字符串;
4.最后MD5计算出32位大写字符串为最终签名

appkey=test
secret=123456
nonce=e38bcb56-7a6f-4452-bd07-34dcb74a042f
timestamp=1626261718511
业务入参:{"code":"123456"}
   package com.zhoubian.web.controller.tool;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;

public class MD5Util {
    /**
     * 签名
     *
     * @param headers
     *            头信息
     * @param body
     *            body
     * @param secret
     *            secret
     * @return 签名后的串
     */
    public static String sign(Map<String, String> headers, String body, String secret) {

        StringBuilder signBefore = new StringBuilder();
        // step1:先对请求参数排序
        TreeSet<String> sortSet = new TreeSet<>(headers.keySet());
        for (String key : sortSet) {
            String value = headers.get(key);
            signBefore.append(key).append(value);
        }
        signBefore.append(body).append(secret);
        String sign = SecureUtil.md5(signBefore.toString());
        log.info("签名前的字符串:{}", signBefore);
        log.info("签名后的字符串:{}", sign);
        return sign;
    }

    public static void main(String[] args) {
        String body = "{\"code\":\"123456\"}";
        HashMap<String, String> headers = new HashMap<>();
        headers.put("appkey", "test");
        headers.put("nonce", "e38bcb56-7a6f-4452-bd07-34dcb74a042f");
        headers.put("timestamp", "1626261718511");
        String sign = sign(headers, body, "123456");
        System.out.println(sign.toUpperCase()); // 结果 :03A000676EEC1C4A706535FDA39DB0D7
    }
}