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