Я хочу создать хеш I love cupcakes
(подписанный ключом abcdeg
)
Как я могу создать этот хеш, используя Node.js Crypto?
Я хочу создать хеш I love cupcakes
(подписанный ключом abcdeg
)
Как я могу создать этот хеш, используя Node.js 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')
crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b))
: stackoverflow.com/questions/31095905/…
Несколько лет назад было сказано , что 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 . Дает больше примеров для использования потокового подхода.
update
а не о write
. Я в замешательстве, какая сейчас лучшая практика? Я не могу найти ресурсы, которые рассказывают об этом так же ясно, как вы это упоминаете.
digest
и update
еще не были устаревшими и описаны в документации: nodejs.org/api/crypto.html#crypto_class_hmac . Я рекомендую использовать потоковый API, только если вы читаете из потока.
Решение 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
It is a stream that is both readable and writable. The written data is used to compute the hmac. Once the writable side of the stream is ended, use the read() method to get the computed digest.
Вы читаете его, когда заканчивается сторона , доступная для записи , вам даже не нужно ждать, когда сторона, доступная для чтения, станет читаемой (хотя, безусловно, это так). Прочитайте свою документацию, пожалуйста.
hmac.end(...)
что был вызван, « конец » означает, что поток вызвал событие завершения , поэтому команда принимает обратный вызов. После вызова метода end () потоку требуется время для сброса данных в базовую систему. Если вы вызовите read () до того, как будет завершено событие финиша, произойдет сбой. Идите вперед и вставьте код Gwerder в JSbin и убедитесь сами. Вы должны читать документацию по Streams, чтобы понять, как она работает.
read()
когда завершается доступная для записи сторона, и нет ничего о завершающем событии.