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)

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

相关推荐
LDR0065 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术5 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园5 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob5 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享5 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.5 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..5 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽5 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下5 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
飞天狗1115 天前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言