NPM'crypto'返回的哈希值与在线生成器(节点)不同的哈希值

时间:2019-01-03 22:06:55

标签: node.js hash sha

我可能没有正确使用crypto模块,也许有人可以帮助我。

目标是找到放置在dropzone中的文件的sha-256哈希。问题在于返回的哈希值与在线哈希值检查器(返回的似乎是正确的值)不同。这是我的代码:

const crypto = require("crypto");
const hash = crypto.createHash("sha256");

handleOnDrop = file => {
    hash.update(file);
    const hashOutput = hash.digest("hex");
    console.log(hashOutput);
  };

加密文档-https://nodejs.org/api/crypto.html#crypto_node_js_crypto_constants

我相当确定我从这段代码中获得的哈希值不仅仅是文件名,我还通过在线检查器检查了一些排列。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

Dropzone事件返回一个File类对象,该对象基于Blob类,并且不提供对文件数据的直接访问。为了使用文件中的数据,必须使用FileReader

中概述的Mozilla examples

当您调用hash.update时,Crypto期望有一个缓冲区,但是file并不是像在这些examples中那样的缓冲区。将Blob放到hash.update中可能没有您期望的行为。

因此,假设您正在使用WebPack提供对Node标准库的访问,则您的代码应该需要执行以下操作:

  handleOnDrop = ((file) => {
    const reader = new FileReader();
    reader.onload = ((event) => {
      hash.update(Buffer.from(event.target.result));
      const hashOutput = hash.digest("hex");
      console.log(hashOutput);
    });
    reader.readAsArrayBuffer(file);
  });