WebSocket (проект 76) Трудности рукопожатия!
Вопрос
Я использую следующие клавиши для расчета правильной строки ответа рукопожатия:
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, то все эти неприятные вещи сделаны для вас :-)