Websocket (progetto 76) difficoltà di stretta di mano!
Domanda
Io sto usando i seguenti tasti per calcolare la stringa di risposta corretta stretta di mano:
Key1: 18x 6] 8vm; 54 * (5: {U1] 8 z [8
Key2: 1_ tx7X d
Ho calcolato i valori Key1 e Key2 di:
Key1: 0947fa63 (hex)
Key2: 0a5510d3
Comunque non sono sicuro su cosa fare dopo, da quello che ho potuto capire, è loro e MD5 è concatenare, ma che non sembra di capire cioè MD5 hash: 0947fa630a5510d3546d5b4b20543275
Aiuto!
Soluzione
Questo è il codice Python per creare l'hash di risposta:
from hashlib import md5
import struct
....
hashed = md5(struct.pack('>II8s', num1, num2, key3)).digest()
Nell'esempio num1 e num2 sono i valori numerici di key1 e key2. key3 è la stringa di testo effettivo (byte grezzi) ricevuto.
La chiamata struct.pack () è utilizzando la modalità endian grande (per i valori numerici) e imballaggio loro 4 byte per ciascun numero seguito dalla stringa key3 8 byte (byte).
documentazione del modulo python struct.
La versione C sarebbe più simile a questo:
/* Pack it big-endian */
buf[0] = (num1 & 0xff000000) >> 24;
buf[1] = (num1 & 0xff0000) >> 16;
buf[2] = (num1 & 0xff00) >> 8;
buf[3] = num1 & 0xff;
buf[4] = (num2 & 0xff000000) >> 24;
buf[5] = (num2 & 0xff0000) >> 16;
buf[6] = (num2 & 0xff00) >> 8;
buf[7] = num2 & 0xff;
strncpy(buf+8, headers->key3, 8);
buf[16] = '\0';
md5_buffer(buf, 16, target);
target[16] = '\0';
glibc .
Per ulteriori riferimenti si può guardare le implementazioni di lavoro (dove il codice di cui sopra è venuto da) di websockify ( disclaimer:. ho scritto websockify)
Altri suggerimenti
Ecco la mia versione:
https://github.com/boothead/stargate/ blob / master / stargate / handshake.py # L104
Se si utilizza stargate allora tutta quella roba brutta è fatto per voi: -)