情况:Postman 使用 CryptoJS 对数据 AES解密后 与 AES在线工具 解密不一致。
原因:数据中 "\n\r" 在 postman 中有不同含义,比如: "\r" 在windows"回车",在mac"换行"
方案:待解密数据 "\n\r"替换成 "",已保证数据连续不被 "\n\r" 切割。
// 用UTF-8进行编码的字符串(按需进行处理,例如按Base64对密钥进行加密等)
var key = CryptoJS.enc.Utf8.parse(dataSecret);
var iv = CryptoJS.enc.Utf8.parse(dataSecretIv);
// 自定义数据内容
var data = {
"appId":appId,
"appKey": appKey
};
// 对数据进行AES加密
var encryptData = CryptoJS.AES.encrypt(JSON.stringify(data), key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString();
// 对数据进行AES解密(注意JS或Postman中,返回的结果如果含有换行符,先处理再解密)
var decryptStr = encryptData.toString().replace(/\r\n/g,"").replace(/\n/g,"");
var decryptData = CryptoJS.AES.decrypt(response.data, key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
// 均上为伪码,注意使用。备注: PCKS7和5其实是一样的。
完整示例:
// 自定义数据
var data = {
"outOrderId": "202003061634082266",
"driverId": "5757857",
"stubId": "1412729998476976128",
"gunId": "1",
"org": "TS",
"time": 1457689012,
"preFrozenAmount": 30.00
};
// 重写Date的format函数
Date.prototype.Format = function (fmt) { // author: meizz
var o = {
"M+": this.getMonth() + 1, // 月份
"d+": this.getDate(), // 日
"h+": this.getHours(), // 小时
"m+": this.getMinutes(), // 分
"s+": this.getSeconds(), // 秒
"q+": Math.floor((this.getMonth() + 3) / 3), // 季度
"S": this.getMilliseconds() // 毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
// 基于时间+4位随机数
var outOrderId = new Date().Format("yyyyMMddhhmmss") + Math.round(Math.random()*9999);
pm.environment.set("outOrderId", outOrderId);
data.outOrderId = outOrderId;
// 获取Postman环境变量
var appSecret =pm.environment.get("appSecret");
var dataSecret = pm.environment.get("dataSecret");
var dataSecretIv = pm.environment.get("dataSecretIv");
var timeStamp = pm.environment.get("timeStamp");
var key = CryptoJS.enc.Utf8.parse(dataSecret);
var iv = CryptoJS.enc.Utf8.parse(dataSecretIv);
// 数据加密(AES + HmacMD5 )
var encryptData = CryptoJS.AES.encrypt(JSON.stringify(data), key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString()
var sign = encryptData + timeStamp;
sign = CryptoJS.HmacMD5(sign, appSecret);
pm.environment.set("data", encryptData);
pm.environment.set("sign", sign.toString().toUpperCase());
// 获取Postman的环境变量
var appId = pm.environment.get("appId");
var appKey =pm.environment.get("appKey");
var appSecret =pm.environment.get("appSecret");
var dataSecret = pm.environment.get("dataSecret");
var dataSecretIv = pm.environment.get("dataSecretIv");
// 按需处理,UTF-8 -> 密钥和矢量
var key = CryptoJS.enc.Utf8.parse(dataSecret);
var iv = CryptoJS.enc.Utf8.parse(dataSecretIv);
// ------------------------------------------
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
var response = JSON.parse(responseBody);
if(response.code === 100){
var decryptStr = response.data.toString().replace(/\r\n/g,"").replace(/\n/g,"");
var decryptData = CryptoJS.AES.decrypt(decryptStr, key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
console.log(decryptData);
postman.setEnvironmentVariable("orderId",JSON.parse(decryptData).orderId);
return;
}
console.log(response);
tip:喜欢的小伙伴收藏和关注哟~