Java利用TreeMap实现参数排序签名或者加密

在java接口请求调用中,为了保证接口安全,常用的方法是对请求参数进行签名,签名算法一般:

1,请求参数中参入appId和token来进行认证,其中token生成由appId,appKey,请求时间,请求内容生成;

2,将appId,appkey,  请求参数内容,请求时间戳组成键值对

3,将键值对进行字符升序排序,可以使用TreeMap实现

4,参数名和参数值之间用=链接,参数之间用&连接,得到字符A

5,对字符串A进行SHA256算法hash,即生成token值

6,然后对参数值进行urlencode编码

7,参数名和参数之间用=连接,参数和参数之间用&连接,得到字符串B

8,把字符串B,追加到请求url后,进行请求

具体加密代码

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author yw
 * @title: SignUtil
 * @description:
 * @date 2024/10/10
 **/
public class SignUtil {
    public final static String SHA256 = "SHA-256";
    public static void main(String[] args) {
        TreeMap<String, String> treeMap = new TreeMap<>();
        long time = System.currentTimeMillis();
        System.out.println("The time:" + time);
        treeMap.put("appId", "15829");
        treeMap.put("appKey", "1q2wadl");
        treeMap.put("time",time+"");

        String query = buildQuery(treeMap);
        System.out.println("query:" + query);
        String token = sha256AsString(query);
        System.out.println("token:" + token);
    }

    public static String buildQuery(Map<String, String> params) {
        StringBuilder queryBuilder = new StringBuilder();

        for (Map.Entry<String, String> entry : params.entrySet()) {
            // 对参数名和参数值进行编码
            String encodedParam = urlEncode(entry.getKey());
            String encodedValue = urlEncode(entry.getValue());

            // 添加到查询字符串中
            if (queryBuilder.length() > 0) {
                queryBuilder.append("&");
            }
            queryBuilder.append(encodedParam)
                    .append("=")
                    .append(encodedValue);
        }

        return queryBuilder.toString();
    }

    private static String urlEncode(String params) {
        try {
            return URLEncoder.encode(params, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return params;
        }
    }

    public static String sha256AsString(String s) {
        return getSafeString(SHA256, s);
    }

    public static String getSafeString(String algorithm, String s) {
        try {
            return getAsString(algorithm, s.getBytes(StandardCharsets.UTF_8));
        } catch (Exception e) {
            return "";
        }
    }

    /**
     * 获取指定文本内容对应的MD5码
     * @param plain 文本内容
     * @return 文本内容对应的MD5码
     * @throws Exception 异常定义
     */
    public static String getAsString(String algorithm, byte[] plain) throws Exception {
        MessageDigest digest = MessageDigest.getInstance(algorithm);
        digest.update(plain);
        byte[] buffer = digest.digest();
        return toHexByteArray(buffer, 0, buffer.length);
    }

    /**
     * 将数组转换成十六进制字符串
     * @param b 数组
     * @param m 起始位置
     * @param n 个数
     * @return 转化后的十六进制字符串
     */
    private static String toHexByteArray(byte[] b, int m, int n) {
        String md5 = "";
        int k = m + n;

        if (k > b.length) {
            k = b.length;
        }

        for (int i = m; i < k; i++) {
            md5 += Integer.toHexString((b[i] & 0x000000FF) | 0xFFFFFF00).substring(6);
        }

        return md5.toLowerCase(Locale.getDefault());
    }
}

Java TreeMap可以按照value排序,可以通过实现Comparator接口来实现。具体步骤如下: 1. 创建一个实现Comparator接口的类,重写compare方法,比较两个value的大小。 2. 创建一个TreeMap对象,并将实现了Comparator接口的类作为参数传入。 3. 将需要排序的键值对添加到TreeMap中。 4. 使用entrySet()方法获取TreeMap中的所有键值对,并将其转换为List。 5. 使用Collections.sort()方法对List进行排序。 6. 遍历排序后的List,输出键值对。 示例代码如下: ``` import java.util.*; public class TreeMapSortByValue { public static void main(String[] args) { // 创建一个实现Comparator接口的类 ValueComparator vc = new ValueComparator(); // 创建一个TreeMap对象,并将实现了Comparator接口的类作为参数传入 TreeMap<String, Integer> map = new TreeMap<>(vc); // 将需要排序的键值对添加到TreeMap中 map.put("apple", 10); map.put("banana", 5); map.put("orange", 8); // 使用entrySet()方法获取TreeMap中的所有键值对,并将其转换为List List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); // 使用Collections.sort()方法对List进行排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getValue().compareTo(o2.getValue()); } }); // 遍历排序后的List,输出键值对 for (Map.Entry<String, Integer> entry : list) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } } // 实现Comparator接口的类 class ValueComparator implements Comparator<String> { Map<String, Integer> map = new HashMap<>(); public ValueComparator() {} public ValueComparator(Map<String, Integer> map) { this.map.putAll(map); } @Override public int compare(String s1, String s2) { if (map.get(s1) >= map.get(s2)) { return 1; } else { return -1; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值