Javascript 文件与文件内容的不同sha256哈希值为WordArray
我制作了一个测试文本文件,内容如下:Javascript 文件与文件内容的不同sha256哈希值为WordArray,javascript,hash,cryptojs,arraybuffer,Javascript,Hash,Cryptojs,Arraybuffer,我制作了一个测试文本文件,内容如下: aaaaaa bbbbbbbb cccccccccc dddddd eeeeeeee ffffffff gggggg hhhhhh 此值作为字符串的sha256十六进制摘要为: 75EEF9680DE51F6F70291057E9AFC595470960DFEC5F37F83DB69AA625786E5 在python中使用hashlib、js使用Crypto.js或从命令行对文件使用ssl进行散列时,我得到了相同的值 但是,在js中,当我像这样读取文件时:
aaaaaa bbbbbbbb cccccccccc dddddd eeeeeeee ffffffff gggggg hhhhhh
此值作为字符串的sha256十六进制摘要为:
75EEF9680DE51F6F70291057E9AFC595470960DFEC5F37F83DB69AA625786E5
在python中使用hashlib、js使用Crypto.js或从命令行对文件使用ssl进行散列时,我得到了相同的值
但是,在js中,当我像这样读取文件时:
var fr = new FileReader();
fr.readAsArrayBuffer(file);
console.log(fr.result.byteLength); // it's 64...
var input = CryptoJS.lib.WordArray.create(new Uint8Array(fr.result));
CryptoJS.SHA256(input).toString();
var fr = new FileReader();
fr.readAsArrayBuffer(file);
console.log(fr.result.byteLength); // it's still 64...
asmCrypto.SHA256.hex(new Uint8Array(fr.result));
asmCrypto.SHA256.hex(fr.result); // this also works
我得到:
8f76bf13468fb12ac4e59610adff70fd10282e8494a2749db4677f81e2c6e998
更新:来自crypto.js文档:
/**
* cryptojs use WordArray (CryptoJS.lib.WordArray) as parameter/result frequently.
* A WordArray object represents an array of 32-bit words. When you pass a string,
* it's automatically converted to a WordArray encoded as UTF-8.
*/
我怀疑它可能是utf-8 vs ascii之类的东西,但不知道如何检查。我找到了同时接受ArrayBuffers和UInt8Array作为输入的东西-我现在得到了预期的结果(速度也相当快)。我是这样使用它的:
var fr = new FileReader();
fr.readAsArrayBuffer(file);
console.log(fr.result.byteLength); // it's 64...
var input = CryptoJS.lib.WordArray.create(new Uint8Array(fr.result));
CryptoJS.SHA256(input).toString();
var fr = new FileReader();
fr.readAsArrayBuffer(file);
console.log(fr.result.byteLength); // it's still 64...
asmCrypto.SHA256.hex(new Uint8Array(fr.result));
asmCrypto.SHA256.hex(fr.result); // this also works
WordArray
是否有toString
或其他打印内容的方法?我想你是在增加/减少空格或类似的内容。确实如此,而且看起来很正常:000000610000610000061…
。没有空格问题,只有预期的字符代码。readAsArrayBuffer
逐部分读取内容,并在内容完全读取时触发readyState
和loadend
事件?只有一个64字节的文件…如果您从WordArray中看到000000 6100000006100000610000061
,看起来每个字符都被额外的三个字节填充为一个32位字。我不确定这是UTF相关的还是加密库的产物。