我正在尝试使用这段代码对JS中的文件进行哈希处理:
var CryptoJS = require("crypto-js");
var fs = require('fs');
fs.readFile('./file.txt', function(err,data){
if(err) {
console.error("Could not open file: %s", err);
process.exit(1);
}
console.log("HASH: " + CryptoJS.SHA256(data));
});
无论我写什么.txt,产生的哈希始终是:4ea5c508a6566e76240543f8feb06fd457777be39549c4016436afda65d2330e
如果我将某些字符串数据放入CryptoJS.SHA256("text_exemple")
,则哈希可以正常工作。
我在这里想念什么?
我很好奇为什么这没有用。首先,让我们解释一下实际发生的情况。每次调用readFile
时都不会包括文件编码类型。每readFile
docs:
如果未指定编码,则返回原始缓冲区。
很好。您可能会认为文件的缓冲区与文件中的实际数据一样具有可哈希性。但是,我相信正在发生的事情是,加密库没有考虑接收缓冲区,并且缓冲区被隐式转换为字符串。如果在缓冲区上调用readFile
,则会得到一个空字符串,并且无论对一个空String进行哈希处理多少次,都将得到相同的结果。
因此,解决方案是只提供一种编码:
toString()
或执行一些操作以将Buffer转换为String,从而获得实际数据。