sha256_HMAC签名验签,并对传入参数(除了sign参数)按照KEY值进行字典序排序(按照KEY值的ASCII码从小到大),并用&作为各参数之间的分隔符将参数拼接成字符串。

一、参数按照KEY值进行字典序排序(按照KEY值的ASCII码从小到大),并用&作为各参数之间的分隔符将参数拼接成字符串。这里用到了SortedMap。

 /**
     * getSortedString 对参数按照Key进行ASCII排序
     * @param jsonObject 请求参数
     * @return 排序拼装后的字符串
     */
    public static String getSortedString(JSONObject jsonObject){
        SortedMap<String,Object> sortMap = new TreeMap<>();
        StringBuffer sbf = new StringBuffer();
        for (Map.Entry<String, Object> objectEntry : jsonObject.entrySet()) {
            String key = objectEntry.getKey();
            Object value = objectEntry.getValue();
            if ("sign".equals(key)){
                continue;
            }
            sortMap.put(key,value);
        }
        Set mapEntrySet = sortMap.entrySet();
        Iterator it = mapEntrySet.iterator();
        while(it.hasNext()){
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String) entry.getKey();
            Object v = entry.getValue();
            sbf.append(k+"="+v+"&");
        }
        String  sbfString = sbf.toString();
        System.out.println("排序后的字符串:"+sbfString.substring(0,sbfString.length()-1));
        return  sbfString.substring(0,sbfString.length()-1);
    }

二、生成签名方法

   /**
         * sha256_HMAC加密
         * @param data 数据
         * @param secret  秘钥
         * @return 加密后字符串
         */
        private static String sha256_HMAC(String data, String secret) {
            String sign = "";
            Base64Tools base64Tools = new Base64Tools();
            try {
                Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
                //秘钥base64解码
                String keyBytes = base64Tools.decodeStr(secret);
                SecretKeySpec secret_key = new SecretKeySpec(keyBytes.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
                sha256_HMAC.init(secret_key);
                byte[] bytesSign = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));
                sign = byteArrayToHexString(bytesSign);
            } catch (Exception e) {
                logger.error("生成签名错误:"+e.getMessage(),e);
            }
            return sign;
        }

三、验签方法 

 /**
     * checkSign 验签
     * @param data 数据
     * @param secret  秘钥
     * @param signature 校验的签名
     * @return 校验结果
     */
      public static boolean checkSign(String data, String secret, String signature) {
        //true:校验成功
          String getSign = sha256_HMAC(data, secret);   
          return signature != null && signature.equals(getSign);
      }

四、测试生成签名

 public static void main(String[] args) {
        String data = "{\n" +
                "    \"appid\": \"WXTX\",\n" +
                "    \"tel\": \"18888888888\",\n" +
                "    \"timestamp\": \"1617334523\"\n" +
                "}";
        JSONObject jsonObject = JSONObject.parseObject(data);
        //对参数进行排序
        String sortData = getSortedString(jsonObject);
        String secret = "TjNCMkFGQzAzNTA0RTZTTUUwNTM3QzBBQjhDMDc5ODg=";
        System.out.println("生成签名:"+sha256_HMAC(sortData,secret));
      
    }

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值