Estoy intentando 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
"Sec-WebSocket-Key"
encabezado en el protocolo de enlace del cliente fuera"dGhlIHNhbXBsZSBub25jZQ=="
, el servidor agregaría"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
la cadena para formar la cadena"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
. El servidor tomaría 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 luego se codifica en base64, para dar el valor"s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
, que se devolvería en el"Sec-WebSocket-Accept"
encabezado.
fuente
Respuestas:
Ver la
crypto.createHash()
función y los asociadoshash.update()
hash.digest()
funciones y :fuente
Obligatorio: SHA1 está roto , puede calcular las colisiones SHA1 por 45,000 USD . Deberías usar
sha256
:Para responder a su pregunta y hacer un hash SHA1:
Luego:
o
o
Documentos oficiales de nodo en
crypto.createHash()
fuente
Object.toString()
devuelve[object Object]
de forma predeterminada. Asísha1sum({})
===sha1sum({"foo":"bar"})
===sha1sum({"a":1})
, etc.sha1sum
es inexacto dado lo que ha dicho; esto claramente hace más de lo que haría un sha1 normal. Cambié el nombre de la función en la respuesta.Por favor lea y considere seriamente mi consejo en los comentarios de su publicación. Dicho esto, si aún tiene una buena razón para hacer esto, consulte esta lista de módulos criptográficos para Node . Tiene módulos para tratar tanto con sha1 como con base64.
fuente
Consejos para evitar problemas (mal hash):
Podemos agregar un argumento binario para usar la cadena de bytes.
Puedes probar con: "\ xac", "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", etc.
Otros lenguajes (Python, PHP, ...):
Nodejs:
fuente
'binary'
- Alias para'latin1'
nodejs.org/api/…binary
! El uso debinary
olatin1
en la codificación perderá información y aumentará la probabilidad de colisiones. Pruebe el fragmento anterior con estos dos, por ejemplo:❤
y⑤
Puedes usar:
Para instalar:
fuente