Websocket(草稿76)握手困难!
题
我正在使用以下键来计算正确的握手响应字符串:
key1:18x 6] 8vm; 54 *(5:{u1] 8 z [8
KEY2: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 Hashing:0947FA630A5510D3546D5B4B2054B20543275
帮助!
解决方案
这是用于创建响应哈希的Python代码:
from hashlib import md5
import struct
....
hashed = md5(struct.pack('>II8s', num1, num2, key3)).digest()
在示例中,num1和num2是key1和key2的数值。 Key3是接收到的实际文本字符串(RAW字节)。
struct.pack()调用使用Big Endian模式(对于数字值),并为每个数字打包4个字节,然后是8个字节Key3字符串(字节)。
看到 文档 对于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)。
其他提示
这是我的版本:
https://github.com/boothead/stargate/blob/master/stargate/handshake.py#l104
如果您使用星际之门,那么所有讨厌的事情都为您完成:-)
不隶属于 StackOverflow