性能测试:Jmeter-Beanshell请求加密实例
进行性能测试时,有可能遇到一种场景:接口请求由于安全问题,需要进行加密发送。
这种场景下,使用Jmeter实现性能测试,则也需要使用同样的加密规则发送请求报文。
要实现此类性能测试有几种策略:
- 直接去除密文规则 – 由于报文加密并非性能关键,那么简单起见,直接测试明文请求一定程度上是可以接受的。
- 使用同样的加密规则加密报文发送 – 这样处理显然更接近实际场景,所以是一般比较推荐的做法。
本文讨论使用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,实现对请求的加密。
思路是:
- 导入使用第一步中的jar包作为加密工具库
- 使用特定密钥,对需要加密的字段进行加密处理
- 将加密后的字段存储为变量,供接口调用使用。
BeanShell代码如下:
import cn.hutool.json.JSONUtil; import com.mpos.duobei.controller.HttpClientUtil; import com.mpos.duobei.encrypt.EncryptUtil; import com.mpos.duobei.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项目构成如下: