为什么更改文件数据时此文件的哈希值保持不变?

问题描述 投票:1回答:1

我正在尝试使用这段代码对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"),则哈希可以正常工作。

我在这里想念什么?

node.js file hash sha256 cryptojs
1个回答
2
投票

我很好奇为什么这没有用。首先,让我们解释一下实际发生的情况。每次调用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的缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.