生成sign(签名),以及校验工具类

package cn.weixiuhui.support.comm.utils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import cn.weixiuhui.platform.comm.rest.RestCommService;public class SignUtils {private static Logger LOGGER = LoggerFactory.getLogger(SignUtils.class);private static final String secretKeyOfWxh = "e10adc3949ba59abbe56e057f20f883f";private static final String appidOfWxh = "xxx";public static void main(String[] args)  {  //参数签名算法测试例子  HashMap<String, String> signMap = new HashMap<String, String>();  signMap.put("devid","BC5549D899ED");  signMap.put("userId","1");  signMap.put("type","worker");  signMap.put("name","中文测试");System.out.println("得到签名sign1:"+getSign(signMap,secretKeyOfWxh));  }  /*** 唯修汇外部接口签名验证* @param request* @return*/public static Boolean checkSign(HttpServletRequest request){Boolean flag= false;String appid = request.getParameter("appid");//appidif(!appid.equals(appidOfWxh)){throw  RestCommService.buildBadRequest("appid错误");}String sign = request.getParameter("sign");//签名String timestamp = request.getParameter("timestamp");//时间戳//check时间戳的值是否在当前时间戳前后一小时以内String currTimestamp = String.valueOf(new Date().getTime() / 1000); // 当前时间的时间戳int currTimestampNum = Integer.parseInt(currTimestamp);int verifyTimestampNum = Integer.parseInt(timestamp); // 时间戳的数值// 在一小时范围之外,访问已过期if (Math.abs(verifyTimestampNum - currTimestampNum) > 600) {throw  RestCommService.buildBadRequest("sigin已经过期");}//检查sigin是否过期Enumeration<?> pNames =  request.getParameterNames();  Map<String, String> params = new HashMap<String, String>();  while (pNames.hasMoreElements()) {  String pName = (String) pNames.nextElement();  if("sign".equals(pName)) continue;  String pValue = (String)request.getParameter(pName);  params.put(pName, pValue);  }if(sign.equals(getSign(params, secretKeyOfWxh))){flag = true;}return flag;}public static String utf8Encoding(String value, String sourceCharsetName) {  try {  return new String(value.getBytes(sourceCharsetName), "UTF-8");  } catch (UnsupportedEncodingException e) {  throw new IllegalArgumentException(e);  }  }  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;  }  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());  //sign.append(hex.toLowerCase());  } return sign.toString();  }  /*** 得到签名* @param params 参数集合不含secretkey* @param secret 验证接口的secretkey* @return*/public static String getSign(Map<String, String> params,String secret)  {  String sign="";  StringBuilder sb = new StringBuilder(); //step1:先对请求参数排序Set<String> keyset=params.keySet();  TreeSet<String> sortSet=new TreeSet<String>();  sortSet.addAll(keyset);  Iterator<String> it=sortSet.iterator(); //step2:把参数的key value链接起来 secretkey放在最后面,得到要加密的字符串while(it.hasNext())  {  String key=it.next();  String value=params.get(key);  sb.append(key).append(value);  }  sb.append(secret);  byte[] md5Digest;  try {  //得到Md5加密得到signmd5Digest = getMD5Digest(sb.toString());  sign = byte2hex(md5Digest);  } catch (IOException e) {  LOGGER.error("生成签名错误",e);}  return sign;  }  }

ps:该类没有校验随机数,请自行实现;

实现逻辑:检查缓存中是否存在 sign对的随机数,若有代表已经请求过。。。根据接口性质决定是否允许在有效时间内重复请求该接口。做对应的异常处理

生成sign(签名),以及校验工具类相关推荐

  1. SpringBoot 文件上传 基于MD5 文件内容校验工具类

    1.业务场景:实现文件上传功能时.我们需要校验上传文件在传输过程中是否被注入脚本或者是被修改,所有采用md5 算法+ 文件内容生成一个识别码,传递给后端,让后端判断文件是否发生修改或变更. impor ...

  2. Java正则表达式校验工具类_【Java工具类】----正则表达式校验工具类

    /** * @Title: RegexValidateUtil.java * @Package org.csun.nc.util * @Description: TODO * @author chis ...

  3. 生成html页面的ftl文件,FreeMarker生成静态HTML页面的工具类FreeMarkerUtil

    FreeMarker生成静态HTML页面的工具类FreeMarkerUtil 一.FreeMarkerUtil工具类: import com.huaxia.entity.News; import co ...

  4. 封装各种生成唯一性ID算法的工具类

    /*** Copyright (c) 2005-2012 springside.org.cn** Licensed under the Apache License, Version 2.0 (the ...

  5. SpringBoot中使用Hibernate Validator校验工具类

    1.说明 在Spring Boot已经集成Hibernate Validator校验器的情况下, 对于配置了校验注解的请求参数, 框架会自动校验其参数, 但是如果想手动校验一个加了注解的普通对象, 比 ...

  6. 用ZXING生成二维码的工具类(可以去掉白边,添加logo)

    ===========================用ZXING生成二维码的工具类(可以去掉白边,添加logo)========================== /**  * @auther g ...

  7. 组织机构代码和统一社会信用代码校验规则以及java校验工具类

    组织机构代码 编码规则编辑 1.全国组织机构代码由八位数字(或大写拉丁字母)本体代码和一位数字(或大写拉丁字母)校验码组成. 本体代码采用系列(即分区段)顺序编码方法. 校验码按照以下公式计算: C9 ...

  8. validate方法中校验工具类

    日常Java开发中,我们使用validate的校验是很方便的,但是也有一些特殊情况需要单独处理, 例如:导入Excel校验,传入的是MultipartFile文件类型,我们不能使用注解进行校验实体信息 ...

  9. 编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类,银联借记卡号是一个 19 位的数字,卡号以“62”开头,如图所示。

    查看本章节 查看作业目录 需求说明: 使用单例模式,创建可以生成银联借记卡号的工具类,银联借记卡号是一个 19 位的数字,卡号以"62"开头,如图所示. 实现思路: (1)创建 J ...

最新文章

  1. 新浪项目-------小知识点答疑解惑
  2. Openfire使用上的一些技巧
  3. mfc判断文件是否被读写_迅为干货|标准io之一个字符的读写函数
  4. 线性结构常规操作(四)
  5. 【youcans 的 OpenCV 例程 200 篇】111. 雷登变换反投影重建图像
  6. 【Swift学习】Swift编程之旅(一)
  7. 专升本c语言名词解释题_专升本到底难不难?
  8. 第28件事 挖掘用户真实需求的6大撒手锏
  9. 云小课 | 不了解EIP带宽计费规则?看这里!
  10. linux 关联数组,Linux shell数组与关联数组的用法实例
  11. MFC粉丝(mfcclub)全自动抢购过程(自动识别输入验证码)
  12. python制作动态二维码步骤_七夕 | 如何用Python制作动态二维码,来哄女朋友开心?...
  13. 微软校园招聘面试经历
  14. adb connect连接手机失败的解决办法
  15. [ Java ] 实现两个数加减乘除的简易计算器
  16. Markdown语法文档,Markdown教程,Markdown语法大全,
  17. 不平等博弈_不平等与全球性大流行:完美的风暴?
  18. 参会记录|2023 上海 CDC 城市领航者之夜(第一期)
  19. 怎么把pdf分割成一页一页的
  20. 写毕业论文常用网站(本人常用)

热门文章

  1. [转]部分日文实用网址介绍
  2. linux 命令:ps 详解
  3. 已知IP地址和子网掩码计算网络号
  4. linux运行同花顺,wine打不开同花顺软件
  5. 文件分片上传阿里云OSS
  6. c语言大学教程答案pdf,C++大学教程(第九版) 保罗·戴特尔(Paul Deitel)等著 完整中文pdf扫描版[197MB]...
  7. 利用mathematica画多个函数图像
  8. QR法求解特征值特征向量
  9. python刷题:哥德巴赫猜想
  10. 计算某天是某年的第多少天