赞
踩
情况: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其实是一样的。
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
完整示例:
- // 自定义数据
- 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());
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- // 获取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);
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
tip:喜欢的小伙伴收藏和关注哟~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。