NodeJS 使用crypto模块的流功能(即:没有hash.update和hash.digest)

dfddblmv  于 2023-04-05  发布在  Node.js
关注(0)|答案(6)|浏览(194)

node.js的crypto模块(至少在撰写本文时)仍然不被认为是稳定的,因此API可能会发生变化。事实上,互联网上每个人用来获取文件哈希值(md5,sha1,...)的方法都被认为是遗留的(来自Hash类的文档)(注意:强调矿):
类:哈希
用于创建数据的哈希摘要的类。
是一个可读可写的流,写入的数据用来计算hash,流的可写端结束后,使用read()方法获取计算出的hash摘要,同时支持传统的update和digest方法
由crypto.createHash返回。
尽管hash.updatehash.digest被认为是遗留的,但引用的代码片段上方显示的示例正在使用它们。
在不使用那些遗留方法的情况下,获得哈希值的正确方法是什么?

a11xaf1n

a11xaf1n1#

从问题中引用的片段:
[the 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);
owfi6suc

owfi6suc2#

ES6版本返回一个Promise作为hash摘要:

function checksumFile(hashName, path) {
  return new Promise((resolve, reject) => {
    const hash = crypto.createHash(hashName);
    const stream = fs.createReadStream(path);
    stream.on('error', err => reject(err));
    stream.on('data', chunk => hash.update(chunk));
    stream.on('end', () => resolve(hash.digest('hex')));
  });
}
8ftvxx2r

8ftvxx2r3#

卡洛斯的简短回答:

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

fs.createReadStream('/some/file/name.txt').
  pipe(crypto.createHash('sha1').setEncoding('hex')).
  on('finish', function () {
    console.log(this.read()) //the hash
  })
sirbozc5

sirbozc54#

进一步的润色,ECMAScript 2015
hash.js

'use strict';

function checksumFile(algorithm, path) {
  return new Promise(function (resolve, reject) {
    let fs = require('fs');
    let crypto = require('crypto');

    let hash = crypto.createHash(algorithm).setEncoding('hex');
    fs.createReadStream(path)
      .once('error', reject)
      .pipe(hash)
      .once('finish', function () {
        resolve(hash.read());
      });
  });
}

checksumFile('sha1', process.argv[2]).then(function (hash) {
  console.log('hash:', hash);
});
node hash.js hash.js
hash: 9c92ec7acf75f943aac66ca17427a4f038b059da

至少在v10.x之前有效:

node --version
v10.24.1
pvcm50d1

pvcm50d15#

我成功地使用了Node模块hasha,代码变得非常简洁和简短。它返回一个promise,所以你可以用await来使用它:

const hasha = require('hasha');

const fileHash = await hasha.fromFile(yourFilePath, {algorithm: 'md5'});
fkaflof6

fkaflof66#

var fs = require('fs');
var crypto = require('crypto');
var fd = fs.createReadStream('data.txt');
var hash = crypto.createHash('md5');
hash.setEncoding('hex');
fd.pipe(hash);
hash.on('data', function (data) {
    console.log('# ',data);
});

相关问题