【问题标题】:SHA Hashes Don't Match between Node Crypto and macOS sha256sumSHA 哈希在 Node Crypto 和 macOS sha256sum 之间不匹配
【发布时间】:2018-11-04 02:31:20
【问题描述】:

我在 node.js 中从 Internet 源中获取一个大型的 gzip 压缩 JSON 文件。该源还提供了一个包含 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 加密?我做错了什么吗?谢谢!

更新

我刚刚意识到,对于我尝试的每个文件,我从 crypto 获得相同的哈希 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,所以我肯定在这里做错了......

【问题讨论】:

    标签: json node.js zlib sha


    【解决方案1】:

    您的 e3b0c... 是空序列的 SHA-256,即零输入字节。

    【讨论】:

    • 谢谢,这很有帮助。然而,为什么会这样呢?我正在将相同的缓冲区写入磁盘,这会导致文件不为空,并且会产生正确且预期的哈希值。
    • 对node.js不熟悉,所以不知道。我只能猜测writeFile接受unBuffer的数据类型,但update不接受。
    【解决方案2】:

    我从来没有弄清楚我做错了什么。我改用哈希,解决了这个问题。

    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}`);
      });
    

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 2012-05-20
      • 2010-11-02
      • 1970-01-01
      • 2014-08-19
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多