Websocket (черновик 76) трудности с рукопожатием!

Я использую следующие ключи для расчета правильной строки ответа на рукопожатие:
Ключ 1: 18x 6]8vM;54 *(5: { U1]8 z [ 8
Ключ 2: 1_ tx7X d ‹ nw 334J702) 7 ]o}` 0
Key3: 54:6d:5b:4b:20:54:32:75

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

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

Помощь!


person Jordan    schedule 19.01.2011    source источник


Ответы (2)


Это код 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-байтовая строка key3 (байты).

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

Версия 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).

person kanaka    schedule 19.01.2011
comment
Не могли бы вы, случайно, добиться того же результата в VB.NET? Я предполагаю, что это будет похоже на версию C из-за отсутствия функции Pack в .NET. - person Jordan; 20.01.2011
comment
К сожалению, у меня нет инструментов разработки VB.NET или .NET. - person kanaka; 21.01.2011

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

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

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

person Ben Ford    schedule 31.01.2011