You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Cordova中解密Node.js端通过crypto加密的数据?

问题解决:Node.js crypto加密后CryptoJS解密失败

核心问题分析

你代码里的主要问题出在密文的传递格式和CryptoJS的参数要求不匹配:

  • CryptoJS.AES.decrypt的第一个参数需要是Base64字符串或CryptoJS的WordArray,而你传入了Node.js的Buffer,导致解密时无法正确解析密文。
  • 虽然IV的处理逻辑是对的,但密文的转换步骤多余且错误。

修正后的测试代码

const crypto = require('crypto');
const CryptoJS = require('crypto-js');

const algorithm = 'aes-256-cbc';
const key = '01234567890123456789012345678901'; // 32字节,符合AES-256要求
const iv = crypto.randomBytes(16);
const text = 'This is secure text';

// Node.js 加密逻辑(保持不变)
const cipher = crypto.createCipheriv(algorithm, key, iv);
const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]).toString('base64');

// CryptoJS 解密修正逻辑
const decrypted = CryptoJS.AES.decrypt(encrypted, CryptoJS.enc.Utf8.parse(key), {
  mode: CryptoJS.mode.CBC,
  iv: CryptoJS.enc.Hex.parse(iv.toString('hex')),
  padding: CryptoJS.pad.Pkcs7 // 显式指定填充,和Node.js默认一致
}).toString(CryptoJS.enc.Utf8);

console.log(decrypted); // 输出:This is secure text

关键修正点

  • 直接传递Base64密文:把Node.js生成的encrypted(已经是Base64字符串)直接传给CryptoJS.AES.decrypt,不需要转成Buffer。
  • 显式指定填充方式:虽然Node.js和CryptoJS默认都是PKCS#7填充,显式声明可以避免环境差异导致的问题。
  • 密钥一致性:确保key在两端都是用UTF-8编码解析,Node.js的crypto.createCipheriv默认用UTF-8处理字符串密钥,和CryptoJS的CryptoJS.enc.Utf8.parse(key)一致。

实际Cordova应用中的注意事项

  1. 确保后端传递给Cordova的内容包含Base64密文和十六进制格式的IV(因为IV是随机生成的,每次加密都不一样,必须和密文一起传递)。
  2. 在Cordova中引入CryptoJS时,若使用模块化版本,需加载对应的模式和填充模块:
    const CryptoJS = require('crypto-js');
    require('crypto-js/cbc');
    require('crypto-js/pad-pkcs7');
    

内容的提问来源于stack exchange,提问作者Peter Búran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:36:10