Ich versuche, einen in node.js geschriebenen Websocket-Server zu erstellen
Damit der Server funktioniert, muss der SHA1-Hash eines Strings abgerufen werden.
Was ich tun muss, wird in Abschnitt 5.2.2, Seite 35 der Dokumentation erläutert .
ANMERKUNG: Wenn beispielsweise der Wert des
"Sec-WebSocket-Key"
Headers im Handshake des Clients"dGhlIHNhbXBsZSBub25jZQ=="
wäre, würde der Server"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
den String anhängen , um die Zeichenfolge zu bilden"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
. Der Server würde dann den SHA-1-Hash dieser Zeichenfolge nehmen und den Wert 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea geben. Dieser Wert wird dann base64-codiert, um den Wert anzugeben"s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
, der im"Sec-WebSocket-Accept"
Header zurückgegeben wird.
quelle
Antworten:
Siehe die
crypto.createHash()
Funktion und die zugehörigenhash.update()
undhash.digest()
Funktionen:quelle
Obligatorisch: SHA1 ist defekt , Sie können SHA1-Kollisionen für 45.000 USD berechnen . Sie sollten verwenden
sha256
:So beantworten Sie Ihre Frage und erstellen einen SHA1-Hash:
Dann:
oder
oder
Offizielle Knotendokumente auf
crypto.createHash()
quelle
Object.toString()
kehrt[object Object]
standardmäßig. Alsosha1sum({})
===sha1sum({"foo":"bar"})
===sha1sum({"a":1})
usw.sha1sum
ist ungenau, wenn man bedenkt, was Sie gesagt haben - dies macht eindeutig mehr als ein normaler sha1. Ich habe die Funktion in der Antwort umbenannt.Bitte lesen und berücksichtigen Sie meinen Rat in den Kommentaren Ihres Beitrags. Wenn Sie dennoch einen guten Grund dafür haben, lesen Sie diese Liste der Kryptomodule für Node . Es verfügt über Module für den Umgang mit sha1 und base64.
quelle
Tipps zur Vermeidung von Problemen (schlechter Hash):
Wir können ein binäres Argument hinzufügen , um die Byte-Zeichenfolge zu verwenden.
Sie können versuchen mit: "\ xac", "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93" usw.
Andere Sprachen (Python, PHP, ...):
Nodejs:
quelle
'binary'
- Alias für'latin1'
nodejs.org/api/…binary
Sie ihn nicht ! Die Verwendung vonbinary
oderlatin1
in der Codierung verliert Informationen und erhöht die Wahrscheinlichkeit von Kollisionen! Versuchen Sie das obige Snippet mit diesen beiden zum Beispiel:❤
und⑤
Sie können verwenden:
Zur Installation:
quelle