WebSocket key1 + key2 + 8_byte_data! = 16 байт (128 бит)? - PullRequest
0 голосов
/ 17 ноября 2010

Я пытаюсь построить сервер веб-сокетов на Java, но у меня возникают трудности ... спецификация веб-сокетов говорит, что вам нужно объединить числа из ключей key1 и key2, а затем объединить дополнительные 8 байтов данных для ' ... сформировать 128-битную строку с суммой MD5 затем используется сервером, чтобы доказать, что он прочитал рукопожатие.

Пример ключа 1: 155712099 Пример key2 - 173347027 Пример 8 байтов дополнительных данных - Tm [K T2u

'155712099173347027Tm [K T2u' - это 26 байтов, а не 16 байтов (128 бит), как должно быть! Что мне здесь не хватает?

Я могу «получить» все о веб-розетках, но эту маленькую часть здесь.

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Вы используете key1 и key2 как строку цифр вместо 32-битных чисел.

Например, 155712099 в качестве шестнадцатеричного 32-разрядного числа: 0x63, 0xfa, 0x47, 0x09 (0x947fa63). Это то, что ты хочешь. Вам необходимо преобразовать строки key1 и key2 в целые числа без знака, а затем упаковать эти 4 байта в позицию 0 (для key1) и позицию 4 (для key2) целевого байтового массива.

Принимая 155712099 в качестве строки цифр, получится 9-байтовая строка с шестнадцатеричными значениями: 0x31, 0x35, 0x35, 0x37, 0x31, 0x32, 0x30, 0x39, 0x39. С другой стороны, вы хотите упаковать дополнительные байты непосредственно в целевой массив байтов, начиная с позиции 8. Это должно дать вам целевой массив байтов длиной 16 байтов.

Обратите внимание, что рукопожатие преднамеренно манипулирует различными элементами данных как разными типами данных, чтобы попытаться предотвратить различные типы атак на сервер WebSockets.

1 голос
/ 17 ноября 2010

Если key1 и key2 являются 32-разрядными целыми числами, вам, вероятно, необходимо объединить представления каждого из них в виде 4 байтов каждое, а не их строковое представление.

...