WebSocket key1+key2+8_byte_data!= 16 байт (128 бит)?
Я пытаюсь создать сервер веб-сокетов в Java, но у меня возникают трудности... спецификация веб-сокетов говорит о том, что вы должны объединить числа из ключей key1 и key2, а затем объединить дополнительные 8 байтов данных для '... сформировать 128-битную строку, сумма MD5 которой затем используется сервером, чтобы доказать, что он прочитал рукопожатие. '
Примером key1 является 155712099. Примером key2 является 173347027. Примером 8 байтов дополнительных данных является Tm[K T2u.
'155712099173347027Tm[K T2u' - это 26 байтов, а не 16 байтов (128 бит), как должно быть! Что мне здесь не хватает?
Я могу "получить" все о веб-сокетах, но эту маленькую часть здесь.
2 ответа
Вы используете 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.
Если key1 и key2 являются 32-битными целыми числами, вам, вероятно, нужно объединить представления каждого из них в виде 4-х байтов каждое, а не их строковое представление.