2024年软件测试最全使用Postman和JMeter进行signature签名_kjur,2024年最新软件测试入门教程

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

var Data = Json.Data;
var secretKey = “a323f9b6-1f04-420e-adb9-b06ty67b0e63”;

/*

  • 拼接字符串并加密
    */
    var str = AppKey + TimeStamp + Data + secretKey;
    var strmd5= CryptoJS.MD5(str).toString(); // 调用方法进行md5运算并将生成的hash序列转换为字符串
    Json.Sign = strmd5; // 修改JSON
    pm.request.body.raw = JSON.stringify(Json); // 将修改后的JSON写回到请求体中

#### 2.JMeter


在JMeter的时间戳可以直接使用JMeter自带函数在body中获取,当然也可以在BeanShell前置处理器中使用代码获取


/1000是因为JMeter默认生成的时间戳为13位时间戳,我们只需要10位即可。



[![](https://img-blog.csdnimg.cn/img_convert/899c3be31a3bb87f7a78abee89edb310.png)](https://img2023.cnblogs.com/blog/2687725/202312/2687725-20231215105449144-2111718417.png)


导包(org.json为第三方jar包)


java



import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.config.;
import org.json.
;


获取请求传入的body,将其转化为Json对象


java



// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
JSONObject dataobj = new JSONObject(arg.getValue());


获取变量并拼接


java



String TimeStamp = dataobj.optString(“TimeStamp”);
String AppKey = dataobj.optString(“AppKey”);
String Data = dataobj.optString(“Data”);
String secretKey = “a323f9b6-1f04-420e-adb9-b06ty67b0e63”;
String str = AppKey + TimeStamp + Data + secretKey;


进行md5运算


java



sign = DigestUtils.md5Hex(str);


修改json对象的sign并转换为字符串写回body中


java



dataobj.put(“Sign”, sign); // 修改Sign
arg.setValue(dataobj.toString()); // 转换为字符串并歇回request-body中


**完整代码:**


java



import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.config.;
import org.json.
;

/*

  • 获取请求传入的body,将其转化为Json对象
    */
    // 获取请求
    Arguments arguments = sampler.getArguments();
    // 获取请求中的body内容
    Argument arg = arguments.getArgument(0);
    // 获取body的value,并将其转化为JSONObject对象
    JSONObject dataobj = new JSONObject(arg.getValue());

/*

  • 获取变量并拼接字符串
    */
    // 获取变量
    String TimeStamp = dataobj.optString(“TimeStamp”);
    String AppKey = dataobj.optString(“AppKey”);
    String Data = dataobj.optString(“Data”);
    String secretKey = “a323f9b6-1f04-420e-adb9-b06ty67b0e63”;
    // 字符串拼接
    String str = AppKey + TimeStamp + Data + secretKey;

/*

  • 签名,更新body
    */
    sign = DigestUtils.md5Hex(str); // md5运算
    dataobj.put(“Sign”, sign); // 修改Sign
    arg.setValue(dataobj.toString()); // 转换为字符串并写回request-body中

### 三、v1接口


#### 1.Postman


​ 获取请求参数并将body的参数转换为json对象


javascript



var Json = JSON.parse(pm.request.body);


获取时间戳并修改json对象


javascript



var ts = Date.parse(new Date()) / 1000 - 10;
Json.ts = ts;


去除sign参数本身,然后去除值是空的参数


javascript



var keys = [];
// 循环遍历JSON
for (let k in Json ){
// 排除json中键位sign以及值为空的数据
if (k == ‘sign’ || !Json[k]){
continue;
}
keys.push(k); // 生成筛选后的key序列
}


排序


javascript



keys.sort();


拼接字符串


javascript



let keys_str = ‘’;
for (let x of keys){
keys_str += ${x}=${Json[x]}&; // 使用模版字符串进行拼接
}
keys_str = keys_str + “key=a323f9b6-1f04-420e-adb9-b06ty67b0e63”;


进行md5运算并将生成的hash序列转换为字母全大写字符串


javascript



var strmd5= CryptoJS.MD5(keys_str).toString().toUpperCase();


修改json对象中sign并将md5对象写回body中


javascript



Json.sign = strmd5;
pm.request.body.raw = JSON.stringify(Json);


**完整代码:**


javascript



/*
v1加密规则:
1. 参与签名运算的参数选用入参里边value非空的参数
2. 参与签名运算的参数按照ASCII顺序排序
3. 组合方式:key=value通过&符连接
4. 最后加上key=secret
5. 使用32位md5签名,sign的字母全大写
*/

/*

  • 获取请求参数
    */
    var Json = JSON.parse(pm.request.body);
    var ts = Date.parse(new Date()) / 1000 - 10; // 获取时间戳
    Json.ts = ts; // 修改json

/*

  • 去除sign参数本身,然后去除值是空的参数
    */
    var keys = []; // 定义key序列
    // 循环遍历JSON
    for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    if (k == ‘sign’ || !Json[k]){
    continue;
    }
    keys.push(k); // 生成筛选后的key序列
    }

/*

  • 对请求参数排序
    */
    keys.sort();

/*

  • 拼接字符串
    */
    let keys_str = ‘’;
    for (let x of keys){
    keys_str += ${x}=${Json[x]}&; // 使用模版字符串进行拼接
    }
    keys_str = keys_str + “key=a323f9b6-1f04-420e-adb9-b06ty67b0e63”;

/*

  • 签名并更新body
    */
    var strmd5= CryptoJS.MD5(keys_str).toString().toUpperCase(); // 调用方法进行md5运算并将生成的hash序列转换为字母全大写字符串
    Json.sign = strmd5; // 修改Json
    pm.request.body.raw = JSON.stringify(Json);

#### 2.JMeter


同样在body中使用内置函数定义时间戳ts


导包


java



import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.config.;
import org.json.
;


获取请求传入的body,将其转化为Json对象


java



// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
JSONObject dataobj = new JSONObject(arg.getValue());


获取Json的key


java



// 创建list存储body中的key值
List keyArry = new ArrayList();
// 生成迭代对象
Iterator iterator = dataObj.keys();
// 循环key,将其放入list
for (String key : iterator) {
if (!key.equals(“sign”) && !key.equals(“Sign”)) {
keyArry.add(key);
}
}


对list进行排序


java



Collections.sort(keyArry);


字符串拼接


java



String str = “”;
for (String s : keyArry) {
// log.error(s);
String value = dataObj.optString(s);
// 剔除值为空或值为null的参数
if (!value.equals(“”) && !value.equals(null)) {
str = str+s+“=”+ value+“&”;
}
}
str = str + “key=a323f9b6-1f04-420e-adb9-b06ty67b0e63”;


进行md5运算并转换为字母全大写


java



String sign = DigestUtils.md5Hex(str).toUpperCase();


修改json对象的sign并转换为字符串写回body中


java



dataobj.put(“sign”, sign); // 修改Sign
arg.setValue(dataobj.toString()); // 转换为字符串并歇回request-body中


**完整代码:**


java



import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.config.;
import org.json.
;

/*

  • 获取请求传入的body,将其转化为Json对象
    */
    // 获取请求
    Arguments arguments = sampler.getArguments();
    // 获取请求中的body内容
    Argument arg = arguments.getArgument(0);
    // 获取body的value,并将其转化为JSONObject对象
    JSONObject dataObj = new JSONObject(arg.getValue());

/*

  • 获取Json的key进行排序
    */
    // 创建list存储body中的key值
    List keyArry = new ArrayList();
    // 生成迭代对象
    Iterator iterator = dataObj.keys();
    // 循环key,将其放入list
    for (String key : iterator) {
    if (!key.equals(“sign”) && !key.equals(“Sign”)) {
    keyArry.add(key);
    }
    }

/*

  • 对list进行排序
    */
    Collections.sort(keyArry);

/*

  • 循环list中的key,读取对应的Value组成字符串
    */
    String str = “”;
    for (String s : keyArry) {
    String value = dataObj.optString(s);
    // 剔除值为空或值为null的参数
    if (!value.equals(“”) && !value.equals(null)) {
    str = str+s+“=”+ value+“&”;
    }
    }
    str = str + “key=a323f9b6-1f04-420e-adb9-b06ty67b0e63”;

/*

  • 签名并更新body
    */
    String sign = DigestUtils.md5Hex(str).toUpperCase(); // 进行md5运算并转换为字母全大写
    dataobj.put(“sign”, sign); // 修改Sign
    arg.setValue(dataobj.toString()); // 转换为字符串并写回request-body中

### 四、v2接口


#### 1.Postman


将下载后的json导入到postman,进入**Lib install**请求



[![](https://img-blog.csdnimg.cn/img_convert/469d041059237c3f7fdad93b9db77a56.png)](https://img2023.cnblogs.com/blog/2687725/202312/2687725-20231215105449400-1925746984.png)


发送请求,该请求会将bundle.js写入到全局变量中



[![](https://img-blog.csdnimg.cn/img_convert/8889aec8dd2bd0366fca020548feff69.png)](https://img2023.cnblogs.com/blog/2687725/202312/2687725-20231215105449650-1653600255.png)


获取请求参数并将body的参数转换为json对象


javascript



var Json = JSON.parse(pm.request.body);


获取时间戳并修改json对象


javascript



var ts = Date.parse(new Date()) / 1000 - 10;
Json.ts = ts;


去除sign参数本身,然后去除值是空的参数


javascript



var keys = [];
// 循环遍历JSON
for (let k in Json ){
// 排除json中键位sign以及值为空的数据
if (k == ‘sign’ || !Json[k]){
continue;
}
keys.push(k); // 生成筛选后的key序列
}


排序


javascript



keys.sort();


拼接字符串


javascript



let keys_str = ‘’;
for (let x of keys){
keys_str += ${x}=${Json[x]}&; // 使用模版字符串进行拼接
}
keys_str = keys_str.slice(0,-1); // 删除最后一个&


导入刚才写入到全局变量的js


javascript



eval(pm.globals.get(“pmlib_code”));


由于私钥过长,所以这里把私钥的内容写到环境变量中,私钥内容可在pkcs8\_rsa\_private\_key.pem查看(私钥与公钥可自行更换,在conf.ini中进行配置即可)



[![](https://img-blog.csdnimg.cn/img_convert/f8269904c38f01e1fb5086f3803b6466.png)](https://img2023.cnblogs.com/blog/2687725/202312/2687725-20231215105449873-1545456966.png)


获取私钥


javascript



const privatekey = pm.environment.get(“privatekey”);


加密


javascript



const sha256withrsa = new pmlib.rs.KJUR.crypto.Signature({“alg”: “SHA256withRSA”}); // 生成签名对象并制定为SHA256withRSA类型
sha256withrsa.init(privatekey); // 初始化privatekey
sha256withrsa.updateString(keys_str); // 更新要签名的数据
const sign = pmlib.rs.hextob64(sha256withrsa.sign()); // 签名并转换为Base64字符串


修改json对象中sign并将md5对象写回body中


javascript



Json.sign = sign;
pm.request.body.raw = JSON.stringify(Json); // 将修改后的JSON转换回字符串格式写回到请求体中


**完整代码:**


javascript



/*
v2加密规则:
1. 参与签名运算的参数选用入参里边value非空的参数
2. 参与签名运算的参数按照ASCII顺序排序
3. 使用private_key签名
4. 使用SHA256withRSA进行签名
*/

/*

  • 获取请求参数
    */
    var Json = JSON.parse(pm.request.body);
    var ts = Date.parse(new Date()) / 1000 - 10; // 获取时间戳
    Json.ts = ts; // 修改json

/*

  • 去除sign参数本身,然后去除值是空的参数
    */
    var keys = []; // 定义key序列
    // 循环遍历JSON
    for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    if (k == ‘sign’ || !Json[k]){
    continue;
    }
    keys.push(k); // 生成筛选后的key序列
    }

/*

  • 对请求参数排序
    */
    keys.sort();

/*

  • 拼接字符串

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

) / 1000 - 10; // 获取时间戳
Json.ts = ts; // 修改json

/*

  • 去除sign参数本身,然后去除值是空的参数
    */
    var keys = []; // 定义key序列
    // 循环遍历JSON
    for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    if (k == ‘sign’ || !Json[k]){
    continue;
    }
    keys.push(k); // 生成筛选后的key序列
    }

/*

  • 对请求参数排序
    */
    keys.sort();

/*

  • 拼接字符串

[外链图片转存中…(img-ll2sFCYY-1715177785453)]
[外链图片转存中…(img-JuHnGqih-1715177785454)]
[外链图片转存中…(img-dwZozsDi-1715177785454)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值