Ich möchte einen Hash von I love cupcakes
(mit dem Schlüssel signiert abcdeg
) erstellen.
Wie kann ich diesen Hash mit Node.js Crypto erstellen?
Ich möchte einen Hash von I love cupcakes
(mit dem Schlüssel signiert abcdeg
) erstellen.
Wie kann ich diesen Hash mit Node.js Crypto erstellen?
Antworten:
Dokumentation für Krypto: 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/…
Vor ein paar Jahren hieß es, dass update()
und digest()
Legacy - Methoden und die neue Streaming - API - Ansatz eingeführt waren. Jetzt sagen die Dokumente, dass beide Methoden verwendet werden können. Beispielsweise:
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);
Getestet auf Knoten v6.2.2 und v7.7.2
Siehe https://nodejs.org/api/crypto.html#crypto_class_hmac . Gibt weitere Beispiele für die Verwendung des Streaming-Ansatzes.
update
und nicht write
. Ich bin verwirrt, was ist jetzt die beste Vorgehensweise? Ich kann keine Ressourcen finden, die das so deutlich sagen, wie Sie es erwähnen.
digest
und update
sind nicht veraltet und werden in der Dokumentation vorgestellt: nodejs.org/api/crypto.html#crypto_class_hmac . Ich empfehle, die Stream-API nur zu verwenden, wenn Sie aus einem Stream lesen.
Die Lösung von Gwerder funktioniert nicht, da hash = hmac.read();
dies geschieht, bevor der Stream fertiggestellt ist. Also die Probleme von AngraX. Auch derhmac.write
Anweisung ist in diesem Beispiel nicht erforderlich.
Tun Sie stattdessen Folgendes:
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...
});
Formaler, wenn Sie möchten, die Linie
hmac.end(text, function () {
könnte geschrieben werden
hmac.end(text, 'utf8', function () {
weil in diesem Beispiel Text eine utf-Zeichenfolge ist
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.
Sie lesen es, wenn die beschreibbare Seite beendet ist. Sie müssen nicht einmal warten, bis die lesbare Seite lesbar wird (obwohl dies sicherlich der Fall ist). Lesen Sie bitte Ihre Dokumentation.
hmac.end(...)
aufgerufen wurde. " beendet " bedeutet, dass der Stream sein Endereignis ausgelöst hat , weshalb der Befehl einen Rückruf akzeptiert. Nach dem Aufruf der end () -Methode benötigt der Stream Zeit, um die Daten auf das zugrunde liegende System zu übertragen. Wenn Sie read () aufrufen, bevor das Finish-Ereignis ausgelöst wird, schlägt dies fehl. Geben Sie Gwerders Code in JSbin ein und überzeugen Sie sich selbst. Sie sollten die Streams- Dokumentation lesen, um zu verstehen, wie es funktioniert.
read()
wenn die beschreibbare Seite endet, und es gibt nichts über das Ende des Ereignisses.