【问题标题】:Why is the hash of this file staying the same when I change its data?为什么当我更改它的数据时这个文件的哈希值保持不变?
【发布时间】:2020-05-16 07:41:52
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

  • 根据the documentation,如果不传递编码,data 是原始缓冲区,而不是字符串。
  • 试试fs.readFile('./file.txt', "utf8", function(err,data){...}。虽然,我认为缓冲区应该仍然更改哈希。
  • 感谢@zero298,它成功了!
  • @zero298 想要发布答案,以便 RAFAEL DA SILVA 将其标记为已解决?

标签: node.js file hash sha256 cryptojs


【解决方案1】:

我很好奇为什么这不起作用。首先,让我们解释一下实际发生的情况。每次调用readFile 时都不会包含文件编码类型。每readFile docs

如果未指定编码,则返回原始缓冲区。

没关系。您会认为文件的缓冲区与文件中的实际数据一样可散列。然而,发生的事情是加密库不考虑接收缓冲区,或者更确切地说,它只考虑字符串。您可以在此处的库源代码中看到这一点:core.js:512,它执行typeof data === 'string' 检查。

由于typeof a_buffer === "string" 的计算结果为false,因此永远不会更新哈希。因此,您每次都会得到相同的哈希值。

所以,解决方案就是提供一个编码:

fs.readFile('./file.txt', "utf8", function(err,data){...}

或者,执行一些操作将 Buffer 转换为 String 以获取实际数据,例如 data.toString("utf8") 其中data 是来自 readFile 的 Buffer。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2021-06-21
    • 2015-12-04
    相关资源
    最近更新 更多