智慧保安后台管理-外网项目备份
zhongrj
2023-09-17 8853292babb2ad94de4a3207966f1e83b767cd2d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package org.springblade.modules.signature.util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.common.utils.HttpClientUtils;
 
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.*;
 
/**
 * sign 生成工具类
 * @author zhongrj
 * @since 2022-03-11
 */
public class SignUtil {
 
    private static Logger LOGGER = LoggerFactory.getLogger(SignUtil.class);
 
 
    /**
     * 获取签名sign
     * @param params 参数集合不含appSecret
     * @param secret 验证接口的appSecret
     * @return
     */
    public static String getSign(Map params,String secret)
    {
        String sign="";
        StringBuilder sb = new StringBuilder();
        //1. 先对请求参数排序
        Set<String> keyset=params.keySet();
        TreeSet<String> sortSet=new TreeSet<>();
        sortSet.addAll(keyset);
        Iterator<String> it=sortSet.iterator();
        //2. 把参数的key value链接起来 ,再把appSecret拼接参数字符串的最后面,得到要加密的字符串
        while(it.hasNext())
        {
            String key=it.next();
            String value=params.get(key).toString();
            sb.append(key).append(value);
        }
        sb.append(secret);
        byte[] md5Digest;
        try {
            //3. Md5加密
            md5Digest = getMD5Digest(sb.toString());
            //4.得到sign
            sign = byte2hex(md5Digest);
        } catch (IOException e) {
            LOGGER.error("生成签名错误",e);
        }
        // 5. 返回 sign
        return sign;
    }
 
 
    /**
     * 回调接口验证签名方法
     * @param request
     * @return
     */
    public static Boolean checkSign(HttpServletRequest request,String appSecret){
        Boolean flag= false;
        String sign = request.getParameter("sign");//签名
        if(StringUtils.isEmpty(sign)){
            return false;
        }
        //检查sign是否过期
        Enumeration<?> pNames =  request.getParameterNames();
        Map<String, String> params = new HashMap<>();
        while (pNames.hasMoreElements()) {
            String pName = (String) pNames.nextElement();
            if("sign".equals(pName)) {
                continue;
            }
            String pValue = request.getParameter(pName);
            params.put(pName, pValue);
        }
        if(sign.equals(getSign(params, appSecret))){
            flag = true;
        }
        return flag;
    }
 
    /**
     * MD5加密数据方法
     */
    private static byte[] getMD5Digest(String data) throws IOException {
        byte[] bytes = null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            bytes = md.digest(data.getBytes("UTF-8"));
        } catch (GeneralSecurityException gse) {
            throw new IOException(gse);
        }
        return bytes;
    }
 
    /**
     * MD5加密数据后的数据处理方法
     */
    private static String byte2hex(byte[] bytes) {
        StringBuilder sign = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                sign.append("0");
            }
            sign.append(hex.toUpperCase());
        }
        return sign.toString();
    }
 
 
 
    public static String utf8Encoding(String value, String sourceCharsetName) {
        try {
            return new String(value.getBytes(sourceCharsetName), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new IllegalArgumentException(e);
        }
    }
 
    /**
     测试方法
     */
    public static void main(String[] args)
    {
        //参数签名算法测试例子
        HashMap<String, String> signMap = new HashMap<String, String>();
        String appkey = "584561146";
        signMap.put("appKey",appkey);
 
//        System.out.println("得到签名sign1:"+getSign(signMap,"454sd5fa45dsa5fdaf54"));
        String sign = getSign(signMap, "454sd5fa45dsa5fdaf54");
        signMap.put("sign",sign);
        HttpClientUtils.postParams("http://localhost:81/attendance/AppSave", appkey, signMap);
    }
}