Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Obtaining the hash of a file using the stream capabilities of crypto module (ie: without hash.update and hash.digest)

The crypto module of node.js (at the time of this writing at least) is not still deemed stable and so the API may change. In fact, the methods that everyone in the internet use to get the hash (md5, sha1, ...) of a file are considered legacy (from the documentation of Hash class) (note: emphasis mine):

Class: Hash

The class for creating hash digests of data.

It is a stream that is both readable and writable. The written data is used to compute the hash. Once the writable side of the stream is ended, use the read() method to get the computed hash digest. The legacy update and digest methods are also supported.

Returned by crypto.createHash.

Despite hash.update and hash.digest being considered legacy, the example shown just above the quoted snippet is using them.

What's the correct way of obtaining hashes without using those legacy methods?

like image 805
Carlos Campderrós Avatar asked Sep 06 '13 13:09

Carlos Campderrós


People also ask

Where can I find sha1 hash of a file?

How to get the SHA-1 of a file. To get the SHA-1 of a file pass the path of a file to the sha1sum command. The SHA-1 will be printed to standard output printing first the SHA-1 checksum then the name of the file.


1 Answers

From the quoted snippet in the question:

[the Hash class] It is a stream that is both readable and writable. The written data is used to compute the hash. Once the writable side of the stream is ended, use the read() method to get the computed hash digest.

So what you need to hash some text is:

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(); 

If you want to get the hash of a file, the best way is create a ReadStream from the file and pipe it into the hash:

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); 
like image 199
Carlos Campderrós Avatar answered Sep 19 '22 08:09

Carlos Campderrós