Chcę utworzyć skrót I love cupcakes
(podpisany kluczemabcdeg
)
Jak mogę utworzyć ten skrót za pomocą Crypto Node.js?
Chcę utworzyć skrót I love cupcakes
(podpisany kluczemabcdeg
)
Jak mogę utworzyć ten skrót za pomocą Crypto Node.js?
Odpowiedzi:
Dokumentacja do kryptografii: 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/…
Kilka lat temu mówiło się, że update()
i digest()
były starsze metody i nowe podejście Streaming API został wprowadzony. Teraz doktorzy mówią, że można zastosować dowolną metodę. Na przykład:
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);
Testowane na węzłach 6.2.2 i 7.0.7
Zobacz https://nodejs.org/api/crypto.html#crypto_class_hmac . Podaje więcej przykładów użycia metody przesyłania strumieniowego.
update
a nie użycie write
. Jestem zdezorientowany, co jest teraz najlepszą praktyką? Nie mogę znaleźć zasobów, które mówią to tak jasno, jak o tym wspominasz.
digest
a update
które nie były przestarzałe i są przedstawione w dokumentacji: nodejs.org/api/crypto.html#crypto_class_hmac . Zalecam używanie interfejsu API strumienia tylko wtedy, gdy czytasz ze strumienia.
Rozwiązanie Gwerdera nie zadziała, ponieważ hash = hmac.read();
dzieje się to przed sfinalizowaniem strumienia. Zatem problemy AngraX. Równieżhmac.write
instrukcja nie jest konieczna w tym przykładzie.
Zamiast tego zrób to:
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...
});
Bardziej formalnie, jeśli chcesz, linia
hmac.end(text, function () {
można napisać
hmac.end(text, 'utf8', function () {
ponieważ w tym przykładzie tekst jest ciągiem 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.
Czytasz go podczas zapisu strona skończyło , nie trzeba nawet czekać do kiedy czytelna strona staje się czytelny (choć na pewno nie). Proszę przeczytać dokumentację.
hmac.end(...)
że został wywołany, „ zakończony ” oznacza, że strumień podniósł swoje zakończenie zdarzenia , dlatego polecenie akceptuje wywołanie zwrotne. Po wywołaniu metody end () strumień wymaga czasu, aby opróżnić dane do systemu bazowego. Jeśli wywołasz read () przed zgłoszeniem zdarzenia zakończenia, zakończy się ono niepowodzeniem. Śmiało, wklej kod Gwerdera do JSbin i przekonaj się sam. Powinieneś przeczytać dokumentację dotyczącą strumieni, aby zrozumieć, jak to działa.
read()
gdy kończy się zapisywalna strona, i nie ma nic o zdarzeniu kończącym.