【发布时间】:2015-07-02 04:16:01
【问题描述】:
我做了一个测试文本文件,内容是:
aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh
该值作为字符串的 sha256 十六进制摘要是:
75eef9680de51f6f70291057e9afc5975470960dfec5f37f83db69aa625786e5
当我在 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();
我得到:
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 的东西,或类似的东西,但不知道如何检查。
【问题讨论】:
-
WordArray是否有toString或其他方式来打印内容?我想你正在获得/失去空格或类似的东西。 -
确实如此,而且看起来很正常:
000000610000006100000061...开始。没有空格问题,只有预期的字符代码。 -
readAsArrayBuffer部分读取并在内容完全读取时触发readyState和loadend事件? -
只是一个 64 字节的文件...
-
如果您从 WordArray 中看到
000000610000006100000061,那么看起来每个字符肯定会被三个额外的字节填充为 32 位字。无论是 UTF 相关还是加密库的工件,我都不确定。
标签: javascript hash cryptojs arraybuffer