Трудности рукопожатия Websocket (проект 76)! - PullRequest
1 голос
/ 19 января 2011

Я использую следующие ключи для вычисления правильной строки ответа на рукопожатие:
Ключ1: 18x6] 8vM; 54 * (5: {U1] 8 z [8
Ключ2: 1_ tx7X d Key3: 54: 6d: 5b: 4b: 20: 54: 32: 75

Я рассчитал значения Key1 и Key2:
Key1: 0947fa63 (hex)
Key2: 0a5510d3

Однако я не уверен, что делать дальше, из того, что я могу собрать, вы объединяете их и MD5, но это, похоже, не работает, т.е. MD5хеширование: 0947fa630a5510d3546d5b4b20543275

Помогите!

Ответы [ 2 ]

3 голосов
/ 19 января 2011

Это код Python для создания хэша ответа:

from hashlib import md5
import struct
....
hashed = md5(struct.pack('>II8s', num1, num2, key3)).digest()

В примере num1 и num2 являются числовыми значениями key1 и key2.key3 - фактическая полученная текстовая строка (необработанные байты).

Вызов struct.pack () использует режим с прямым порядком байтов (для числовых значений) и упаковывает их по 4 байта для каждого числа, за которым следует 8-байтовый ключ3строка (байты).

См. документацию для модуля python struct.

Версия C будет выглядеть примерно так:

/* 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';

md5_buffer находится в glibc .

. Для дальнейшего ознакомления вы можете посмотреть на рабочие реализации (откуда взялся приведенный выше код) websockify (отказ от ответственности: я написал websockify).

1 голос
/ 31 января 2011

Вот моя версия:

https://github.com/boothead/stargate/blob/master/stargate/handshake.py#L104

Если вы используете звездные врата, тогда все эти неприятные вещи сделаны для вас: -)

...