Вопрос

Я использую следующие клавиши для расчета правильной строки ответа рукопожатия:
Key1: 18x 6] 8vm; 54 *(5: {u1] 8 z [8
Key2: 1_ TX7X D <NW 334J702) 7] O} `0
Ключ3: 54: 6d: 5b: 4b: 20: 54: 32: 75

Я рассчитал значения Key1 и Key2:
KEY1: 0947FA63 (HEX)
Ключ2: 0A5510D3

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

Помощь!

Это было полезно?

Решение

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

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

В примере num1 и num2 являются числовые значения Key1 и Key2. Key3 - это фактическая текстовая строка (сырые байты), полученную.

Вызов struct.pack () использует Big Endian Mode (для числовых значений) и упаковывает их 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 в глибк.

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top