Websocket 服务器握手响应
Posted
技术标签:
【中文标题】Websocket 服务器握手响应【英文标题】:Websocket server handshake response 【发布时间】:2018-02-25 03:40:23 【问题描述】:我正在尝试设置 websocket 通信。我可以打开 websocket,但我不知道如何让握手响应正确。根据几个网站:
“此外,服务器可以在这里决定扩展/子协议请求;有关详细信息,请参阅杂项。Sec-WebSocket-Accept 部分很有趣。服务器必须从客户端发送的 Sec-WebSocket-Key 派生它。得到它,将客户端的 Sec-WebSocket-Key 和“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”连接在一起(它是一个“魔术字符串”),获取结果的 SHA-1 哈希,并返回 base64 编码哈希...因此,如果密钥是“dGhlIHNhbXBsZSBub25jZQ==”,则接受将是“s3pPLMBiTxaQ9kYGzzhZRbK+xOo="。
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
但我似乎根本无法重现这些结果。我尝试了许多编码器/解码器,并试图找到上述指令的替代解释,但它们都不起作用。我也没有找到任何这样做的代码示例。
输入:dGhlIHNhbXBsZSBub25jZQ==
魔线(永不改变):258EAFA5-E914-47DA-95CA-C5AB0DC85B11
输出:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
我得到正确答案的唯一方法是通过this site。似乎 SHA1 编码错误,但整体 64 位答案是否正确?无论如何,我们将不胜感激。
【问题讨论】:
您可以随时look at what others did。它可以帮助你弄清楚逻辑。 【参考方案1】:伪代码:
sec_websocket_key = "dGhlIHNhbXBsZSBub25jZQ=="
magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
return base64(sha1(sec_websocket_key .. magic_string))
假设您安装了 OpenSSL,这是一个可以在 UNIX shell 中运行的真实实现:
SEC_WEBSOCKET_KEY="dGhlIHNhbXBsZSBub25jZQ=="
MAGIC_STRING="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
echo -n "$SEC_WEBSOCKET_KEY$MAGIC_STRING" \
| openssl sha1 -binary \
| openssl base64
确保您使用的是 SHA1(而不是 SHA256),并且您使用的实现返回的是原始数据,而不是十六进制摘要。哈希函数的输出应该是 160 位(20 字节)长。
另外,请记住,尽管 Sec-WebSocket-Key
看起来像 Base64 数据,您不需要对其进行解码。它按原样包含在哈希中。
【讨论】:
以上是关于Websocket 服务器握手响应的主要内容,如果未能解决你的问题,请参考以下文章