使用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
相关产品推荐
相关产品推荐

