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)

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

相关推荐
Aaron - Wistron17 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy123931021618 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
05664619 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄19 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰19 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔19 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
Leighteen19 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
05664620 小时前
Python康复训练——控制流与函数
开发语言·python·学习
峥无20 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波20 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl