zlib не может распаковать данные gzip - PullRequest
0 голосов
/ 08 сентября 2018

Я использую модуль узла 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 не может распаковать данные.

...