在进行日常的性能测试工作中,难免会遇到请求参数需要进行加密传输的情况,笔者将根据自己在测试过程中遇到的问题,说明加密方法的使用(Jmeter 版本为5.1.1)。
场景一:请求参数进行base64加密
场景说明:有A 、B两个请求,通过调用请求A,使用边界提取器获取A的响应中的cust_id值,使用beanShell 后置处理器对cust_id 进行base64 加密。加密后的数据再作为请求B的参数使用。
1. 编写Jmeter脚本结构
注意:beanShell 后置处理器不是在请求A的内部。
2. 在beanShell中调用base64加密方法
方法一:
import org.apache.commons.codec.binary.Base64;
String tmp = Base64.encodeBase64String("${cust_id}".getBytes("utf-8"));
log.info("===========" + tmp);
vars.put("b64_custId",tmp);
注意:如果使用上述代码加密后,调用B请求报错,可尝试更换加密方法二
方式二:
import sun.misc.BASE64Decoder;
String tmp = new sun.misc.BASE64Encoder().encode("${cust_id}".getBytes());
log.info("=================" + tmp);
vars.put("b64_custId", tmp);
3. 使用加密后的参数
通过查看结果数,可以看到入参中的cust_id已经变成了解密后的字符串
场景二:响应结果需要进行base64 解密
场景说明:在诸如APP或者小程序中出于安全性的考虑,请求的返回结果是经过base64加密之后的,我们需要进行解密后再判断请求是否成功。
1. Jmeter 脚本结构
import sun.misc.BASE64Decoder;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
String res = "eyJlcnJvckNvZGUiOiAiTVMwMDAwMDIiLCJlcnJvck1lc3NhZ2UiIDogIk1pc3NpbmcgUGFyYW1ldGVyIiwiZXJyb3JEZXNjcmlwdGlvbiI6ICJNaXNzaW5nIFBhcmFtZXRlci4ifQ==";
//String aa = prev.getResponseDataAsString(); // 获取上一个请求的结果
log.info("原始加密串:"+ res);
// base64解密
BASE64Decoder decoder = new BASE64Decoder();
String tmp = new String(decoder.decodeBuffer(res),"utf-8");
log.info("解密后的串:" + tmp);
// 字符串转json对象
JSONObject json = JSONObject.parseObject(tmp);
String code = json.getString("errorCode");
log.info("返回结果值:" + code);
// 判断结果
if(!code.equals("0")){
Failure = true;
}
代码说明:
- 字符串变量res 相当于是请求C的返回结果。你也可以用 prev.getResponseDataAsString()来直接获取上一次请求的全部返回结果。
- 调用base64的解密方法对字符串进行解密;
- 将解密后的字符串转换为json对象,目的是取出我们想要校验的字段,也可以用正则表达式提取想要校验的节点。
- 判断断言结果
场景三:请求参数中带有签名字段
场景说明:一般在APP的请求中会涉及到签名字段,比如前后端开发人员会协商一个key,用来和其他的字段一起通过md5加密后生产一个签名字段sign,再把该字段作为一个请求参数,比如:
https://xxx.xxx.xx/getinfo?timestamp=1587972142&appid=1231231231313&token=qwrqfqfqqtqg8&sign=tqwsvdfqqwreqrwqrqre==
生成签名的步骤:
- 先协商好密钥key=12431414141414144124
- 获取所有请求参数的字符串str1:appid=1231231231313×tamp=1587972142&token=qwrqfqfqqtqg8
- 对str1 按照ASCII 进行排序,得到str2:
appid=1231231231313×tamp=1587972142&token=qwrqfqfqqtqg8 - 将str2 和 密钥key 进行拼接得到str3:
appid=1231231231313×tamp=1587972142&token=qwrqfqfqqtqg8&key=12431414141414144124 - 调用md5加密算法,对str3进行加密,从而得到sign签名字段的值。
1. Jmeter 脚本结构
说明:在需要使用签名字段的请求上面创建一个beanShell 预处理程序
2. 调用md5加密方法进行加密
步骤说明:
- 根据开发人员提供的key 先定义好待加密字符串(字符串中可能包含固定的字符串以及其他参数化变量)
- 调用md5加密方法,对字符串进行加密,生成签名字段后并报存到新的变量中,供下面的请求调用。
- 在后面的请求中引用签名字段
import org.apache.commons.codec.digest.DigestUtils;
String str = "appid=wxfe88409e05440687×tamp=${__time(/1000,timeStamp)}&token=qrqvdstgertnberth9&key=0124428123123215641";
String sign = DigestUtils.md5Hex(str);
log.info(str);
vars.put("md5_sign",sign);
3. 引用签名字段
后面将持续分享Jmeter在使用过程中的项目经验,如果帮到您,还请给个赞(:
今天的文章Jmeter 脚本中使用base64 加解密、MD5加密分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60950.html