Jmeter篇之beanshell加密和解密(SM2)

本文详细介绍了如何在JMeter测试计划中,通过Hutool库进行加密和解密操作,包括设置用户参数,使用Beanshell预处理程序加密HTTP请求参数,后置处理器解密响应结果,并进行了验签的过程。

需求

  • 明文传参,对请求进行加密调用后台接口,后端返回密文响应结果,对返回结果进行解密
    需求分析:
    (1)参数明文填写入参
    (2)发送请求前对明文进行加密,加密后调用后台接口
    (3)后端返回密文响应结果
    (4)对响应结果进行解密

操作

1、打开jmeter,选中测试计划—右键—添加—线程用户—线程组
2、选中线程组,右键—添加—取样器—http请求
3、选中http请求,右键—添加–前置处理器—用户参数
4、选中http请求,右键—添加–前置处理器—beanshell预处理程序
5、选中http请求,右键—添加–后置处理器—beanshell后置处理程序

加密

1、添加用户参数
在这里插入图片描述
2、添加计数器,用来往数据库中添加基础数据,手机号、姓名、住址等不重复。
在这里插入图片描述
在这里插入图片描述

3、用户参数中新增变量,引用计数器中的‘引用名称’,计数器在本文章中没有任务作用,只是说明可以这么使用,用户参数是有用的。
在这里插入图片描述
4、在http请求中添加beanshell预处理程序。
在这里插入图片描述
5、对输入的明文参数进行加密
在这里插入图片描述

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import java.security.KeyPair;

        log.info("加密开始:" ); 

        String timeSpan = StrUtil.toString(System.currentTimeMillis());  //获取时间戳
        String encData = vars.get("drcxencData");//获取东软明文参数,将获取的值保存在encData字段,drcxencData为用户参数中的drcxencData
        vars.put("time", timeSpan);//将获取的时间戳保存在time字段中

        privateKey="XXX";//私钥
        publicKey="MMM";//公钥
        
        SM2 sm2= SmUtil.sm2(privateKey,publicKey);
        String encryptstr = sm2.encryptBcd(encData, KeyType.PublicKey);//SM2加密
        log.info("加密数据:" + encryptstr);//加密数据打印日志
        vars.put("encode", encryptstr);//加密后的数据放在encode字段中,http请求时密文请求,需要传该字段

        String sign1 = sm2.signHex(HexUtil.encodeHexStr(encData+timeSpan));//验签
        log.info("签名:" + sign1);        
        vars.put("sign", sign1);//验签数据保存在sign字段中,方便后续验签使用


6、发送http请求,请求中密文传送数据

在这里插入图片描述
body中传参使用对应前置处理器中获取的字段
在这里插入图片描述
7、加密成功在这里插入图片描述

解密

1、http请求中添加后置处理器-beanshell后置处理器
在这里插入图片描述

 import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import java.security.KeyPair;
import com.alibaba.fastjson.JSONObject;
       //测试公钥和私钥
        String privateKey="xxx";
        String publicKey="mmm";
        SM2 sm2= SmUtil.sm2(privateKey,publicKey);

        //获取时间戳
        String timeSpan = StrUtil.toString(System.currentTimeMillis());
        //获取用户参数中的drcxencData
        String encData = vars.get("drcxencData");
        //解密
        String encryptstr = sm2.encryptBcd(encData, KeyType.PublicKey);        
        log.info("解密开始:" ); 
        String ke1 = prev.getResponseDataAsString();
        log.info("解密响应密文:" + ke1);
	   JSONObject jsonObject = JSONObject.parseObject(ke1);
	   String encData = jsonObject.getJSONObject("result").getString("encData");
        log.info("解密前encData:" + encData);
        String decryptstr =StrUtil.utf8Str(sm2.decryptFromBcd(encData,KeyType.PrivateKey));
        log.info("解密后encData:" + decryptstr);
        vars.put("decode", decryptstr);
        //验签
        String sign1 = sm2.signHex(HexUtil.encodeHexStr(encData+timeSpan));
        boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(encData+timeSpan), sign1);
        log.info("验签数据:" + verify);  

由于接口现在异常,无法获取,之前调试的时候是可以的,可以根据hutool封装的插件,根据里边的样例去写。

https://doc.hutool.cn/pages/index

hutool工具类

JMeter中实现SM2加密SM4解密,需要通过引入外部Java库(jar包)并使用BeanShell脚本进行封装调用。以下是具体的实现方法: ### 1. 准备依赖库 需要将以下jar包拷贝到JMeter的`lib/`目录下: - **加密算法依赖包**:包括实现SM2SM4算法的Java库,例如`sm-crypto.jar`或其他第三方实现库。 - **JSON处理依赖包**:如`gson.jar`或`fastjson.jar`,用于处理加密前后JSON数据的解析与生成。 - **自定义封装工具类jar**:如果已将加/解密封装为工具类,可将该jar包拷贝到JMeter的`lib/ext`目录下,以便在BeanShell脚本中直接调用。 ### 2. 配置JMeter环境 - **重启JMeter**:在将所有依赖jar包放入相应目录后,需重启JMeter以加载新的类库。 - **添加BeanShell处理器**:在HTTP请求中添加“JSR223 PreProcessor”或“BeanShell PreProcessor”,选择BeanShell语言进行脚本编写。 ### 3. SM2加密实现 在BeanShell脚本中实现SM2加密,示例代码如下: ```java import com.union.crypto.asymmetric.SM2; import com.union.util.UnionUtils; // SM2公钥参数 private static String encryptWithSM2(String data) { final String keyX = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"; final String keyY = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"; final String spk = "123"; // 可选参数 final String plain = data + spk; byte[] encData = SM2.encrypt(keyX, keyY, plain.getBytes()); return UnionUtils.bcdhex_to_aschex(encData); } // 获取时间戳 String timestamp = ${__time(/1000,)}; vars.put("timestamp", timestamp); // 对指定参数进行加密 String password = "123abc"; String encrypted = encryptWithSM2(password); vars.put("encryptedPassword", encrypted); log.info("Encrypted Password: " + encrypted); ``` ### 4. SM4解密实现 在BeanShell脚本中实现SM4解密,假设加密数据为十六进制字符串,示例如下: ```java import com.union.crypto.symmetric.SM4; private static String decryptWithSM4(String cipherHex) { final String key = "0123456789ABCDEF"; // 16字节密钥 byte[] cipherBytes = hexStringToByteArray(cipherHex); byte[] decrypted = SM4.decryptECB(cipherBytes, key.getBytes()); return new String(decrypted); } // 十六进制字符串转字节数组 private static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; } // 示例:对加密数据进行解密 String encryptedData = "加密后的十六进制字符串"; String decrypted = decryptWithSM4(encryptedData); vars.put("decryptedData", decrypted); log.info("Decrypted Data: " + decrypted); ``` ### 5. 脚本整合与测试 - **变量传递**:使用`vars.put()`将加密解密结果存储为JMeter变量,供后续请求使用。 - **日志输出**:使用`log.info()`打印调试信息,确保加密/解密过程正确。 - **测试执行**:运行测试计划,验证加密解密是否正确匹配。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值