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

使用Node.js crypto模块加解密时丢失部分内容的问题排查

问题原因及解决方案

你的代码问题出在没有调用cipher.final()和decipher.final()。Node.js的crypto模块中,update()方法仅处理大部分数据,最后剩余的块(包括填充内容)需要通过final()方法获取,否则会丢失部分数据。

修正后的代码:

let crypto = require("crypto");
let algorithm = "aes256";
let key = crypto.randomBytes(32);

const encrypt = (secret) => {
  let iv = crypto.randomBytes(16);
  let cipher = crypto.createCipheriv(algorithm, key, iv);
  // 拼接update和final的结果,获取完整加密数据
  let encrypted = Buffer.concat([cipher.update(secret), cipher.final()]);
  return {
    iv,
    encrypted,
  };
};

const decrypt = ({ iv, encrypted }) => {
  let decipher = crypto.createDecipheriv(algorithm, key, iv);
  // 同样拼接update和final的结果,获取完整解密数据
  let decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
  return decrypted.toString();
};

let text = "The quick brown fox jumps over the lazy dog";

let encrypted = encrypt(text);
let decrypted = decrypt(encrypted);

console.log(decrypted);
// 输出:The quick brown fox jumps over the lazy dog

关键修改点:

  • 加密时:用Buffer.concat()合并cipher.update()和cipher.final()的返回值,确保获取完整的加密内容
  • 解密时:同理,合并decipher.update()和decipher.final()的返回值,避免丢失最后一块解密数据

AES作为块加密算法,会自动对长度不符合块大小(16字节)的明文进行填充,final()方法会处理这部分填充数据,同时完成加密/解密的收尾操作,必须调用才能得到完整结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:50:50