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

需求

  • 明文传参,对请求进行加密调用后台接口,后端返回密文响应结果,对返回结果进行解密
    需求分析:
    (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工具类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值