WebSocket Handshake Implementieren
Übersicht

FWeinbehemals "ich"Betreff: WebSocket Handshake Implementieren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bin jetzt seit einer Stunde damit beschäftigt den WebSocket Handshake zu Implementieren, doch leider ohne Erfolgt.
Ich habe hier ein die Dokumentation des Protokolls doch leider werde ich nicht schlau daraus. Das Problem ist dieser Part der Erklärung: Zitat: The concatenation of the number obtained from processing the |Sec-
WebSocket-Key1| field, expressed as a big-endian 32 bit number, the number obtained from processing the |Sec-WebSocket-Key2| field, again expressed as a big-endian 32 bit number, and finally the eight bytes at the end of the handshake, form a 128 bit string whose MD5 sum is then used by the server to prove that it read the handshake. Müssen Key1 und Key2 sowie die "eight byte" einfach aneinander gehangen werden und der MD5 Hash draus gemacht werden? Kann scheinbar nicht sein, da ich genau das mache... Gruß, Ich [Edit] Habe gerade in einer PHP Implementation gesehen, dass der Handshake mit der Funktion pack('N', key1) usw. zusammengeführt wird. Code: [AUSKLAPPEN] md5(
pack('N', $this->keyToBytes($key1)) . pack('N', $this->keyToBytes($key2)) . $key3, true); Doch leider weiß ich nicht, wie ich die Funktion in BlitzMax Umsetzen sollte. Hier die Beschreibung bei php.net pack |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
![]() |
Lord Stweccys |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bitte tötet mich nicht, wei ich diesen alten Thread ausgrabe, aber ich glaube,
dass dieser Thread beantwortet werden muss (Nicht nur, weil ich mir dieselbe Frage stelle) Zu dem Thema habe ich im Internet (nach langer Suche) diese Seite gefunden: http://stackoverflow.com/quest...ke-problem Mit folgender Anleitung (zwar in Python, aber lässt sich relativ leicht in BlitzMax umsetzen, fürchte ich): Code: [AUSKLAPPEN] Lets start with key1, key2, and the 8 bytes at the end of the handshake
key1 = "18x 6]8vM;54 *(5: { U1]8 z [ 8" key2 = "1_ tx7X d < nw 334J702) 7]o}` 0" end8 = "Tm[K T2u" We make a number for each key by ignoring every character that is not a digit 0-9. In Python: def numFromKey(key): return int(filter(lambda c: c in map(str,range(10)),key)) next we divide that number by the number of spaces in the original key string, so here is a is a function that counts the spaces in a string. def spacesIn(key): return len(filter(lambda c: c==' ',key)) The two numbers resulting from the keys are: pkey1 = numFromKey(key1)/spacesIn(key1) pkey2 = numFromKey(key2)/spacesIn(key2) Now we need to concatenate the bytes of pkey1, pkey2, and end8. The processed keys need to be represented as 32 bit Big-Endian numbers. from struct import pack catstring = pack('>L',pkey1) + pack('>L',pkey2) + end8 Then we take the md5 hash of those bytes to get the magic number that we tack on the end of the handshake import md5 magic = md5.new(catstring).digest() Thats how I think it works at least (Md5 mit bLitzMax ist kein Problem, einfach bei google suchen, da wird man locker fündig) |
||
FWeinbehemals "ich" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Durch die Hilfe von Lobby funktioniert es nun bei mir. Hier den umsetzung von packN:
BlitzMax: [AUSKLAPPEN] Function packN:String(in:Int) 'Thank's to Lobby! und um aus einem MD5 String rawBinary (wird von der Spezifikation gefordert) zu machen gibt es noch diese Funktion: BlitzMax: [AUSKLAPPEN] Function toRawBinary:String(in:String) Wie gesagt, beide Funktionen sind von Lobby. Bin ihm auch sehr dankbar dafür. Brauchte das ganze für das hier: https://www.blitzforum.de/foru...hp?t=36188 |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry dass ich diesen alten Thread nochmal heraus krame, aber kann mir jemand vielleicht erklären wie das mit dem Handshake exakt funktioniert? Ich verstehe da nur Bahnhof.
Ich weiß dass die beiden Keys Ziffern und Leerzeichen beinhalten. Die Ziffern aneinander gehangen ergeben einen Key und man muss sich die Anzahl der Leerzeichen merken ... durch irgendwelche Magie wird dann aus den beiden Keys und dem 8Bit String am Ende des HTTP Paketes ein Wert den man irgendwie so verzaubern muss dass er als Antwort für den Handshake genügt ... |
||
Farbfinsternis.tv |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Zahl von Key1 wird durch die Anzahl Leerschläge in Key1 dividiert. Das gleiche macht man auch bei Key2.
Diese beiden Zahlen (32-bit Integer) und die 8 Bytes die der Client gesendet hat hängt man zusammen (Byte-Array). Das sind dann total 16Bytes. Edit: Dabei zu beachten ist auch noch, dass man die beiden Zahlen im Big-Endian-Format in das Byte-Array einfügen muss, also vermutlich die Byte-Reihenfolge der einzelnen Zahlen umkehren (hatte es in C# mit Hilfe von BitConverter gemacht). Diese 16Bytes lässt man durch den MD5-Algorithmus und erhält 16 neue Bytes, welche man als Antwort (String) sendet. Pseudocode: Code: [AUSKLAPPEN] byte[] clientBytes = LeseBytesVomClient(); ulong zahl1 = ExtrahiereZahl(Key1); // ulong, da die zahlen recht gross sein können ulong zahl2 = ExtrahiereZahl(Key2); ulong spaces1 = AnzahlLeerschläge(Key1); ulong spaces2 = AnzahlLeerschläge(Key2); uint neueZahl1 = (uint)(zahl1 / spaces1); uint neueZahl2 = (uint)(zahl2 / spaces2); byte[] buffer = { die bytes von neueZahl1, neueZahl2, clientBytes }; buffer = MD5(buffer); string antwort = (string)buffer; |
||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jetzt ist es klar ... vielen Dank Jolinah! | ||
Farbfinsternis.tv |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group