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)

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

相关推荐
asyxchenchong8881 小时前
R+VIC 模型融合实践技术应用及未来气候变化模型预测
开发语言·r语言
Run_Teenage1 小时前
算法模板:输入输出,并查集
java·开发语言·算法
oh-pinpin1 小时前
【jmeter】-脚本-文件上传接口实现
jmeter
古城小栈1 小时前
Rust Tauri:构建轻量高性能跨平台桌面应用
开发语言·后端·rust
Chase_______1 小时前
【Java杂项】String 为什么不可变?从对象引用、常量池到字符串拼接讲清楚
java·开发语言
xwjalyf2 小时前
javascript数组 forEach,filter,some,every,map,find,reduce的用法与区别
开发语言·javascript·json·ecmascript
qq_2518364572 小时前
基于java Web 耗材购置与维修网络申报审批系统设计与实现
java·开发语言·前端
AI玫瑰助手2 小时前
Python函数:def定义函数与参数传递基础
android·开发语言·python