如何利用Apifox通过签名计算及数据加解密进行用户认证接口测试?
阅读原文时间:2023年07月08日阅读:4

用户注册场景:输入签名数据signature,appId,13位时间戳timestamp,6位随机数nonce,merchantId(非必填,本次不填)的请求参数发送给服务器,服务器返回响应数值后,校验响应数据中的signature是否一致,并且对响应数据中的data进行解密;在控制台获取resData的属性值,partnerUserNo的属性值,即用户注册成功

请求:签名计算及参数加密:

1.用户注册接口,需要对用户的nonce, times,以appSecret为密钥进行MD5加密得到签名数据;

2.将加密参数转为字符串,以appSecret为密钥,iv向量:sdkppillowserver用cbc模式的对数据进行加密;

3.将签名计算和加密后的数据放进请求参数里,并且更新原有的请求参数timestamp.

一:实现签名计算具体实现步骤如下:

(1)确定请求方法,请求地址,请求头,测试环境等参数准确;

(2)请求参数appId(找开发要),,6位随机数nonce(自己设置),timestamp(后续脚本生成),signature(后续脚本生成),填入请求Body里

(3)设置请求参数,将请求参数设置为变量datajson,由于从服务端接受的数据都是json字符串,需将它转化为对象;

var body = pm.variables.replaceIn(pm.request.body.raw);

var datajson = JSON.parse(body);

(4)签名计算,设置一个变量attrs包含nonce, times,appSecret的值,

将attrs转为字符串,以字符串形式由低到高进行排序,得到变量toSign;

const appSecret = 'rbjaiz0f9s0cohla3w8jiwo3006xxxxx';

var attrs = [appSecret, datajson.nonce];

var times = new Date().getTime(); attrs.push(times);

toSign = attrs.sort().join("");

(5)将数据使用MD5加密,由于我使用的是APIFOX,加密前需要调取crypto-js库;

在库里寻找MD5的加密算法语句如下

var CryptoJS = require("crypto-js");

const sign = CryptoJS.MD5(toSign).toString();

如果你不确定是否有计算出数据,可在控制台打印出来,如下:

console.log("请求参数的签名计算",sign);

以上就是签名计算的整个实现过程.

二:数据加密

将加密参数转为字符串,以appSecret为密钥,iv向量:sdkppillowserver用cbc模式,对数据进行aes256加密,并且进行Base64编码;

(1)将加密赋值给变量datatable,由于我们用户认证没有需要加密的参数,我们可以设置为空对象{}

const datatable = {}

(2)将对象转化为JSON字符串;

const dataString = JSON.stringify(datatable);

(3)对加密参数,appSecret,sdkppillowserver进行加密

const iv = CryptoJS.enc.Utf8.parse("sdkppillowserver");

const appSecretArr = CryptoJS.enc.Utf8.parse(appSecret);

const encryptText = CryptoJS.enc.Utf8.parse(dataString);

const encrypted = CryptoJS.AES.encrypt(encryptText, appSecretArr, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });

const encryptionData = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

console.log("加密后data数据",encryptionData); //我们通过控制台打印加密后的数据

三:更新请求体

(1)将加密数据,签名计算,时间戳添加到请求体中,并更新请求体.

datajson.data = encryptionData;

datajson.signature = sign;

datajson.timestamp = times;

pm.request.body.update(JSON.stringify(datajson, null, 2));

console.log("包含签名,时间戳的请求参数",datajson);   //返回给服务器的数据以JSON字符串的形式返回

以上就是请求体中签名计算和数据加密

响应后置:我们需要校验服务器返回的签名是否一致,并且对加密的数据进行破解

一:校验返回的签名数据是否一致

(1)设置变量获取响应体信息

var dataData = pm.response.json().data;

console.log("respData:",dataData)

(2)计算签名

const appSecret = 'rbjaiz0f9s0cohla3w8jiwo300xxxxxx';

var attrs = [appSecret, dataData.nonce,dataData.timestamp];

console.log("后置的签名数据:",attrs) toSign = attrs.sort().join("");

var CryptoJS = require("crypto-js");

const sign = CryptoJS.MD5(toSign).toString(); console.log("后置的签名计算",sign);

(3)断言签名是否与响应数据一致

pm.test("验证签名是否一致", function () { pm.expect(dataData.signature).to.eql(sign); });

(4)对响应数据的元素data进行解密

二:对响应数据的元素data进行解密

const iv = CryptoJS.enc.Utf8.parse("sdkppillowserver");

const arr = CryptoJS.enc.Utf8.parse(appSecret);

const base64 = CryptoJS.enc.Base64.parse(dataData.data);

const decryptText = CryptoJS.enc.Base64.stringify(base64);

const decryptionData = CryptoJS.AES.decrypt(decryptText, arr, { iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); console.log("解密的结果展示",decryptionData);

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章