一、前言
有些接口的请求会带上sign(签名)进行请求,各接口对sign的签名内容、方式可能不一样,但一般都是从接口的入参中选择部分内容组成一个字符串,然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会有sign的算法描述。这里通过Postman的Pre-request Script以及JMeter的BeanShell前置处理器进行接口签名的处理。(完整代码在每部分的最后)
被测系统teachSignServer:
Gitee:江苏豪之诺软件科技有限公司/KnowledgeBroadcast - Gitee.com
直接双击运行.exe文件即可(密钥文件与conf.ini需要与exe处于同一文件夹下)
其余工具:
1.bundle.js:https://github.com/joolfe/postman-util-lib/tree/master/postman
使用方式我们在后面使用到了再进行介绍
2.json.jar: https://mvnrepository.com/artifact/org.json/json
选择适合的版本
点击bundle
将下载的jar包置于jmeter的./lib/ext下并重启jmeter
被测接口信息:
接口 | URL | Method | Body | 签名规则 |
---|---|---|---|---|
v0 | http://127.0.0.1:5000/api/v0/teachsign | POST | {
"AppKey": "z417App", "AppVer": "1.0.0", "Data": "{"SPhone":"18662255783","EType":0}", "DeviceName": "web", "DeviceType": "web", "Lang": "CN", "Sign": "teachsign", "TimeStamp": 1625456804 } |
appkey,timestamp,data,secret四个字段的值拼接,使用32位md5进行签名 |
v1 | http://127.0.0.1:5000/api/v1/teachsign | POST | {
"appid": "wxd930u", "mch_id": 10100, "device_info": 100, "body": "{"EType":0}", "DeviceType": "", "nonce_str": "ibuaiVc", "sign": "CD198C36632A274C49E5F2F028FA257C", "source": null, "ts": 1625456804 } |
1. 参与签名运算的参数选用入参里边value非空的参数 2. 参与签名运算的参数按照ASCII顺序排序 3. 组合方式:key=value通过&符连接 4. 最后加上盐key=secret(secret在conf.ini中配置,同理后面的私钥与公钥也可在其中进行配置) 5. 使用32位md5进行签名,sign的字母全大写 |
v2 | http://127.0.0.1:5000/api/v2/teachsign | POST | {
"busId": "", "busCnl": "POS", "requJnINo": "abceefgghkjlafksdffdsf", "reqTxnTm": "16:30:16", "serviceCode": "chengxusong", "bussJnIno": "Arabic - Bahrain", "sign": "fsdfsd", "reqTxnDt": "20210907", "nonceStr": "Language", "sysCnl": "OKPOS", "ts": 1631003416 } |
1. 参与签名运算的参数选用入参里边value非空的参数 2. 参与签名运算的参数按照ASCII顺序排序 3. 使用private_key签名 4. 使用SHA256withRSA进行签名 |
二、v0接口
1.Postman
获取请求参数并将body的参数转换为json对象
javascript
var Json = JSON.parse(pm.request.body);
获取所需变量并将新的时间戳更新到json对象中
javascript
var TimeStamp = Date.parse(new Date()) / 1000