首页 > 技术文章 > 加解密

jingdenghuakai 2020-11-30 08:37 原文



 1 public static void main(String[] args) {
 2        SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
 3        //String mfrchant_id="fffff";
 4        String merchant_id="190010002";
 5        String business_type="1005";
 6        String out_trade_no="1400000001";
 7        String key="3A4BC4A4000CF1B5FFA9E351E6C1539E";
 8        //parameters.put("mfrchant_id", mfrchant_id);
 9        parameters.put("merchant_id", merchant_id);
10        parameters.put("business_type", business_type);
11        parameters.put("out_trade_no",out_trade_no);
12        String characterEncoding = "UTF-8";         //指定字符集UTF-8
13        String mySign = createSign(characterEncoding,parameters,key);
14        log.info(mySign);
15        //System.out.println("我 的签名是:"+mySign);
16    }
17 
18 public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters,String key){
19     StringBuffer sb = new StringBuffer();
20     StringBuffer sbkey = new StringBuffer();
21     Set es = parameters.entrySet();  //所有参与传参的参数按照accsii排序(升序)
22     Iterator it = es.iterator();
23     while(it.hasNext()) {
24         Map.Entry entry = (Map.Entry)it.next();
25         String k = (String)entry.getKey();
26         Object v = entry.getValue();
27         //空值不传递,不参与签名组串
28         if(null != v && !"".equals(v)) {
29             sb.append(k + "=" + v + "&");
30             sbkey.append(k + "=" + v + "&");
31         }
32     }
33     //System.out.println("字符串:"+sb.toString());
34     sbkey=sbkey.append("key="+key);
35     System.out.println("字符串:"+sbkey.toString());
36     //MD5加密,结果转换为大写字符
37     String sign = MD5Util.MD5Encode(sbkey.toString(), characterEncoding).toUpperCase();
38     System.out.println("MD5加密值:"+sign);
39     return sb.toString()+"sign="+sign;
40     return sbkey;
41 }

 

//签名生成的通用步骤如下: 
//第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 
//特别注意以下重要规则: 
//1.◆ 参数名ASCII码从小到大排序(字典序); 
//2.◆ 如果参数的值为空不参与签名; 
//3.◆ 参数名区分大小写; 
//4.◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 
//5.◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段 
//第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

import org.apache.commons.codec.digest.DigestUtils;
StringBuffer sb = new StringBuffer();
StringBuffer sbkey = new StringBuffer();

SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
       String merchant_id="190010002";
       String business_type="1005";
       String out_trade_no="1400000001";
       String key="3A4BC4A4000CF1B5FFA9E351E6C1539E";
       parameters.put("merchant_id", merchant_id);
       parameters.put("business_type", business_type);
       parameters.put("out_trade_no",out_trade_no);
       String characterEncoding = "UTF-8"; 

Set es = parameters.entrySet();  //所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
    Map.Entry entry = (Map.Entry)it.next();
     String k = (String)entry.getKey();
     Object v = entry.getValue();
     //空值不传递,不参与签名组串
     if(null != v && !"".equals(v)) {
         sb.append(k + "=" + v + "&");
          sbkey.append(k + "=" + v + "&");
        }
    }
//System.out.println("字符串:"+sb.toString());
sbkey=sbkey.append("key="+key);
System.out.println("字符串:"+sbkey.toString());
//MD5加密,结果转换为大写字符
String sign = DigestUtils.md5Hex(sbkey.toString()).toUpperCase();
log.info(sign);
//String requestbody=sb.toString()+"sign="+sign;
//log.info(requestbody);

 

 1 //HMAC_SHA加密方法
 2 //package com.taikang.hcloud.tlife.activity.cms.util;
 3 //
 4 //import javax.crypto.Mac;
 5 //import javax.crypto.spec.SecretKeySpec;
 6 //
 7 //
 8 //public class SignUtil {
 9 //
10 //    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
11 //
12 //
13 //    private static String byteToHexString(byte b) {
14 //        int ret = b;
15 //        if (ret < 0) {
16 //            ret += 256;
17 //        }
18 //        int m = ret / 16;
19 //        int n = ret % 16;
20 //        return HEX_DIGITS[m] + "" + HEX_DIGITS[n] + "";
21 //    }
22 //
23 //    private static String byteArrayToHexString(byte[] bytes) {
24 //        StringBuilder stringBuilder = new StringBuilder();
25 //        for (int i = 0; i < bytes.length; i++) {
26 //            stringBuilder.append(byteToHexString(bytes[i]));
27 //        }
28 //        return stringBuilder.toString();
29 //    }
30 //
31 //    public static String hMacSha1(String message, String secret) {
32 //        String hash = "";
33 //        try {
34 //            Mac mac = Mac.getInstance("HmacSHA1");
35 //            SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes(), "HmacSHA1");
36 //            mac.init(secretKeySpec);
37 //            byte[] bytes = mac.doFinal(message.getBytes());
38 //            hash = byteArrayToHexString(bytes);
39 //        } catch (Exception e) {
40 //            e.printStackTrace();
41 //        }
42 //        return hash;
43 //    }
44 //}
45 
46 import HMAC_SHA_1.SignUtil;
47 
48 String noncestr ="qwer";
49 String timestamp="20110210";
50 String distance="0";
51 //String content3 = noncestr+timestamp +distance;
52 String content4 = "noncestr="+noncestr+"&timestamp="+timestamp +"&distance="+distance;//将入参进行拼接然后加密
53 String signature = SignUtil.hMacSha1(content4, noncestr);
54 //System.out.println(signature);
55 log.info(signature);
56 //vars.put("sign",signature);

 


1 import org.apache.commons.codec.digest.DigestUtils;//import 包名.类名;引入jar包,使用的是jmeter/lib目录下自带的SHA-256加密包commons-codec-1.11.jar
2 
3 String a="{\"id\":\"UD227\",\"Type\":\"001\",\"age\":\"20\"}";//要进行加密的对象
4 String a_SHE256=DigestUtils.sha256Hex(a.getBytes());
5 //System.out.println(a_SHE256);
6 log.info(a_SHE256);

 

 1 import org.apache.commons.codec.binary.Base64;//引入jmeter/lib目录下的commons-codec-1.11.jar
 2 String a="123456刚刚";
 3 byte[] a1=a.getBytes();//将字符串格式转换成数组格式
 4 String a_base64=Base64.encodeBase64String(a1);  //base64加密
 5 //String a_base64=Base64.encodeBase64String(a.getBytes());
 6 //tem.out.println(a_base64);
 7 log.info(a_base64);
 8 
 9 byte[] a3=Base64.decodeBase64(a_base64);//base64解密
10 String a4=new String(a3);//将数组格式转换成字符串
11 //System.out.println(a4);
12 log.info(a4);

 

import org.apache.commons.codec.digest.DigestUtils;
//import 包名.类名;引入jar包,使用的是jmeter/lib目录下自带的MD5加密包commons-codec-1.11.jar
String a1="{\"id\":\"UD227\",\"Type\":\"001\",\"age\":\"20\"}";//要进行加密的对象
String id=args[0];//引入变量mobile,前置处理器和后置处理器中使用args[]
String type=args[1];
String age=${__Random(18,60,)};
//String id=bsh.args[0];//引入变量mobile,beanshell取样器中bsh.args[]
String a=a1.replaceAll("UD227", id).replaceAll("20", age).replaceAll("001", type);//参数替换
String md5=DigestUtils.md5Hex(a);//类名.方法名,调用加密方法
log.info(md5);
log.info(a);
log.info(age+","+type);
vars.put("md5",md5);//将变量md5的值赋值给jmeter的变量md5
        
String md5_upper=md5.toUpperCase();//将变量md5的值全部变成大写字母
log.info(md5_upper);    

String md5_lower=md5.toLowerCase();//将变量md5的值全部变成小写字母
log.info(md5_lower);

 

import org.apache.commons.codec.digest.DigestUtils;
//import 包名.类名;引入jar包,使用的是jmeter/lib目录下自带的MD5加密包commons-codec-1.11.jar

String mobile=args[0];//引入变量mobile,前置处理器和后置处理器中使用args[]
String number=args[1];
String md5=DigestUtils.md5Hex(mobile+number);//类名.方法名,调用加密方法
log.info(md5);
//vars.put("md5",md5);//将变量md5的值赋值给jmeter的变量md5

 

推荐阅读