某项目的压测过程中,遇到接口请求体/响应体均做加密处理的场景,为了还原真实的接口使用场景,以及对接口响应体内容做业务判断,需要在Jmeter脚本中做相应的处理。本文介绍如何对接口加密的场景,进行压测脚本的编写以及调试。
业务场景说明通过抓包了解接口的结构
通过对加密接口进行抓包,了解接口的结构及加密部分,如下图所示,“手机号登录”接口的请求体及响应体均作了加密处理
因此,在压测脚本编写的过程中,需要对请求体先做加密处理,同时为了对响应体做业务判断,需要对响应体做解密处理
获取接口的加密方式
请求/响应体使用了XXTEA加密算法,开发提供了相关的Jar包,加解密调用方法如下图所示:
JMeter脚本编写1. 引入Jar包
方式一:把jar包加入到classpath
方式二:把jar包放到lib/ext下
Jmeter会自动从lib及lib/ext目录下去找jar包,外部引入的jar包一般放在lib/ext目录下
2. 创建线程组
创建线程组后,添加接口相关的请求头及请求体部分,http请求体内容通过引用变量(变量的值会在beanshell处理器中进行赋值)
3. 添加beanshell预处理器
此部分,完成对http请求体的加密,先编辑好接口的请求头及请求体部分,增加beanshell中,将请求体做加密处理后,传入请求参数
//引入加密算法包
import org.xxtea.XXTEA;
//原始请求体
String request = "{"phone":"18789405020","validCode":"1234"}";
log.info("======================request明文=============================");
log.info(request);
//加密后请求体
request = XXTEA.encryptTobase64String(request, "5b28bae827e651b3");
log.info("======================request加密=============================");
log.info(request);
vars.put("requestdata",request)
4. 增加断言
断言部分,在正常不加密接口压测脚本的基础上,添加解密的部分即可。
//引入加密算法包
import org.xxtea.XXTEA;
//对响应体做解密处理,同时打印出解密前后的值
String response = new String(ResponseData); log.info("=====================response密文=================================");
log.info(response);
response = XXTEA.decryptbase64StringToString(response,"5b28bae827e651b3".getBytes());
log.info("=====================response明文=================================");
log.info(response);
//对响应码及响应体做校验
if(!ResponseCode.equals("200"))
{
Failure = true;
FailureMessage=ctx.getPreviousResult() +" 请求失败,返回码:" + ResponseCode + ",响应体:"+ response +"n";
return;
}
Failure = !(response.contains(""code":0"));
if (Failure)
{
Failure = true;
FailureMessage=ctx.getPreviousResult() + " 响应体未发现: "code":0 ,响应体:" + response + "n";
}
JMeter脚本调试
通过添加结果观察树,结合在GUI上看打印的信息,确认加密/解密是否处理成功
总结对接口加密的场景做压测时,需要先通过抓包了解接口的结构以及哪部分做了加密处理,同时需要拿到接口加密算法的相关jar包,以及加密/解密调用的方式,用于在脚本中完成数据加解密的处理。



