Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 文件与文件内容的不同sha256哈希值为WordArray_Javascript_Hash_Cryptojs_Arraybuffer - Fatal编程技术网

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相关的还是加密库的产物。