How do I use Node.js Crypto to create a HMAC-SHA1 hash? How do I use Node.js Crypto to create a HMAC-SHA1 hash? javascript javascript

How do I use Node.js Crypto to create a HMAC-SHA1 hash?


Documentation for crypto: http://nodejs.org/api/crypto.html

const crypto = require('crypto')const text = 'I love cupcakes'const key = 'abcdeg'crypto.createHmac('sha1', key)  .update(text)  .digest('hex')


A few years ago it was said that update() and digest() were legacy methods and the new streaming API approach was introduced. Now the docs say that either method can be used. For example:

var crypto    = require('crypto');var text      = 'I love cupcakes';var secret    = 'abcdeg'; //make this your secret!!var algorithm = 'sha1';   //consider using sha256var hash, hmac;// Method 1 - Writing to a streamhmac = crypto.createHmac(algorithm, secret);    hmac.write(text); // write in to the streamhmac.end();       // can't read from the stream until you call end()hash = hmac.read().toString('hex');    // read out hmac digestconsole.log("Method 1: ", hash);// Method 2 - Using update and digest:hmac = crypto.createHmac(algorithm, secret);hmac.update(text);hash = hmac.digest('hex');console.log("Method 2: ", hash);

Tested on node v6.2.2 and v7.7.2

See https://nodejs.org/api/crypto.html#crypto_class_hmac. Gives more examples for using the streaming approach.


Gwerder's solution wont work because hash = hmac.read(); happens before the stream is done being finalized. Thus AngraX's issues. Also the hmac.write statement is un-necessary in this example.

Instead do this:

var crypto    = require('crypto');var hmac;var algorithm = 'sha1';var key       = 'abcdeg';var text      = 'I love cupcakes';var hash;hmac = crypto.createHmac(algorithm, key);// readout format:hmac.setEncoding('hex');//or also commonly: hmac.setEncoding('base64');// callback is attached as listener to stream's finish event:hmac.end(text, function () {    hash = hmac.read();    //...do something with the hash...});

More formally, if you wish, the line

hmac.end(text, function () {

could be written

hmac.end(text, 'utf8', function () {

because in this example text is a utf string