Как использовать Node.js Crypto для создания хэша HMAC-SHA1? - PullRequest
184 голосов
/ 20 сентября 2011

Я хочу создать хеш I love cupcakes (подписанный ключом abcdeg)

Как я могу создать этот хеш, используя Node.js Crypto?

Ответы [ 3 ]

331 голосов
/ 20 сентября 2011

Документация для шифрования: http://nodejs.org/api/crypto.html

var crypto = require('crypto')
  , text = 'I love cupcakes'
  , key = 'abcdeg'
  , hash

hash = crypto.createHmac('sha1', key).update(text).digest('hex')
92 голосов
/ 15 сентября 2013

Несколько лет назад было сказано, что update() и digest() были устаревшими методами, и был представлен новый подход потокового API.Теперь в документах говорится, что любой метод может быть использован.Например:

var crypto    = require('crypto');
var text      = 'I love cupcakes';
var secret    = 'abcdeg'; //make this your secret!!
var algorithm = 'sha1';   //consider using sha256
var hash, hmac;

// Method 1 - Writing to a stream
hmac = crypto.createHmac(algorithm, secret);    
hmac.write(text); // write in to the stream
hmac.end();       // can't read from the stream until you call end()
hash = hmac.read().toString('hex');    // read out hmac digest
console.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);

Протестировано на узле v6.2.2 и v7.7.2

См. https://nodejs.org/api/crypto.html#crypto_class_hmac. Дает больше примеров использования потокового подхода.

21 голосов
/ 09 октября 2014

Решение Gwerder не сработает, потому что hash = hmac.read(); происходит до завершения потока.Таким образом, проблемы AngraX.Кроме того, оператор hmac.write в этом примере не требуется.

Вместо этого сделайте это:

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...
});

Более формально, если хотите, строка

hmac.end(text, function () {

можно написать

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

, потому что в этом примере текст является строкой utf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...