0

我正在尝试用Java构建一个websocket服务器,但我遇到了困难...... websockets的规范说你必须连接key1和key2中的数字,然后将额外的8字节数据连接到'......形成一个 128 位字符串,然后服务器使用其 MD5 和来证明它读取了握手。

示例 key1 为 155712099 示例 key2 为 173347027 示例 8 字节额外数据为 Tm[K T2u

'155712099173347027Tm[K T2u' 是 26 字节而不是 16 字节(128 位),就像它假设的那样!我在这里想念什么?

我可以“获取”有关 websockets 的所有信息,但这里只有一小部分。

4

2 回答 2

1

如果 key1 和 key2 是 32 位整数,您可能需要将它们中的每一个的表示连接在一起,每个表示为 4 个字节,而不是它们的字符串表示。

于 2010-11-17T03:17:23.837 回答
1

您使用 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 服务器的不同类型的攻击。

于 2010-11-17T05:06:14.687 回答