Quero criar um hash de I love cupcakes
(assinado com a chave abcdeg
)
Como posso criar esse hash usando o Node.js Crypto?
Quero criar um hash de I love cupcakes
(assinado com a chave abcdeg
)
Como posso criar esse hash usando o Node.js Crypto?
Respostas:
Documentação para criptografia: 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/...
Alguns anos atrás foi dito que update()
e digest()
eram métodos legados e da nova abordagem de streaming API foi introduzido. Agora, os documentos dizem que qualquer um dos métodos pode ser usado. Por exemplo:
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);
Testado no nó v6.2.2 e v7.7.2
Consulte https://nodejs.org/api/crypto.html#crypto_class_hmac . Dá mais exemplos de como usar a abordagem de streaming.
update
e não write
. Estou confuso, qual é a melhor prática agora? Não consigo encontrar recursos que digam isso tão claramente quanto você mencionou.
digest
e update
já não se obsoleta e são apresentados na documentação: nodejs.org/api/crypto.html#crypto_class_hmac . Eu recomendo usar a API de fluxo apenas se você estiver lendo de um fluxo.
A solução da Gwerder não funciona porque hash = hmac.read();
acontece antes que o fluxo seja finalizado. Assim, os problemas do AngraX. Além disso, a hmac.write
declaração é desnecessária neste exemplo.
Em vez disso, faça o seguinte:
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...
});
Mais formalmente, se você desejar, a linha
hmac.end(text, function () {
poderia ser escrito
hmac.end(text, 'utf8', function () {
porque neste exemplo o texto é uma string 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.
Você lê-lo quando gravável lado terminou , você não precisa esperar ainda para quando legível lado se torna legível (embora ele certamente faz). Leia sua documentação, por favor.
hmac.end(...)
que foi chamado, " finalizado " significa que o fluxo aumentou seu evento de conclusão , e é por isso que o comando aceita um retorno de chamada. Depois que o método end () é chamado, o fluxo exige tempo para liberar os dados no sistema subjacente. Se você chamar read () antes que o evento de término seja gerado, ele falhará. Vá em frente e cole o código de Gwerder no JSbin e veja você mesmo. Você deve ler a documentação do Streams para entender como ela funciona.
read()
quando o lado gravável terminou, e não há nada sobre o evento de conclusão.