zoukankan      html  css  js  c++  java
  • 性能测试:Jmeter-Beanshell请求加密实例

    进行性能测试时,有可能遇到一种场景:接口请求由于安全问题,需要进行加密发送。

    这种场景下,使用Jmeter实现性能测试,则也需要使用同样的加密规则发送请求报文。

    要实现此类性能测试有几种策略:

    1. 直接去除密文规则 - 由于报文加密并非性能关键,那么简单起见,直接测试明文请求一定程度上是可以接受的。
    2. 使用同样的加密规则加密报文发送 - 这样处理显然更接近实际场景,所以是一般比较推荐的做法。

    本文讨论使用Jmeter发送加密请求实现性能测试。

    1. 打包加密方法Jar包,导入Jmeter

    首先,确认被测产品的加密策略。

    这个过程应该通过阅读接口定义文档,询问开发人员,辅以抓包解析。

    比如说,对于创建订单接口的抓包结果:

    请求报文:

    POST https://ops.********.cn/***-api/member/system/login HTTP/1.1
    Accept-Language: zh-CN,zh;q=0.8
    User-Agent: Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; Redmi 4A Build/MMB29M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
    token: 90e76710e105b217d185832057220cdd
    appCode: ******
    compCode: ****
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 99
    Host: ops.********.cn
    Connection: Keep-Alive
    Accept-Encoding: gzip

    account=*********&password=2ac9cb7dc02b3c0083eb70898e549b63&sign=4b9932154067b4a35bd4c2e9eba8036f

    以上的请求可以分析得出,加密的部分主要是password参数以及验签码sign(本例中是对请求参数部分加密,实际上整体报文加密可能更常见)。

    然后,我们需要准备相应的加密方法。

    这里推荐让开发人员直接给出产品原始的加密方法,予以导出形成jar包,以保证性能测试的加密方法与产品原始加密规则一致。

    或者如果明确加密方式,也可以使用第三方加密jar包,或者自己编写。这里更推荐第一种,与开发协调取得。

    最后,将准备好的jar包,导入Jmeter测试计划当中。

      

    2. 加密参数

    使用BeanShellPreProcessor,实现对请求的加密。

    思路是:

    1. 导入使用第一步中的jar包作为加密工具库
    2. 使用特定密钥,对需要加密的字段进行加密处理
    3. 将加密后的字段存储为变量,供接口调用使用。

    BeanShell代码如下:

    import cn.hutool.json.JSONUtil;
    import com.***.controller.HttpClientUtil;
    import com.***.encrypt.EncryptUtil;
    import com.***.encrypt.gmhelper.MD5Util;
    import java.util.HashMap;//设置密钥
       String signKey = "47fbbbd********0b8d7378";
    
       //读取用户账户变量
       String useraccount = vars.get("user");
       String pass = vars.get("pass");
    
       //加密处理
       paramMap = new HashMap();
    
       String password = MD5Util.encrypt(pass);
       
       paramMap.put("account", useraccount);
       paramMap.put("password", password);
       
       String sign = EncryptUtil.md5sign1(paramMap, signKey).toLowerCase();
    
       //将加密后的参数存储为变量
       vars.put("password",password);
       vars.put("sign",sign)

     随后,只要在接口请求当中,使用变量的形式传参,即可实现请求报文部分加密传送。

    调用接口发送请求,验证得知报文加密已实现:

    同理可以实现多个不同接口的请求加密过程,整体Jmeter项目构成如下:

  • 相关阅读:
    兼容 IE6,IE7,IE8,IE9,FF,
    估算百度一个关键字的标准
    session_start() [function.sessionstart]
    PHP小实例制作留言本 .
    ADO.NET2.0的十大新特性
    使用NavigationController, 或ModalViewController实现旋转新视图横屏,再旋转返回
    [转一篇]Mac开发/iPhone开发 发送HttpRequest请求
    Topic : How to use TabBar in viewbase application
    Howto: Drawing Pie Charts using iPhone SDK
    MPMovieViewController does not show audio control (I can listen it too!)
  • 原文地址:https://www.cnblogs.com/dayu2019/p/11608432.html
Copyright © 2011-2022 走看看