Javascript 为什么JS中blob的散列与终端中使用sha256sum时获得的散列不同?
我首先使用Javascript中的FileReaderAPI读取一个blob,以此对其进行哈希处理。我正在使用的图书馆是 但是,当我在终端中执行“sha256sum zipfile.zip”时,得到的哈希值与记录的哈希值不匹配。我还尝试了FileReaderAPI的所有其他读取方法。我应该怎么做呢?我知道这个“答案”并没有给出解决方案,但它解释了为什么这不起作用 当前版本的JSHashes库(1.0.7)需要一个字符串作为输入,但您提供了一个Javascript 为什么JS中blob的散列与终端中使用sha256sum时获得的散列不同?,javascript,Javascript,我首先使用Javascript中的FileReaderAPI读取一个blob,以此对其进行哈希处理。我正在使用的图书馆是 但是,当我在终端中执行“sha256sum zipfile.zip”时,得到的哈希值与记录的哈希值不匹配。我还尝试了FileReaderAPI的所有其他读取方法。我应该怎么做呢?我知道这个“答案”并没有给出解决方案,但它解释了为什么这不起作用 当前版本的JSHashes库(1.0.7)需要一个字符串作为输入,但您提供了一个ArrayBuffer 内部调用hex时,将执行此代码
ArrayBuffer
内部调用hex
时,将执行此代码,其中s
是您的数组缓冲区,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
,问题仍然会存在,因为它仍然需要字符串,并且由于缺少长度而在另一个位置失败
空字符串的sha256是e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
,这是每个文件的sha256。t.niese提供的解释是正确的。我正在发布它的解决方案
我使用来自的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
.....
如果您使用loadend
而不是load
,会发生什么情况?您是对的。如果可以的话,我愿意搬到另一个图书馆去。有没有办法让这两个哈希匹配?@aswin1999没有,对不起。我从来没有要求计算散列客户端,所以我不能建议一个替代方案。服务器端呢?那我能做吗?
.....
// 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
.....