为什么JS中的Blob哈希与在终端中使用sha256sum时获得的哈希不同?

时间:2018-06-26 17:40:02

标签: javascript

我通过首先使用Javascript中的FileReader API读取blob来对其进行哈希处理。我正在使用的图书馆是JSHashes

var fileReaderForHash = new FileReader();
fileReaderForHash.readAsArrayBuffer(zipBlob);
fileReaderForHash.onload = () => {
  var zipFileHash = new 
  Hashes.SHA256().hex(fileReaderForHash.result);
  console.log(zipFileHash);
  postRef.update({hash:zipFileHash});
}

但是当我在终端中执行“ sha256sum zipfile.zip”时,获得的哈希值与记录的哈希值不匹配。我还尝试了FileReader API的所有其他读取方法。我应该怎么做?

2 个答案:

答案 0 :(得分:0)

我知道这个“答案”没有给出解决方案,但是它解释了为什么它不起作用。

JSHashes库的当前版本(1.0.7)需要一个字符串作为输入,但是您提供了ArrayBuffer

调用hex的内部方法将执行此代码,其中s是您的ArrayBuffer,而utf8默认为true

function rstr(s, utf8) {
  s = (utf8) ? utf8Encode(s) : s;
  return binb2rstr(binb(rstr2binb(s), s.length * 8));
}

function utf8Encode(str) {
  var x, y, output = '',
    i = -1,
    l;

  if (str && str.length) {
    //  .... some other code
  }

  return output;
}

并且utf8Encode将始终为ArrayBuffer返回空字符串,因为它没有length属性。即使将utf8更改为false,问题仍然存在,因为它仍然需要一个字符串,并且由于缺少length而在另一个地方失败。

空字符串的sha256为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,这就是每个文件将获得的sha256。

答案 1 :(得分:0)

t.niese 提供的解释是正确的。我正在发布解决方案。

我使用GitHub中的sha256sum库解决了这个问题。

这是代码:

          .....
          // import the library
          var hash = sha256.hex(zipArrayBuffer);  // input arraybuffer
          console.log(hash);  // displays hash
          zipBlob = new Blob([new Uint8Array(zipBlob)]);  // convert to blob for reading
          .....