Je veux créer un hachage de I love cupcakes
(signé avec la clé abcdeg
)
Comment puis-je créer ce hachage à l'aide de Node.js Crypto?
Je veux créer un hachage de I love cupcakes
(signé avec la clé abcdeg
)
Comment puis-je créer ce hachage à l'aide de Node.js Crypto?
Réponses:
Documentation pour 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/…
Il y a quelques années, il a été dit que update()
et digest()
étaient des méthodes héritées et la nouvelle approche API de streaming a été introduite. Maintenant, les documents indiquent que l'une ou l'autre méthode peut être utilisée. Par exemple:
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);
Testé sur les nœuds v6.2.2 et v7.7.2
Voir https://nodejs.org/api/crypto.html#crypto_class_hmac . Donne plus d'exemples d'utilisation de l'approche de streaming.
update
et non write
. Je suis confus, quelle est la meilleure pratique maintenant? Je ne trouve pas de ressources qui le disent aussi clairement que vous le mentionnez.
digest
et update
ont pas été dépréciée et sont présentés dans la documentation: nodejs.org/api/crypto.html#crypto_class_hmac . Je recommande d'utiliser l'API de flux uniquement si vous lisez à partir d'un flux.
La solution de Gwerder ne fonctionnera pas car elle hash = hmac.read();
se produit avant la finalisation du flux. D'où les problèmes d'AngraX. De plus, l' hmac.write
instruction n'est pas nécessaire dans cet exemple.
Au lieu de cela, procédez comme suit:
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...
});
Plus formellement, si vous le souhaitez, la ligne
hmac.end(text, function () {
pourrait être écrit
hmac.end(text, 'utf8', function () {
parce que dans cet exemple, le texte est une chaîne 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.
Vous le lisez lorsque le côté accessible en écriture est terminé , vous n'avez même pas besoin d'attendre quand le côté accessible en lecture devient lisible (bien que ce soit sûrement le cas). Lisez votre documentation s'il vous plaît.
hmac.end(...)
a été appelé, « terminé » signifie que le flux a déclenché son événement de fin , c'est pourquoi la commande accepte un rappel. Après l'appel de la méthode end (), le flux nécessite du temps pour vider les données vers le système sous-jacent. Si vous appelez read () avant que l'événement de fin ne soit déclenché, il échouera. Allez-y et passez le code de Gwerder dans JSbin et voyez par vous-même. Vous devriez lire la documentation Streams pour comprendre comment cela fonctionne.
read()
lorsque le côté accessible en écriture est terminé, et il n'y a rien à propos de l'événement de fin.