我正在尝试使用这段代码对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
在其中进行core.js:512检查。
由于typeof data === 'string'
的值为typeof a_buffer === "string"
,因此永远不会更新哈希值。因此,您每次都会获得相同的哈希值。
因此,解决方案是只提供一种编码:
false
或执行一些操作以将缓冲区变成字符串的方式来获取实际数据,例如fs.readFile('./file.txt', "utf8", function(err,data){...}
,其中data.toString("utf8")
是来自data
的缓冲区。