vscode需依赖系统已安装的node.js(≥18.0)才能运行crypto模块;必须配置launch.json调试环境以支持断点和buffer观察;crypto.createcipheriv密钥与iv须用buffer.from()显式转换,且前后端aes参数(模式、填充、编码)须严格一致。

VSCode 本身不运行 Node.js,必须先确认系统已安装 Node.js 并能执行 node -v 和 npm -v;crypto 是内置模块,无需 npm install,但直接写代码不配置调试环境会导致断点失效、console.log 输出混乱、IV 或密钥生成不可复现。
确认 Node.js 已全局可用且版本 ≥18.0
VSCode 只是编辑器,crypto 模块依赖 Node.js 运行时。很多“加解密失败”问题根源其实是 Node 版本太低或根本没装 Node:
- 在终端执行
node -v,输出应为v18.17.0或更高(Node 16 已 EOL,部分 crypto API 如createCipheriv的 GCM 模式在旧版行为异常) - 若报错
command not found: node,去 nodejs.org 下载 LTS 版并完整安装,macOS/Linux 用户注意 PATH 是否包含/usr/local/bin - Windows 用户常见坑:安装时勾选了 “Add to PATH”,但 PowerShell 或 VSCode 终端未重启——关掉所有终端窗口再重开 VSCode
用 launch.json 启动调试而非直接 node index.js
直接终端运行无法观察 Buffer、iv、key 的二进制内容,也无法在 cipher.update() 中间暂停。必须配调试:
- 项目根目录建
.vscode/launch.json,内容至少含:
{
"version": "0.2.0",
"configurations": [{
"type": "node",
"request": "launch",
"name": "Launch crypto test",
"skipFiles": ["<node_internals>/**"],
"program": "${workspaceFolder}/index.js",
"console": "integratedTerminal",
"env": { "NODE_OPTIONS": "--enable-source-maps" }
}]
}</node_internals>
- 关键点:
"console": "integratedTerminal"确保输出和 stdin 正常;"env"开启 source map 方便调试 async/await 加密流程 - 不配
launch.json就点 ▶️ 运行,VSCode 实际调用的是默认 shell 命令,断点全失效
crypto.createCipheriv 必须用 Buffer.from() 转密钥和 IV
Node.js crypto 对参数类型极其敏感,字符串直传会静默失败或产生错误密文:
- 错误写法:
crypto.createCipheriv("aes-256-cbc", "mykey123", iv)—— 密钥长度不符("mykey123" 是 8 字节,AES-256 需 32 字节),且未声明编码 - 正确写法:
crypto.createCipheriv("aes-256-cbc", Buffer.from("mykey1234567890123456789012345678", "utf8"), iv) - 更安全做法:用
crypto.randomBytes(32)生成密钥,存于环境变量或 KMS,绝不在代码里硬编码字符串密钥 - IV 必须每次加密都新生成(
crypto.randomBytes(16)),且解密时必须用**完全相同的 Buffer**,不能 toString() 再 parse 回来(编码损失精度)
前后端 AES 参数对齐:模式、填充、编码三者缺一不可
前端用 crypto-js、后端用 Node crypto,90% 的“解密乱码”源于参数不一致:
- 模式必须一致:如前端
CryptoJS.mode.CBC→ 后端必须用aes-256-cbc,不能写成aes256或AES-256-CBC(Node 严格区分大小写和短横) - 填充必须一致:crypto-js 默认
Pkcs7,Node 无显式填充参数,但createDecipheriv在 CBC 模式下默认按 PKCS#7 补齐,只要 IV 和密钥对就得通 - 编码必须一致:前端
encrypted.toString()默认 base64 → 后端decipher.update(encrypted, "base64", "utf8");若前端用 hex,则后端必须用"hex" - 致命陷阱:crypto-js 的
iv是CryptoJS.enc.Utf8.parse("16BytesIvString"),而 Node 要Buffer.from("16BytesIvString", "utf8"),二者字节完全等价;但若前端用CryptoJS.enc.Hex.parse("..."),后端就必须用Buffer.from("...", "hex")
IV 和密钥的序列化/传输是高频出错点:永远用 buffer.toString("base64") 编码传输,接收方用 Buffer.from(str, "base64") 还原,避免 hex/base64 混用或漏写 encoding 参数。











