发布新日志

  • Jmeter的参数签名测试

    2018-01-02 22:34:21

    https://www.jianshu.com/p/240e929323a6

    简介

    参数签名可以保证开发的者的信息被冒用后,信息不会被泄露和受损。原因在于接入者和提供者都会对每一次的接口访问进行签名和验证。

    签名sign的方式是目前比较常用的方式。

    • 第1步:接入者把需求访问的接口的所有必要的参数信息(注意是所有参数),除去sign本身,以及值是空的参数,按参数名字母顺序排序。拼接成字符串

    • 第2步: 然后把排序后的参数按参数1值1参数2值2…参数n值n(这里的参数和值必须是传输参数的原始值,不能是经过处理的,的方式拼接成一个字符串。

    • 第3步: 把分配给接入方的验证密钥key(或者是提供者提供的一个SECRET_KEY,这个SECRET_KEY只有接入者和提供者知道)拼接在第2步得到的字符串前面。

    • 第4步:对加入密匙key的字符串进行加密或是摘要(用MD5或是SHA1摘要的比较多)

    • 第5步:对MD5的摘要结果转成大写然后写成字符串,传给参数sign

    举例:
    假设传输的数据是
    http://www.xxx.com/interface.aspx?sign=sign_value&p2=v2&p1=v1&method=cancel&p3=&pn=vn
    (实际情况最好是通过post方式发送),
    其中sign参数对应的sign_value就是签名的值。
    
    第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,
    剩下p2=v2&p1=v1&method=cancel&pn=vn,
    然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn.
    
    第二步,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn
    
    第三步,在上面拼接得到的字符串前加上验证密钥key,我们假设是abc,
    得到新的字符串abcmethodcancelp1v1p2v2pnvn
    
    第四步,然后将这个字符串进行md5计算,假设得到的是abcdef,
    然后转为大写,得到ABCDEF这个值即为sign签名值。
    
    注意,计算md5之前请确保接口与接入方的字符串编码一致,
    如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。
    服务器用密匙key对参数进行同样的MD5摘要算法,比对sign值
    

    MD5摘要

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

    MD5算法具有以下特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
    MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等

    jmeter的MD5摘要算法

    我的Jmeter3.2版本已经没有了_MD5这个函数了。
    所以要用MD5对参数进行摘要,我们需要自己导入MD5摘要算法的jar包

    用Eclipse编写一个java的MD5摘要算法的jar包

    image.png
    image.png
    image.png
    image.png

    MD5摘要算法在java中的编码
    LMFMD5.java

    package LMF.md5;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    public class LMFMD5 {
        //创建一个类LMFMD5
        public String MD5(String sourceStr) {
            String result = "";
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
             // 生成一个MD5加密计算摘要
                md.update(sourceStr.getBytes());
             // 使用指定的byte数组更新摘要
                byte b[] = md.digest();
             // 把密文转换成十六进制的字符串形式
                int i;
                StringBuffer buf = new StringBuffer("");
                for (int ffset = 0; offset < b.length; offset++) {
                    i = b[offset];
                    if (i < 0)
                        i += 256;
                    if (i < 16)
                        buf.append("0");
                    buf.append(Integer.toHexString(i));
                }
                result = buf.toString();
                System.out.println("MD5(" + sourceStr + ",32) = " + result);
             //   System.out.println("MD5(" + sourceStr + ",16) = " + buf.toString().substring(8, 24));
                // 注释的是md5的16位取值
            } catch (NoSuchAlgorithmException e) {
                System.out.println(e);
            }
            return result;
        }
    }
    
    

    test.java(测试)

    package LMF.md5;
    import LMF.md5.LMFMD5;
    public class test {
        public static void main (String[] args) {
        String res = new LMFMD5().MD5("laimeifeng");
        System.out.println(res);
        }
    }
    

    把MD5摘要算法打包成jar包

    image.png
    image.png

    把MD5摘要算法的jar包放入jmeter的lib\ext目录里面里面

    image.png

    **Jmeter的BeanShell Sampler

    image.png

    Jmeter的查看MD5摘要算法结果

    image.png
    image.png
    image.png

    这样一个MD5摘要算法就成功加入到jmeter里面,可以进行MD5参数签名了。

    总结

    现在使用的接口有很大一部分是加密的,我们对这样的接口进行测试时,也需要传递加密的参数,来进行接口访问。



    作者:我为峰2014
    链接:https://www.jianshu.com/p/240e929323a6
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • Jmeter BeanShell 引用变量报错Error or number too big for integer

    2018-01-02 17:04:05

    http://www.bubuko.com/infodetail-2138759.html


    如果你通过CSV Data Set Config或者_StringFromFile函数来参数化你的请求,需要特别注意当参数为纯数字时,jmeter会默认将其识别成int型数据,说明jmeter并不是默认以String类型对数据进行读取的:范围-2147483648到2147483647,如果超出这个范围(例如2147483648这个数字):jmeter控制台则会抛出如下异常:jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval    Parse error at line 14, column 181 : Error or number too big for integer type: 2147483648,如果要解决此问题,可在超出范围-2147483648到2147483647的数据前加上字母,或者使用beenshell进行参数化。

    注意:

    1、在BeenShell中引用外部参数需要以String类型的方式引用:例如:"${user}"(ps需要加上双引号)

    2、在BeenShell中引用文件路径时不要使用"\",否者会转义成ASCII码,当你需要表示完整的路径时应该如此表示:E:/TestSupplierInterFace/ZipUtil.java,而不是像java中引用E:\\TestSupplierInterFace\\ZipUtil.java,这样就会将T和Z分别转码成84和90然后jmeter控制台就会报错

  • jmeter md5 beanshell处理动态生成请求参数签名

    2018-01-02 16:34:57

    http://blog.hissummer.com/2017/01/jmeter-jsr223-beanshell%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0%E7%AD%BE%E5%90%8D%EF%BC%88%E4%BE%8B%E5%A6%82%E5%BE%AE%E4%BF%A1%E5%BC%80%E6%94%BEapi/

    import java.util.TreeMap;
    import java.util.Set;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Arrays;
    import java.security.MessageDigest;
    import java.math.BigInteger;
    import java.nio.charset.StandardCharsets;
    import java.nio.charset.Charset;
    import com.wjika.test.mymd5;
    import java.lang.String;
     
    //long requestTime = System.currentTimeMillis();
    String c_time="${__time(,)}";
    System.out.println(c_time);
    vars.put("current_time",c_time);
    String requestTime = c_time;
    // 原始请求参数定义
    //key1=value1&key2=&key3=value3    key2 为空将不会被作为签名的字符串并被舍弃请求。 具体请参见接口文档。
    // 此处会自动添加sign 参数,sign可以不填或者留空即可。
     
    String riginalparametersString = "app_version=5.0.1&bundleid=com.jy.gr&channel=799&current_time="+requestTime+"&imei=A10000563"+"&sign=&version=1.0&"+"mobile="+"${mobile}";
    String[] parameters = originalparametersString.split("&");
     
     
    log.info(originalparametersString);
     
    log.info(String.valueOf(parameters.length));
     
    TreeMap SortedParametersWithoutSign = new TreeMap();
     
     
    // 将参数按字母排序
     
    for(int i = 0 ; i < parameters.length ; i ++){
     
       String[] pandvalue  =  parameters[i].split("=");
       log.info(String.valueOf(pandvalue.length));
       if(pandvalue.length>1){
        
           String[] values = Arrays.copyOfRange(pandvalue, 1, pandvalue.length);
           log.info(String.valueOf(values.length));
           log.info(values[0]);
           if(!values[0].equals(""))
           SortedParametersWithoutSign.put(pandvalue[0],values[0]);
       }
       else{
           //SortedParametersWithoutSign.put(pandvalue[0],null);
       }
     
    }
     
    // 根据排序后的参数,组装参数。
     
    String requestParameters = "";
     
        Set set = SortedParametersWithoutSign.entrySet();
          Iterator iterator = set.iterator();
          int iterationcount = 0;
          while(iterator.hasNext()) {
     
              Map.Entry mentry = (Map.Entry)iterator.next();
              log.info("key: "+mentry.getKey()+"  ---- must:"+ mentry.getValue()   );
     
     //    if( mentry.getValue()[0].equals("Y") && !mentry.getKey().equals("sign") ){
     
                  if(iterationcount == 0)
     requestParameters += mentry.getValue();
     else requestParameters += mentry.getValue();
     
     iterationcount++;
     
     //    }
          }
     
     
    log.info(requestParameters);
     
    vars.put("requestParameters",requestParameters);

    String a=vars.get("requestParameters");

    StringBuilder stringBuilder = new StringBuilder(a);
    String signKey="jygdfgdfgdfgfdgddfgfdgo";
    String signRandom="bsdfsd34234234fsdfsdf82d";
    String sign = mymd5.getMd5(stringBuilder.append(signKey).toString()).concat(signRandom);
    System.out.println(sign);
    vars.put("sign", sign);


     
Open Toolbar