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

在CookieStorage中进行字符串加解密遇方法过时失效问题求助

解决Node.js Crypto模块过时方法及加密失效问题

看起来你遇到的问题主要来自三个方面:废弃的加密API、算法名称错误,还有一个不起眼的拼写失误,咱们一步步来修复:

问题拆解

  1. 过时API警告:crypto.createCipher()和crypto.createDecipher()已经被Node.js标记为废弃,这两个方法依赖的EVP_BytesToKey密钥派生方式安全性不足,官方明确推荐使用createCipheriv()和createDecipheriv()替代。
  2. 算法名称错误:你写的aes-256-ct是无效算法,正确的应该是aes-256-ctr(计数器模式的AES-256加密),这也是功能无法运行的核心原因之一。
  3. 拼写失误:代码里的requite('crypto')应该是require('crypto'),这个小错误会直接导致模块加载失败。

修复后的完整代码

下面是更新后的加密解密逻辑,使用安全的现代API,同时保证功能正常运行:

const crypto = require('crypto'); // 修正拼写错误
app.get("/crypto", (req, res) => {
  const word = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVlMzBiZjE0YmQ4OTNmMmE5Y2Q1Y2I5MSIsInJvbGVzIjoiVVNFUl9ST0xFIiwiZW1haWwiOiJjYW1lcmF0ZXN0ODExQGdtYWlsLmNvbSIsImlhdCI6MTU4MDMzNjc1MCwiZXhwIjoxNTgwMzk2NzUwfQ.2bbqkoX7qhyX7lyLjBtlGPe08-oHGjO83nNIPxAzHv8";
  const algorithm = "aes-256-ctr"; // 修正算法名称
  const password = "3zTvzr3p67VC61jmV54rIYu1545x4TlY";

  try {
    const encrypted = encrypt(word, algorithm, password);
    console.log("encrypt: ", encrypted);
    const decrypted = decrypt(encrypted, algorithm, password);
    console.log("decrypt: ", decrypted);
    res.send({ encrypted, decrypted });
  } catch (err) {
    console.error("加密/解密出错:", err);
    res.status(500).send("加密解密失败");
  }
});

function encrypt(text, algorithm, password) {
  // 生成随机初始化向量(IV),AES块大小为16字节,IV也用16字节保证安全性
  const iv = crypto.randomBytes(16);
  // 用scrypt从密码派生32字节密钥(AES-256需要32字节密钥)
  const key = crypto.scryptSync(password, 'your-custom-salt', 32);
  // 创建Cipher实例
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  // 执行加密
  let encrypted = cipher.update(text, "utf8", "hex");
  encrypted += cipher.final("hex");
  // 将IV和密文拼接(IV是解密必需项,需和密文一起存储/传输)
  return `${iv.toString('hex')}:${encrypted}`;
}

function decrypt(text, algorithm, password) {
  // 拆分IV和密文
  const [ivHex, encryptedText] = text.split(':');
  const iv = Buffer.from(ivHex, 'hex');
  // 用相同的盐和密码派生密钥
  const key = crypto.scryptSync(password, 'your-custom-salt', 32);
  // 创建Decipher实例
  const decipher = crypto.createDecipheriv(algorithm, key, iv);
  // 执行解密
  let decrypted = decipher.update(encryptedText, "hex", "utf8");
  decrypted += decipher.final("utf8");
  return decrypted;
}

关键细节说明

  • IV的必要性:初始化向量(IV)是随机生成的,每次加密都不同,它能保证相同明文和密钥加密后得到不同密文,避免重复模式泄露信息。解密时必须使用加密时的同一个IV,所以我们把IV转成十六进制和密文用冒号分隔,方便后续拆分。
  • 安全密钥派生:使用crypto.scryptSync()从密码派生密钥,这是一种抗暴力破解的安全派生方式,比旧方法的EVP_BytesToKey更可靠。注意示例中的your-custom-salt,实际生产环境建议使用随机生成的盐,并和IV、密文一起存储。
  • 错误处理:添加了try-catch块捕获加密解密过程中的异常(比如无效密文、密钥不匹配等),方便排查问题。

内容的提问来源于stack exchange,提问作者Valentyn SHCHERBOV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:42:43