CryptoJS对密文AES解密失败

情况: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:喜欢的小伙伴收藏和关注哟~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值