Como posso obter o hash sha1 de uma corda no nó.js?

Estou a tentar criar um servidor websocket escrito no nó.js

Para pôr o servidor a funcionar, preciso do hash SHA1 de uma corda.

o que tenho de fazer é explicado na secção 5.2.2, página 35 dos documentos .

Nota: Por exemplo, se o valor de "Sec-WebSocket-Key" o cabeçalho no aperto de mão do cliente era "dGhlIHNhbXBsZSBub25jZQ==", o servidor iria adicionar thestring "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" para formar o string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11". O servidor então pegaria o hash SHA-1 desta string, dando o valor 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea. Este valor é então codificado com base 64, para dar o valor "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", que seria devolvido no cabeçalho "Sec-WebSocket-Accept".

Author: mikemaccana, 2011-08-08

4 answers

Ver o crypto.createHash() função e associados hash.update() e hash.digest() funções:

var crypto = require('crypto')
  , shasum = crypto.createHash('sha1');
shasum.update("foo");
console.log(shasum.digest('hex'));
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
 185
Author: maerics, 2015-03-02 20:50:51

Obrigatório: O SHA1 está avariado, pode fazer colisões com os créditos AWS da coorte Média Do Acelerador de arranque, mas para responder à sua pergunta:

var getSHA1ofJSON = function(input){
    return crypto.createHash('sha1').update(JSON.stringify(input)).digest('hex')
}

Depois:

getSHA1ofJSON('whatever')

Ou

getSHA1ofJSON(['whatever'])

Ou

getSHA1ofJSON({'this':'too'})
 17
Author: mikemaccana, 2016-03-23 13:43:05

Por favor leia e considere fortemente o meu conselho nos comentários do seu post. Dito isto, se você ainda tem uma boa razão para fazer isso, confira esta listagem de módulos crpyto para nó. Ele tem módulos para lidar com sha1 e base64.

 7
Author: Alex Turpin, 2011-08-08 15:11:24

Dicas para prevenir a emissão (hash má):

Eu experimentei que NodeJS está a esmagar a representação UTF-8 do texto. Outras linguagens (como Python, PHP ou PERL...) are hashing the byte string.

Podemos adicionar argumento binário para usar a cadeia de bytes.

const crypto = require("crypto");

function sha1(data) {
    return crypto.createHash("sha1").update(data, "binary").digest("hex");
}

sha1("Your text ;)");

Você pode tentar com : "\xac", "\xd1", "\xb9", "\xe2", "\xbb", "\x93", etc...

Outras línguas (Python, PHP,...):

sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47

Nodejs:

sha1 = crypto.createHash("sha1").update("\xac", "binary").digest("hex") //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash("sha1").update("\xac").digest("hex") //f50eb35d94f1d75480496e54f4b4a472a9148752
 0
Author: Hors Sujet, 2018-06-11 20:50:09