接口测试 Postman 发送请求,参数实现 MD5 加密签名规则

meiyo · 2018年05月30日 · 最后由 这位小朋友 回复于 2019年05月31日 · 8798 次阅读

在使用 Postman 进行接口测试过程中,部分接口的请求参数会进行 MD5 加密的签名校验。

签名规则

请求参数按照 ASCII 码从小到大排序,追加秘钥,再进行 MD5 加密得到签名值sign。具体步骤如下:
首先,构造待签名字符串。待签名字符的生成规则如下:

  1. 请求参数都按照名称 ASCII 码,升序排列 (参数名称不允许相同)
  2. 如果参数值带有中文, 需要制定字符集编码为 UTF-8
  3. 如果参数值为空,那么该参数不参与签名
  4. 秘钥作为最后一个参数, 参数名为:key 将请求参数按上述顺序用&拼接。 然后,用 MD5 算法,对待签名字符串进行加密, 生成的签名数据(32 位小写字符), 即是参数中sign的值。

在 Postman 中 pre-request script 的具体实现

  1. 设置环境变量keysign key值是秘钥;sign值随意设置。
  2. 请求参数设置中,引用sign
  3. Pre-request-Script 中写 MD5 加密签名规则的脚本
console.log(request.data);
keys = Object.keys(request.data).sort() //请求参数名按照ASCII码升序排序

//拼接待签名字符串
var str = []
for (var p = 0; p < keys.length; p++) { 
    if(keys[p] == "sign" || request.data[keys[p]] === ""){ // "==" ==宽松相等,隐性类型转换,值相等,返回true; "===" 严格相等,值和类型都相等,返回true
        continue;
    }
    str.push(keys[p] + "=" + request.data[keys[p]]);
}
str.push('key=' + pm.environment.get("key"))
var sign = str.join("&")  

//MD5加密签名规格,并赋值给环境变量`sign`
pm.environment.unset("sign");
pm.environment.set("sign", CryptoJS.MD5(sign).toString());

注意
在单个请求的 Pre-request-Script 中添加脚本,脚本只对该请求参数生效。

如果,在一个 Collection 或 Folder 中的所有请求的参数的处理相同,可以在 Collection 或 Folder 的 Pre-request-Script 中添加脚本。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 8 条回复 时间 点赞

确实是一种解决方法,就是需要在每个请求的 Pre-request-Script 里都要添加这份脚本,稍显麻烦点
我们是用 anyproxy 做中间代理,来处理请求和响应中的加密签名的

tonglei 回复

谢谢,目前没有使用过 anyproxy,可以说明如何使用 anyproxy 处理请求和响应中的加密签名吗?非常感谢啦!😀

meiyo 回复

请求是明文发送到 Anyproxy,Anyproxy 把请求做加密签名处理,再发送到服务端
Anyproxy 接收服务端的响应,同样做解密处理,再发送到 Postman

tonglei 回复

嗯嗯,谢啦,我会学习使用下的。

仅楼主可见
海波 回复

清除和设置环境变量是 postman 中内置的脚本;我不太清除你为什么会报错。我用的 postman app 版本是 6.1.3

console.log(request.data); 获取不到值吖

wyj19881227 回复

要在 console 中才能看到

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册