NodeJS проблема с дайджестом hmac с акцентами - PullRequest
8 голосов
/ 27 февраля 2012

Я выполняю параллельное сравнение с Ruby, PHP и NodeJS для следующего кода, получая неверный ответ в NodeJS, используя модуль crypto.

PHP

hash_hmac('sha256', 'text', 'á');

Ruby

OpenSSL::HMAC.hexdigest('sha256', 'á', 'text')

NodeJS

var signer = crypto.createHmac('sha256', 'á');
var expected = signer.update("text").digest('hex');

Как Ruby, так и PHP возвращают 34b3ba4ea7e8ff214f2f36b31c6a6d88cfbf542e0ae3b98ba6c0203330c9f55b, в то время как, NodeJS возвращает 7dc85acba66d21e4394be4f8ead2a327c9f1adc64a99c710c98f60c425bd7411.Я заметил, что если я попытаюсь использовать utf8_encode('á') в PHP, это на самом деле даст мне результат, которого ожидает Node.

Я загружаю акцентированный текст в Node из файла, например, так:

JSON.parse(fs.readFileSync('keys.js', 'utf8'));

Как мне изменить код в Node, чтобы получить результирующий хеш, который присутствует и в PHP, и в Ruby?

Спасибо!

1 Ответ

13 голосов
/ 07 марта 2012

Этот код даст вам правильный результат:

var crypto = require('crypto');

var signer = crypto.createHmac('sha256', new Buffer('á', 'utf8'));
var result = signer.update("text").digest('hex');
console.log(result);
...