我通过首先使用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的所有其他读取方法。我应该怎么做?
答案 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
.....