web-dev-qa-db-ja.com

暗号化モジュールのストリーム機能を使用してファイルのハッシュを取得(例:hash.updateおよびhash.digestなし)

Node.jsの crypto モジュール(少なくともこの記事の執筆時点では)はまだ安定しているとは見なされないため、APIが変更される可能性があります。実際、インターネットのすべての人がファイルのハッシュ(md5、sha1、...)を取得するために使用するメソッドは、レガシーと見なされます( Hash class のドキュメントから) (注:強調鉱山):

クラス:ハッシュ

データのハッシュダイジェストを作成するためのクラス。

これは、読み取りと書き込みの両方が可能なストリームです。書き込まれたデータは、ハッシュの計算に使用されます。ストリームの書き込み可能側が終了したら、read()メソッドを使用して、計算されたハッシュダイジェストを取得します。 レガシーアップデートおよびダイジェストメソッドもサポートされています。

Crypto.createHashによって返されます。

hash.updateおよびhash.digestはレガシーと見なされますが、引用符で囲まれたスニペットのすぐ上に示されている例はそれらを使用しています。

これらのレガシーメソッドを使用せずにハッシュを取得する正しい方法は何ですか?

36

質問の引用されたスニペットから:

[ハッシュクラス]これは、読み取りと書き込みの両方が可能なストリームです。書き込まれたデータは、ハッシュの計算に使用されます。ストリームの書き込み可能側が終了したら、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);
74

ハッシュダイジェストのPromiseを返すES6バージョン:

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

カルロスの答えの短いバージョン:

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
  })
14

さらに磨く、ECMAScript 2015

function checksumFile(algorithm, path) {
  return new Promise((resolve, reject) =>
    fs.createReadStream(path)
      .on('error', reject)
      .pipe(crypto.createHash(algorithm)
        .setEncoding('hex'))
      .once('finish', function () {
        resolve(this.read())
      })
  )
}
11
Harald Rudell
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);
});
1
javelinthrow