Хэши SHA не совпадают между Node Crypto и macOS sha256sum - PullRequest
0 голосов
/ 24 мая 2018

Я извлекаю большой сжатый JSON-файл из интернет-источника в node.js.Этот источник также предоставляет метафайл, который содержит хэш SHA256.Если я записываю файл на диск и суммирую полученный файл, хэши совпадают;однако при суммировании буфера в NodeJS хэши не совпадают.

const https = require('request-promise-native');
const request = require('request');
const zlib = require('zlib');
const crypto = require('crypto');

const getList = async (list) => {
  // Start by getting meta file to SHA result
  const meta = await https(`https://example.com/${list}.meta`);
  const metaHash = meta.match(/sha256:(.+)$/im)[1].toLowerCase();

  // metaHash = "f36c4c75f1293b3d3415145d78a1ffc1b8b063b083f9854e471a3888f77353e1"

  // Download and unzip whole file
  const chunks = [];
  const file = await new Promise((resolve, reject) => {
    const stream = request(`https://example.com/${list}.json.gz`);

    stream.on('data', chunk => chunks.push(chunk));
    stream.on('error', reject);
    stream.on('end', () => {
      const buffer = Buffer.concat(chunks);

      // Unzip
      zlib.gunzip(buffer, (error, unBuffer) => {
        // TEST:  Write to disk
        fs.writeFile('/tmp/test.json', unBuffer);

        // Check SHA hash
        const afterHash = crypto.createHash('sha256');
        afterHash.update(unBuffer);
        const hash = afterHash.digest('hex');

        // hash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

        // metaHash =/= hash
        if (metaHash === hash) resolve(unBuffer.toString());
        else {
          // reject(`SHA hashes do not match for ${list}`);
          console.log(`${list}\n${metaHash}\n${hash}`);
        }
      });
    });
  });
};

Но из моего терминала MacOS это совпадает:

$ sha256sum /tmp/test.json
f36c4c75f1293b3d3415145d78a1ffc1b8b063b083f9854e471a3888f77353e1  /tmp/test.json

Это наводит меня на мысль, что файл былскачал и распаковал правильно.Я неправильно реализовал шифрование node.js?Я делаю что-то еще не так?Спасибо!

ОБНОВЛЕНИЕ

Я только что понял, что получаю один и тот же хэш e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 из crypto для каждого файла, который я пробую, поэтому я определенно делаючто-то здесь не так ...

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я так и не понял, что я делаю неправильно.Вместо этого я использовал hasha, что решило проблему.

const hasha = require('hasha');

...

  // Unzip
  zlib.gunzip(buffer, (error, unBuffer) => {
    // Check SHA hash
    const hash = hasha(unBuffer, { algorithm: 'sha256' });

    if (metaHash === hash) resolve(unBuffer.toString());
    else reject(`SHA hashes do not match for ${list}`);
  });
0 голосов
/ 24 мая 2018

Ваш e3b0c... является SHA-256 пустой последовательности, то есть нулевых входных байтов.

...