JMeter BeanShell 实现接口签名验签及加解密
在利用JMeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,比如对接口请求参数进行签名,加密,响应数据的验签及解密,以及接口公共参数的处理,此时就需要利用BeanShell脚本了,关于BeanShell的使用小伙伴们可以查看网上相关文章。今天主要和大家分享下接口签名,验签,加解密,以及处理公共参数的例子,希望能帮助到小伙伴们。
一,思路
约定:约定接口有统一的请求及响应格式,如:
请求协议公共部分
参数 | 类型 | 是否必选 | 描述 |
---|---|---|---|
appKey | String | 是 | 应用key |
nonce | String | 是 | 32位UUID随机字串,格式如:296f6fdd570244d98b6046ec135a5b8a |
sign | String | 是 | 签名 |
timestamp | Long | 是 | 请求时间戳, |
transactionSn | String | 是 | 交易流水号 |
parameter | Object | 否 | 请求的业务对象 |
响应协议公共部分
参数 | 类型 | 描述 |
---|---|---|
code | String | 返回码 |
message | String | 返回消息,如错误信息 |
timestamp | String | 响应时间 |
transactionSn | String | 交易流水号 |
sign | String | 签名 |
data | Object | 返回的业务对象 |
基于此约定,我们才能进一步统一处理。
- 引入外部签名及加解密工具包
- JMeter的HTTP请求->请求参数中只填写业务对象(parameter)
- 利用前置处理器(BeanShell PreProcessor),组装公共请求对象->对业务参数对象进行加密->签名
- 利用后置处理器(BeanShell PostProcessor)对响应报文进行验签->解密。
二,实现
整体效果如下图:
关于如何建立测试计划,线程组就不用一一描述了,这里只关注核心功能实现。
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
JMeter BeanShell 实现接口签名验签及加解密相关推荐
- springboot接口签名统一效验_Python如何接入开放平台?签名验签、加密解密、授权认证测试实战...
当前大型top企业都有非常成熟的开放平台业务,比如微信开放平台.新浪微博开放平台.支付宝开放平台等.开放平台的发展为第三方个人或企业提供了巨大的机遇.开发者想要接入各大开放平台,必须要遵从开放平台的安 ...
- API 接口签名验签
目录 一.为什么需要 API 接口签名 二.API 接口签名验签实现机制 一.为什么需要 API 接口签名 对外开放的 API 接口都会面临一些安全问题,例如伪装攻击.篡改攻击.重放攻击以及数据信息泄 ...
- 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...
在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...
- Python如何接入开放平台?签名验签、加密解密、授权认证测试!
当前大型top企业都有非常成熟的开放平台业务,比如微信开放平台.新浪微博开放平台.支付宝开放平台等.开放平台的发展为第三方个人或企业提供了巨大的机遇.开发者想要接入各大开放平台,必须要遵从开放平台的安 ...
- Java 实现RSA 签名/验签与加密解密
文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...
- 三方接口签名验签简易设计与实现
本人水平有限,对密码学的理解相当浅显.错误与疏漏,欢迎各位指正. 〇.写在前面 接口安全防护是个永恒的话题,提供给前端的接口需要登录,提供给服务的接口(下文简称"三方接口")也需要 ...
- SM2加解密、签名验签
导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法. 国产SM2算法,是基于ECC的,但二者在签名验签.加密解密过程中或许有些 ...
- RSA密钥生成、加密解密、数据签名验签
公钥.私钥生成 准备工作,基础的帮助类 使用java代码生成公钥私钥 使用openssl生成公钥私钥 加解密 数据签名及验签 数据加解密及签名验签测试 注意项 公钥.私钥生成 准备工作,基础的帮助类 ...
- 格尔签名验签接口使用记录
直接开始,主要包括三个部分:签名接口测试.验签接口测试.代码实现. 这里写目录标题 1. 签名接口测试 2. 验签接口测试 3. java代码调用接口 1. 签名接口测试 这里签名和验签接口均使用Po ...
最新文章
- html中h3的样式,比较好看的css自定义样式(标题 h1 h2 h3)
- python使用threading模块实现多线程
- boost::mp11::mp_map_find相关用法的测试程序
- redis分布式缓存(二)
- 一线技术人的成长思考总结
- 反汇编基础-乘法与除法
- react优秀项目案例_2020中国5G+工业互联网大会:鄂州2项目现场签约,2项目入选十大优秀案例...
- IDEA安装“Translation”插件
- fatal: unable to access ‘https://github.com/xxx/‘: Failed to connect to 127.0.0.1 port 7890: Connect
- 台式机黑苹果 Mojave 10.14.6 安装驱动
- python电影推荐系统 github_GitHub - qingtang3009/MovieRecommend: 一个电影推荐系统
- 毕业设计-JavaWeb项目《图书馆借阅管理系统》-附源码
- 曲面局部理论介绍——从曲面的概念、基本形式到高斯曲率及其 Pthyon 计算
- iPhone5/5c 越狱破解联通4g
- 搜索引擎网站登录入口|免费登录|百度登录|谷歌登录|网站收录入口
- python pip中的Fatal error in launcher错误及解决
- 张江男曲折的出国梦_IT新闻_博客园
- linux 重定向 2 gt gt,Linux命令- echo、grep 、重定向、1gt;amp;2、2gt;amp;1的介绍
- 给虚拟机添加虚拟磁盘时出现uuid already exists解决办法
- Google GMS 包相关APK ANR 解决方案
热门文章
- JavaScript - 内置对象
- 如何将数据表格快速转换成LaTeX格式?
- 生信人的一天~HIFI数据+HIC数据组装基因组
- 声发射传感器的内部结构
- c语言读取一张hdr图片,在Photoshop中调出人物照片高质量的HDR效果
- 用Python学《微积分B》(Newton-Leibniz公式)
- 宝可梦探险寻宝料理php,宝可梦探险寻宝料理怎样搭配_宝可梦探险寻宝料理配方搭配方式详解_玩游戏网...
- 最土团购系统1.6支持支付宝担保支付的方法
- python运算结果是浮点数_Python中的浮点数原理与运算分析 python中浮点数等于整数?为什么?...
- EA001-185-2510