Почему ха sh этого файла остается неизменным, когда я изменяю его данные? - PullRequest
2 голосов
/ 30 января 2020

Я пытаюсь получить sh файл в 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, ха sh всегда производит is: 4ea5c508a6566e76240543f8feb06fd457777be39549c4016436afda65d2330e

Если я добавлю некоторые строковые данные в CryptoJS.SHA256("text_exemple"), ха sh будет работать правильно.

Что мне здесь не хватает?

1 Ответ

4 голосов
/ 30 января 2020

Мне было любопытно почему это не сработало. Сначала давайте объясним, что на самом деле происходит. Вы не включаете тип кодировки файла, когда звоните readFile. По readFile документы :

Если кодировка не указана, возвращается необработанный буфер.

Это нормально. Вы могли бы подумать, что буфер файла будет таким же хешируемым, как и фактические данные в файле. Однако происходит то, что крипто-библиотека не учитывает получение буфера, или, скорее, она учитывает только строки. Вы можете видеть это в источнике библиотеки здесь: core. js: 512 , где она делает typeof data === 'string' проверку.

Так как typeof a_buffer === "string" оценивается в false, ха sh никогда не обновляется. Из-за этого вы получаете один и тот же га sh каждый раз.

Итак, решение состоит в том, чтобы просто предоставить кодировку:

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

или выполнить какую-либо операцию, чтобы включить буфер в строку таким образом, что вы получите фактические данные, такие как data.toString("utf8"), где data - это буфер из readFile.

...