JMeter BeanShell 实现接口签名验签及加解密

在利用JMeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,比如对接口请求参数进行签名,加密,响应数据的验签及解密,以及接口公共参数的处理,此时就需要利用BeanShell脚本了,关于BeanShell的使用小伙伴们可以查看网上相关文章。今天主要和大家分享下接口签名,验签,加解密,以及处理公共参数的例子,希望能帮助到小伙伴们。

一,思路
  • 约定:约定接口有统一的请求及响应格式,如:

    请求协议公共部分

参数类型是否必选描述
appKeyString应用key
nonceString32位UUID随机字串,格式如:296f6fdd570244d98b6046ec135a5b8a
signString签名
timestampLong请求时间戳,
transactionSnString交易流水号
parameterObject请求的业务对象

响应协议公共部分

参数类型描述
codeString返回码
messageString返回消息,如错误信息
timestampString响应时间
transactionSnString交易流水号
signString签名
dataObject返回的业务对象

基于此约定,我们才能进一步统一处理。

  • 引入外部签名及加解密工具包
  • JMeter的HTTP请求->请求参数中只填写业务对象(parameter)
  • 利用前置处理器(BeanShell PreProcessor),组装公共请求对象->对业务参数对象进行加密->签名
  • 利用后置处理器(BeanShell PostProcessor)对响应报文进行验签->解密。
二,实现

整体效果如下图:

微信图片编辑_20210518115705.jpg

关于如何建立测试计划,线程组就不用一一描述了,这里只关注核心功能实现。

  • HTTP请求参数(parameter)部分,如:

    {
        "idCardNo":"511622198312241918",
        "name":"Leo"
    }
    
  • 接口调用前置处理器-签名/加密(BeanShell PreProcessor),BeanShell代码如下:

    //引入依赖
    import com.javacoo.service.base.security.util.SignUtil;
    import com.javacoo.service.base.security.util.SecurityUtil;
    import com.javacoo.service.base.utils.WebUtil;
    import com.javacoo.service.base.utils.FastJsonUtil;
    import com.javacoo.service.base.BaseRequest;
    import java.util.Calendar;
    import java.util.Map;
    import org.apache.jmeter.config.Arguments; 
    
    //开始处理
    log.info("接口调用前置处理器-签名/加密相关处理");
    Arguments args = sampler.getArguments(); 
    
    //获取请求参数
    String body = args.getArgument(0).getValue();
    log.info("业务参数:{}",body);
    
    //获取签名所需参数
    String appKey = "${appKey}";
    String secretkey = "${secretkey}";
    String nonce = WebUtil.genTransSn();
    String transactionSn = WebUtil.genTransSn();
    Long timestamp = Calendar.getInstance().getTimeInMillis();
    
    //加密
    Map bodyMap = FastJsonUtil.stringToCollect(body);
    log.info("params:{}",bodyMap);
    for(Map.Entry entry : bodyMap.entrySet()){
        entry.setValue(SecurityUtil.encryptDes(entry.getValue(),secretkey));
    }
    body = FastJsonUtil.toJSONString(bodyMap);
    log.info("加密后业务参数:{}",body);
    
    //签名
    String sign = SignUtil.clientSign(body,nonce,timestamp.toString(),secretkey);
    log.info("sign:{}",sign);
    
    //组装接口请求对象
    BaseRequest baseRequest = new BaseRequest();
    baseRequest.setAppKey(appKey);
    baseRequest.setNonce(nonce);
    baseRequest.setTimestamp(timestamp);
    baseRequest.setTransactionSn(transactionSn);
    baseRequest.setSign(sign);
    baseRequest.setParameter(FastJsonUtil.toBean(body));
    //转换为JSON字符串
    String reqBody = FastJsonUtil.toJSONString(baseRequest);
    log.info("reqBody:{}",reqBody);
    
    //重置参数值
    args.getArgument(0).setValue(reqBody);
    
  • 接口调用后置处理程序-验证签名/解密(BeanShell PostProcessor),BeanShell代码如下:

    //引入依赖
    import com.javacoo.service.base.security.util.SignUtil;
    import com.javacoo.service.base.BaseResponse;
    import com.javacoo.service.base.utils.FastJsonUtil;
    import org.apache.commons.lang3.StringUtils;
    
    //开始处理
    log.info("接口调用后置处理器-验证签名");
    String responseData = prev.getResponseDataAsString();
    log.info("返回数据:{}",responseData);
    BaseResponse baseResponse = FastJsonUtil.toBean(responseData, BaseResponse.class);
    if(StringUtils.isBlank(baseResponse.getSign()) || baseResponse.getData().get() == null){
        return;
    }
    //转换
    String s = FastJsonUtil.toJSONString(baseResponse.getData().get());
    log.info("请求返回业务json:{}",s);
    log.info("请求返回签名:{}",baseResponse.getSign());
    String secretkey = "${secretkey}";
    
    //验证签名
    if (SignUtil.cloudVerifySign(baseResponse.getSign(), s,baseResponse.getTransactionSn(),baseResponse.getTimestamp().toString(), secretkey)) {
           log.info("返回数据合法");
    } else {
           log.info("返回数据被篡改");
    }
    //解密,TODO
    
三,注意事项及问题
  • JMeter不支持java1.5以后的语法,不支持泛型,如要使用则需要封装成JAR包。
一些信息
路漫漫其修远兮,吾将上下而求索
码云:https://gitee.com/javacoo
QQ群:164863067
作者/微信:javacoo
邮箱:xihuady@126.com
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JMeter是一款功能强大的负载测试工具,而Beanshell则是JMeter中一个非常重要的组成部分。Beanshell是一个基于Java语言的脚本语言,它允许你在JMeter中使用Java代码来进行各种操作,包括读取文件、发送邮件、执行数据库操作等等。 以下是JMeter Beanshell的安装使用步骤: 1. 下载Beanshell 在官网下载最新的Beanshell版本,解压到任意目录。 2. 将Beanshell添加到JMeter的classpath中 打开JMeter的bin目录下的jmeter.bat(Windows)或jmeter.sh(Linux),找到如下代码: set CLASSPATH=%CLASSPATH%;%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar 将其修改为: set CLASSPATH=%CLASSPATH%;%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%BEANSHELL_HOME%\bsh-2.0b4.jar 其中,BEANSHELL_HOME为Beanshell的安装目录。 3. 在JMeter中使用BeanshellJMeter中使用Beanshell非常简单。只需要添加一个Beanshell Sampler,然后在Sampler中编写Beanshell脚本即可。 例如,以下是一个简单的Beanshell脚本,用于输出当前时间: import java.text.SimpleDateFormat; import java.util.Date; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String currentTime = format.format(new Date()); log.info("Current time is " + currentTime); 在Sampler中选择Beanshell Sampler,然后将以上脚本复制到Script框中即可。运行测试计划后,可以在JMeter的日志中看到输出的当前时间。 总结 JMeter BeanshellJMeter中非常重要的组成部分,它可以让你在测试中使用Java代码来进行各种操作。安装和使用Beanshell非常简单,只需要下载Beanshell,将其添加到JMeter的classpath中,然后在Sampler中编写Beanshell脚本即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javacoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值