jmeter预制处理器JSR223-加解密

最近在使用jmeter来对接口进行测试时,用到的国密的加密方式SM2、SHA-245、AES,然后尝试了jmeter的各种前置处理器,包括java的beanshell、JSR223预制处理器,发现JSR223确实是一个很厉害的工具,很多在beanshell中无法执行的语法,在JSR223中都可以直接写,比如java的常见Map转为json字符串的语法:

java 复制代码
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("sign", "1");
        paramMap.put("channelCode", "11");
        paramMap.put("imgA", "1");
        paramMap.put("imgB", "1");
        String aesParam = encrypt("12345678", JSONUtil.toJsonStr(paramMap));

在beanshell中是直接不支持的,但是我们很多接口都需要传递json格式的报文体,报文体又需要加密才能传输,所以这时候用beanshell工具已经无法满足需求了,于是我试了一下JSR223预制处理器,居然可以直接支持这种参数格式,省去了很多兼容的工作,如下:

groovy 复制代码
Map<String, Object> paramMap = new HashMap<>()
paramMap.put("sign", "1")
paramMap.put("channelCode", "101")
paramMap.put("imgA", vars.get("param3"))
paramMap.put("imgB", vars.get("param999"))
paramMap.put("timeStamp", String.valueOf(timestampvalue))
paramMap.put("nonceStr", String.valueOf(timestampvalue))

而且它可以直接引用java的很多jar包,实现请求体加密,如hutool的加密包sm2;直接导入jar包,然后就可以进行加解密了,配置好公钥和私钥,就可以直接实现java后端代码的加解密效果,如下:

groovy 复制代码
import cn.hutool.crypto.asymmetric.SM2
import cn.hutool.crypto.asymmetric.KeyType

这两个导入功能对应的jmeter的ext依赖库中的包就是如下几个:

  • bcpkix-jdk18on-1.78.jar
  • bcprov-jdk18on-1.78.jar
  • hutool-all-5.8.37.jar

必须保证这几个包版本一致,才能正常引用,而且每种类型的jar包只能有一个版本,不能出现一个bcprov-jdk18on-1.78.jar和bcpkix-jdk18on-1.77.jar同时放在jmeter的在ext目录(lib的扩展)下;

另外,关于sm2加密,私钥必须是一个256位(256个二进制0100000100...组成的数字)的数字,最终8位二进制代表一个位,就是64个字符组成的数字,用十六进制的字符表示,如果缺少64位,则需要在最高位补齐0的方式,得到一个完整的私钥;公钥必须和私钥配对使用,才能加解密成功

SHA25加解密直接用:

groovy 复制代码
import java.security.MessageDigest

AES加解密用这些包:

groovy 复制代码
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.SecretKeySpec

将Map的键值对,转换为JSON格式字符串(使用Groovy内置的JsonOutput)

groovy 复制代码
import groovy.json.JsonOutput
Map<String, Object> paramMap = new HashMap<>()
paramMap.put("sign", "1")
paramMap.put("channelCode", "11")
paramMap.put("imgA", vars.get("param3"))
paramMap.put("imgB", vars.get("param3"))

// 将Map转换为JSON字符串(使用Groovy内置的JsonOutput)
String jsonParam = JsonOutput.toJson(paramMap)

这些包都是封装好了,直接可用的,这个工具简直太好用了

相关推荐
就叫_这个吧40 分钟前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡1 小时前
AI 应用系统设计
java·开发语言·人工智能
今天AI了吗2 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5213 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing3 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习4 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing5 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse5 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
丰锋ff5 小时前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
夜不会漫长6 小时前
C++入门(1)
开发语言·c++·算法