最近在使用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)
这些包都是封装好了,直接可用的,这个工具简直太好用了