Я хочу створити хеш I love cupcakes
(підписаний ключем abcdeg
)
Як я можу створити цей хеш, використовуючи криптовалюту Node.js?
Я хочу створити хеш I love cupcakes
(підписаний ключем abcdeg
)
Як я можу створити цей хеш, використовуючи криптовалюту Node.js?
Відповіді:
Документація на крипто: 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 () потоку потрібен час для передачі даних до базової системи. Якщо ви зателефонуєте прочитати () перед тим, як подія фінішу буде піднята, вона вийде з ладу. Далі вставте код Gwerder у JSbin і переконайтеся самі. Вам слід прочитати документацію Streams, щоб зрозуміти, як вона працює.
read()
коли закінчилася записувана сторона, і немає нічого про закінчення події.