java 按字母排序并MD5加密生成32位字符串

java 复制代码
package com.example.test;


import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Hashtable;
import java.util.TreeMap;


class SignService {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        Hashtable ht = new Hashtable();
        ht.put("biz", "{\"page_index\":\"1\",\"page_size\":\"100\",\"nicks\":[\"老来"]}");
        ht.put("charset", "utf-8");
        ht.put("app_key", "5b53060f2375643423056e84fa5a2d");
        ht.put("access_token", "d7b01bf084ghdgsf21ffd95f60");
        ht.put("timestamp", "153428407");
        ht.put("version", "2");

        String sign = getSign("99c4cef678545gfds975a7064de0b87", ht);
        System.out.println(sign);
    }


    static String getSign(String signKey, Hashtable param) throws NoSuchAlgorithmException {
        //使用TreeMap对Hashtable的键进行排序
        TreeMap<String, String> sortedMap = new TreeMap<>(param);

        String resultStr = "";

        for (String key : sortedMap.keySet()) {
            if (key != null && key != "" && key != "sign") {
                resultStr = resultStr + key + param.get(key);
            }
        }

        resultStr = signKey + resultStr;

        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] rstRes = md.digest(resultStr.getBytes(StandardCharsets.UTF_8));


        // 将字节数组转换为十六进制字符串
        StringBuilder hexString = new StringBuilder();
        for (byte b : rstRes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }

        // 返回32个字符长度的十六进制字符串
        return hexString.toString();

    }
}

需要把下面这一串信息 试用MD5算法 加密 然后转化成32

签名算法:

以执行店铺查询htps:/openahn,.cm/on/shps/qury为例,假如开发者的app_secret是e9c5ca3334534d0ef4a6d25,请求的参数如下:

app_key:5b53060f23d3453056e84fa5a2d

access token:d7b01bf345a9450e21ffd95f60

timestamp:163458407

version:0

charset:utf-8

sign:395f5a78b4756403a02491296c7

biz:{"page_index":"1","page_size":"100","niks":["豆腐干"]}

步骤:

1.将请求参数中除 sign 外的多个键值对,根据键按照字典序排序,并按照"key1value1key2value2..."的格式拼成一个字符串。请求参数拼接后的结果为:acces tokend7b01b0842a4746554fd95f60app key5b53060f452332d9703056e84fa5a2dbiz"page index:"1""pae sire": 100,"niks":["板"icharsetutf-8timestamp16391567407version21

2.将 app_secret 拼接在1中排序后的字符串前面得到待签名字符串:e9csca3fecb404b756864343bd0ef4a6d25aces tokend7b01bf04359450e21fd95f60app key$b53060f45323df9703056e84fa5a2dbizl page index."1"page size. 10"niks :"t"icharsetutf8timestamp166345407version21

3.使用 MD5 算法加密待加密字符串并转为32位小写即为 sign: 395f5a78b7865434ac03a02491296c74.将 sign 添加到请求参数中

注意:

1.对于biz这类复杂参数,不论value内部是否包含多个字段,均把value看作-个完整字符串来处理,不需要对内部字段进行拆分和排序,2.请求参数中有中文时,中文需要经过 ur 编码,但计算签名时不需要。3.计算 MD5 签名时,需要以 utf-8 的编码转换 byte 流,否则可能导致含中文参数的签名计算不正确

相关推荐
程序员-珍4 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
弱冠少年11 分钟前
websockets库使用(基于Python)
开发语言·python·numpy
仍有未知等待探索17 分钟前
Linux 传输层UDP
linux·运维·udp
zeruns80224 分钟前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
卑微求AC25 分钟前
(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
linux·c语言·开发语言·嵌入式·c语言贪吃蛇
2401_8572979131 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
技术无疆34 分钟前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
福大大架构师每日一题41 分钟前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
羊小猪~~43 分钟前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
Hugo_McQueen1 小时前
pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)
linux·服务器·网络安全