一尘不染

使用加密模块的流功能获取文件的哈希(即:不使用hash.update和hash.digest)

node.js

cryptonode.js
的模块(至少在撰写本文时)仍未被认为是稳定的,因此API可能会发生变化。实际上,互联网上每个人用来获取文件的哈希值(md5,sha1,…)的方法都被认为是旧方法(来自Hashclass的文档)(注:强调我的方法):

类:哈希

用于创建数据的哈希摘要的类。

这是一个既可读又可写的流。写入的数据用于计算哈希。流的可写端结束后,使用read()方法获取计算得出的哈希摘要。在 传统的更新和摘要方法
也支持。

由crypto.createHash返回。

尽管hash.updatehash.digest正在考虑遗产,只是引用片段上面的例子中使用它们。

不使用这些传统方法获取哈希的正确方法是什么?


阅读 300

收藏
2020-07-07

共1个答案

一尘不染

从问题中引用的摘录中:

[Hash类]它是可读写的流。写入的数据用于计算哈希。流的可写端结束后,使用read()方法获取计算得出的哈希摘要。

因此,您需要对一些文本进行哈希处理是:

var crypto = require('crypto');

// change to 'md5' if you want an MD5 hash
var hash = crypto.createHash('sha1');

// change to 'binary' if you want a binary hash.
hash.setEncoding('hex');

// the text that you want to hash
hash.write('hello world');

// very important! You cannot read from the stream until you have called end()
hash.end();

// and now you get the resulting hash
var sha1sum = hash.read();

如果要获取文件的哈希,最好的方法是从文件创建ReadStream并将其通过管道传递给哈希:

var fs = require('fs');
var crypto = require('crypto');

// the file you want to get the hash    
var fd = fs.createReadStream('/some/file/name.txt');
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');

fd.on('end', function() {
    hash.end();
    console.log(hash.read()); // the desired sha1sum
});

// read all file and pipe it (write it) to the hash object
fd.pipe(hash);
2020-07-07