javascript - nodejs - ¿Cómo puedo obtener el hash sha1 de una cadena en node.js?
websocket nodejs express (4)
Consejos para evitar problemas (hash incorrecto):
Experimenté que NodeJS está mezclando la representación UTF-8 de la cadena. Otros lenguajes (como Python, PHP o PERL ...) están mezclando la cadena de bytes.
Podemos agregar un argumento binario para usar la cadena de bytes.
const crypto = require("crypto");
function sha1(data) {
return crypto.createHash("sha1").update(data, "binary").digest("hex");
}
sha1("Your text ;)");
Puede probar con: "/ xac", "/ xd1", "/ xb9", "/ xe2", "/ xbb", "/ x93", etc.
Otros idiomas (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
Intento crear un servidor websocket escrito en node.js
Para que el servidor funcione, necesito obtener el hash SHA1 de una cadena.
Lo que tengo que hacer se explica en la Sección 5.2.2 página 35 de los documentos .
NOTA: Como ejemplo, si el valor del encabezado
"Sec-WebSocket-Key"
en el protocolo de enlace del cliente fuera"dGhlIHNhbXBsZSBub25jZQ=="
, el servidor agregaría la cadena"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
para formar la cadena"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
. El servidor tomaría entonces el hash SHA-1 de esta cadena, dando el valor 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea. Este valor se codifica en base64 para dar el valor"s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
, que se devolverá en el encabezado"Sec-WebSocket-Accept"
.
Por favor, lea y considere seriamente mi consejo en los comentarios de su publicación. Dicho esto, si todavía tiene una buena razón para hacerlo, consulte esta lista de módulos crpyto para Nodo. Tiene módulos para tratar tanto con sha1 como con base64.
Vea la función crypto.createHash()
y las funciones asociadas hash.update()
y hash.digest()
:
var crypto = require(''crypto'')
, shasum = crypto.createHash(''sha1'');
shasum.update("foo");
console.log(shasum.digest(''hex''));
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
Obligatorio: SHA1 está roto , puede hacer colisiones con los créditos de AWS de la cohorte promedio de aceleración de inicio, pero para responder a su pregunta:
var getSHA1ofJSON = function(input){
return crypto.createHash(''sha1'').update(JSON.stringify(input)).digest(''hex'')
}
Entonces:
getSHA1ofJSON(''whatever'')
o
getSHA1ofJSON([''whatever''])
o
getSHA1ofJSON({''this'':''too''})