加密模块 - Node.js

时间:2013-04-11 04:30:14

标签: javascript node.js express node-crypto

哪种方法比较文件的哈希值而不将其存储在数据库中是最简单的方法?

例如:

var filename = __dirname + '/../public/index.html';
var shasum = crypto.createHash('sha1');

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  shasum.update(d);
});

s.on('end', function() {
  var d = shasum.digest('hex');
  console.log(d + ' ' + filename);

  fs.writeFile(__dirname + "/../public/log.txt", d.toString() + '\n', function(err) {
     if(err) {
         console.log(err);
      } else {
         console.log("The file was saved!");
      }
  }); 
});

上面的代码返回HTML文件的哈希值。如果我编辑文件,我怎么知道它是否已被更改?换句话说,我如何知道散列是否已被更改?

有什么建议吗?

已修改

现在哈希被保存在日志文件中。如何从文件中检索哈希并将其与新生成的哈希相匹配?一个代码示例非常棒,可以让我更好地理解。

这个question没有区别,但我还不清楚如何实现它。

2 个答案:

答案 0 :(得分:1)

如果您正在寻找文件的更改,那么您可以使用Node的文件系统函数之一fs.watch。这就是它的用法:

fs.watch(filename, function (event, filename) {
  //event is either 'rename' or 'change'
  //filename is the name of the file which triggered the event
});

但是手表功能不是很一致,因此您可以使用fs.watchFile作为替代方案。 fs.watchFile使用统计轮询,因此它比fs.watch慢得多,后者会立即检测到文件更改。

观看文件将返回fs.FSWatcher的实例,该实例包含事件changeerror。调用.close将停止观看文件的更改。

以下是与您的代码相关的示例:

var filename = __dirname + '/../public/index.html';
var shasum = crypto.createHash('sha1');

var oldhash = null;

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  shasum.update(d);
});

s.on('end', function() {
  var d = shasum.digest('hex');
  console.log(d + ' ' + filename);
  oldhash = d.toString();

  fs.writeFile(__dirname + "/../public/log.txt", d.toString() + '\n', function(err) {
     if(err) {
         console.log(err);
      }
      else {
         console.log("The file was saved!");
      }
  }); 
});

//watch the log for changes
fs.watch(__dirname + "/../public/log.txt", function (event, filename) {
  //read the log contents
  fs.readFile(__dirname + "/../public/log.txt", function (err, data) {
    //match variable data with the old hash
    if (data == oldhash) {
      //do something
    }
  });
});

答案 1 :(得分:0)

这个问题和previous one you asked有什么区别?如果您不想将其存储在数据库中,请将其存储为文件。如果你想保存多个文件的哈希值,那么可以将它们放在一个JSON对象中,然后将它们写成.json文件,这样它们就很容易读/写。

修改

鉴于您添加到问题中的内容,它应该非常简单。您可以编写一个函数来检查和重写:

function updateHash (name, html, callback) {
    var sha = crypto.createHash('sha1');
    sha.update(html);
    var newHash = sha.digest('hex');

    var hashFileName = name + '.sha';

    fs.readFile(hashFileName, 'utf8', function (err, oldHash) {
        var changed = true;
        if (err)
            console.log(err); // probably indicates the file doesn't exist, but you should consider doing better error handling

        if (oldHash === newHash)
            changed = false;

        fs.writeFile(hashFileName, newHash, { encoding: 'utf8' }, function (err) {
            callback(err, changed);
        });
    });
}

updateHash('index.html', "<html><head><title>...", function (err, isChanged) {
    // do something with this information ?
    console.log(isChanged);
});