接口签名工具类

  1 import com.alibaba.fastjson.JSON;
  2 import com.alibaba.fastjson.serializer.SerializerFeature;
  3 import org.springframework.util.StringUtils;
  4
  5 import java.security.MessageDigest;
  6 import java.util.HashMap;
  7 import java.util.Map;
  8
  9 /**
 10  * 签名工具
 11  *
 12  * @Author: syj
 13  * @CreateDate: 2018/7/20 17:32
 14  */
 15 public class SignUtil {
 16
 17     /**
 18      * APP密码
 19      */
 20     private static final String QMALLL_LOGIN_APPSECRET = "DkkGmp3PdhwEp6I8";
 21
 22     /**
 23      * 校验签名
 24      *
 25      * @param curTime     时间戳
 26      * @param requestBody 请求参数
 27      * @param md5         请求参数的md5值
 28      * @param checkSum    校验和(将appsecret、请求参数md5值和时间戳采用sha1加密)
 29      * @return
 30      */
 31     private boolean doCheck(String curTime, String requestBody, String md5, String checkSum) {
 32         if (StringUtils.isEmpty(md5) || StringUtils.isEmpty(checkSum)) {
 33             return false;
 34         }
 35         String verifyMD5 = SignUtil.md5(requestBody);
 36         String verifyChecksum = SignUtil.checkSum(QMALLL_LOGIN_APPSECRET, verifyMD5, curTime);
 37         return md5.equals(verifyMD5) && checkSum.equals(verifyChecksum) ? true : false;
 38     }
 39
 40     /**
 41      * 计算并获取CheckSum
 42      * 使用sha1加密
 43      *
 44      * @param appSecret
 45      * @param nonce
 46      * @param curTime
 47      * @return
 48      */
 49     public static String checkSum(String appSecret, String nonce, String curTime) {
 50         return encode("sha1", appSecret + nonce + curTime);
 51     }
 52
 53     /**
 54      * 计算并获取md5值
 55      *
 56      * @param requestBody
 57      * @return
 58      */
 59     public static String md5(String requestBody) {
 60         return encode("md5", requestBody);
 61     }
 62
 63     public static String encode(String algorithm, String value) {
 64         if (value == null) {
 65             return null;
 66         }
 67         try {
 68             MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
 69             messageDigest.update(value.getBytes());
 70             return getFormattedText(messageDigest.digest());
 71         } catch (Exception e) {
 72             throw new RuntimeException(e);
 73         }
 74     }
 75
 76     /**
 77      * 把密文转换成十六进制的字符串形式
 78      *
 79      * @param bytes
 80      * @return
 81      */
 82     private static String getFormattedText(byte[] bytes) {
 83         int len = bytes.length;
 84         StringBuilder buf = new StringBuilder(len * 2);
 85         for (int j = 0; j < len; j++) {
 86             buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
 87             buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
 88         }
 89         return buf.toString();
 90     }
 91
 92     private static final char[] HEX_DIGITS = {‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘};
 93
 94     /**
 95      * 签名测试
 96      */
 97     private static void signTest() {
 98         // 请求时间戳
 99         String curTime = String.valueOf(System.currentTimeMillis());
100
101         // 模拟请求入参
102         Map<String, Object> map = new HashMap<>();
103         map.put("userName", "admin");
104         map.put("password", "123456");
105         map.put("applicationId", 1L);
106         map.put("otherNickName", "系统管理员");
107         map.put("phone", "15801081566");
108         map.put("verificationCode", "123456");
109         map.put("responseType", "1");
110         map.put("osType", "ios");
111         map.put("mac", "123456789");
112         // 转成json并按字典排序(注意版本:本人使用的fastjson版本为1.2.47)
113         String requestBody = JSON.toJSONString(map, SerializerFeature.MapSortField);
114
115         // 对请求入参使用md5加密
116         String md5 = SignUtil.md5(requestBody);
117
118         // 使用sha1加密
119         String checkSum = SignUtil.checkSum(QMALLL_LOGIN_APPSECRET, md5, curTime);
120
121         //  校验
122         signTest(curTime, requestBody, md5, checkSum);
123     }
124
125     /**
126      * 加密测试
127      */
128     private static void md5Test(String data) {
129         String sha1 = SignUtil.encode("sha1", data);
130         String md5 = SignUtil.encode("md5", data);
131         System.out.println("sha1密文:" + sha1);
132         System.out.println("md5密文:" + md5);
133     }
134
135     /**
136      * 测试签名
137      *
138      * @param curTime     时间戳
139      * @param requestBody 请求参数
140      * @param md5         请求参数的md5值
141      * @param checkSum    校验和(将appsecret、请求参数md5值和时间戳采用sha1加密)
142      * @return
143      */
144     public static boolean signTest(String curTime, String requestBody, String md5, String checkSum) {
145         System.out.println("入参:curTime=" + curTime);
146         System.out.println("入参:requestBody=" + requestBody);
147         System.out.println("入参:md5=" + md5);
148         System.out.println("入参:checkSum=" + checkSum);
149         // 计算md5
150         String verifyMD5 = SignUtil.md5(requestBody);
151         // 计算checkSum
152         String verifyChecksum = SignUtil.checkSum(QMALLL_LOGIN_APPSECRET, verifyMD5, curTime);
153
154         System.out.println("md5值:" + verifyMD5);
155         System.out.println("校验和:" + verifyChecksum);
156
157         // 比较md5,checkSum是否一致
158         boolean checkResult = md5.equals(verifyMD5) && checkSum.equals(verifyChecksum) ? true : false;
159         System.out.println("校验结果:" + checkResult);
160         return checkResult;
161     }
162
163     /**
164      * 测试
165      *
166      * @param args
167      */
168     public static void main(String[] args) {
169         md5Test("admin");
170         signTest();
171     }
172
173 }

原文地址:https://www.cnblogs.com/jun1019/p/9345907.html

时间: 2024-08-28 19:12:34

接口签名工具类的相关文章

java版MD5签名工具类

package com.net.util; import java.security.MessageDigest; /** * MD5签名工具类 * @author zhangdi * */ public class MD5Util { private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i+

SHA1签名工具类java

package com.net.util; import java.security.MessageDigest; import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.SortedMap; /* '================================================================

接口调用工具类

public class HttpClientApi { public static JSONObject getData(String url,String data) { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/x-w

java 微信开发 常用工具类(xml传输和解析 json转换对象)

与微信通信常用工具(xml传输和解析) package com.lownsun.wechatOauth.utl; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetAddress; import java.net.MalformedURLException; import

Apache Commons 工具类介绍及简单使用

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍.   组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. C

I学霸官方免费教程三十五:Java集合框架之Collection接口和Collections类

Collection接口 Collection接口是List和Set接口的父接口,其中主要定义了一些集合基本操作的方法,包括与Iterator之间的关系List  extends  CollectionArrayList  implements  ListLinkedList  implements  ListVector  implements  ListSet  extends  CollectionHashSet  implements  SetSortedSet  extends  Se

apache 工具类

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

基于HttpClient 4.3的可访问自签名HTTPS站点的新版工具类

本文出处:http://blog.csdn.net/chaijunkun/article/details/40145685,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在原始出处查看此文. HttpClient在当今Java应用中的位置越来越重要.从该项目的变迁过程我们不难发现,其已经从apache-commons众多的子项目中剥离,一跃成为如今的顶级项目,可见它的分量.然而随着项目的升级和架构的调整,很多以前常用的类和方法都已被打上了@Deprecated注解,

基于HttpClient 4.3的可訪问自签名HTTPS网站的新版工具类

本文出处:http://blog.csdn.net/chaijunkun/article/details/40145685,转载请注明.因为本人不定期会整理相关博文,会对相应内容作出完好.因此强烈建议在原始出处查看此文. HttpClient在当今Java应用中的位置越来越重要.从该项目的变迁过程我们不难发现,其已经从apache-commons众多的子项目中剥离,一跃成为现在的顶级项目.可见它的分量.然而随着项目的升级和架构的调整.非常多曾经经常使用的类和方法都已被打上了@Deprecated