Websocket(草案76)握手困难!

时间:2011-01-19 19:11:45

标签: vb.net md5 websocket handshake

我正在使用以下键来计算正确的握手响应字符串:
密钥1:18x 6] 8vM; 54 *(5:{U1] 8 z [8
密钥2: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哈希:0947fa630a5510d3546d5b4b20543275

帮助!

2 个答案:

答案 0 :(得分:3)

这是用于创建响应哈希的python代码:

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

在示例中,num1和num2是key1和key2的数值。 key3是收到的实际文本字符串(原始字节)。

struct.pack()调用使用大端模式(对于数值)并为每个数字打包4个字节,后跟8个字节的key3字符串(字节)。

有关python struct module的信息,请参阅Documentation

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)。

答案 1 :(得分:1)

这是我的版本:

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

如果您使用星际之门,那么所有令人讨厌的东西都会为您完成: - )