能否在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应用中的注意事项
- 确保后端传递给Cordova的内容包含Base64密文和十六进制格式的IV(因为IV是随机生成的,每次加密都不一样,必须和密文一起传递)。
- 在Cordova中引入CryptoJS时,若使用模块化版本,需加载对应的模式和填充模块:
const CryptoJS = require('crypto-js'); require('crypto-js/cbc'); require('crypto-js/pad-pkcs7');
内容的提问来源于stack exchange,提问作者Peter Búran
相关产品推荐
相关产品推荐

