我正在使用zlib
节点模块来压缩数据,并使用crypto
模块对其进行加密,然后将其保存到文件中。读写文件以及加密和解密数据都可以正常工作,但是无论如何,当我尝试使用zlib.unzip
解压缩数据时,都会返回以下错误。
Error: incorrect header check at Zlib.zlibOnError [as onerror] (zlib.js:153:17) errno: -3, code:'Z_DATA_ERROR'
我已经检查了从文件读取的数据是否与写入的数据相同(是这种情况)。改为使用zlib.gunzip
绕过zlib的自动标头检测不会更改任何内容。
function encrypt(data, enc) {
zlib.gzip(data, (err, compressed) => {
let cipher = crypto.createCipheriv(enc.algorithm, enc.key, enc.iv);
compressed = cipher.update(compressed.toString(), 'utf8', 'base64') + cipher.final('base64');
fs.writeFile('passwords', compressed, (err) => {
if (err) throw err;
});
});
}
function decrypt(enc) {
fs.readFile('passwords', (err, data) => {
if (err) throw err;
let decipher = crypto.createDecipheriv(enc.algorithm, enc.key, enc.iv);
data = decipher.update(data.toString(), 'base64', 'utf8') + decipher.final('utf8');
zlib.unzip(data, (err, uncompressed) => { // THIS LINE SEEMS TO THROW THE ERROR
if (err) console.warn(err);
console.log(uncompressed);
});
});
}
更新: 我一直在尝试进一步研究这个问题,因为它仍然出现,而且我真的很想将压缩作为功能。
但是,到目前为止,我发现,显然只有在结合使用zlib
和crypto
时,错误才会发生,两者都可以正常工作。
显然,zlib
遇到了crypto
修改压缩数据的问题,因为切换它们的顺序似乎可以解决问题。但是crypto
压缩或多或少的随机数据压缩后返回,没有多大意义。
也许有人对此有想法?
更新2:
我再次深入研究,发现解密后的数据不适合加密后的数据。但是,它已被正确解密,crypto
不会引发任何错误。这可能就是为什么zlib
无法解压缩数据的原因。