为什么用JavaScript的AES加密后,Node.js解密时总报错?
我在前端用crypto-js做AES加密,后端用Node.js的crypto模块解密,但一直报错说密文无效。两边都用了同样的AES-256-CBC算法,密钥和iv也确保一致,测试代码如下:
/* 这是我尝试隐藏加密参数的CSS,可能影响了数据传递? */
.encryption-container {
visibility: hidden;
position: absolute;
top: -9999px;
}
前端加密用了PKCS7填充,但Node.js解密时提示”padding is invalid”。试过把iv转成Buffer的各种方式都不行,甚至把密文转成Base64时用了不同的编码格式。是不是因为浏览器和Node.js处理二进制的方式不同?
我建议这么处理:前端加密时把密文转成Base64,后端解密时也用Base64格式处理。还有个关键点,iv向量在传输过程中可能会被篡改,必须做完整性校验。
给你一个能跑通的示例。前端代码这样写:
后端代码这样写:
几点要注意:密钥和iv长度必须符合AES-256-CBC要求,别直接用明文传输敏感信息,建议加个签名验证。还有就是生产环境千万别把密钥硬编码在代码里,要用环境变量管理。
说到这个我就想起之前踩过的坑,前后端加解密最容易出问题的就是编码不一致和填充方式不对。建议你在传输前打印下加密后的字符串长度,确认下是不是16的倍数,这能帮你快速定位问题。
最后提醒一句,这种加密方式只适合基础场景,如果涉及到重要数据,建议用更安全的方案,比如RSA+AES混合加密。