【问题标题】:Websocket server handshake responseWebsocket 服务器握手响应
【发布时间】: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 位答案是否正确?无论如何,我们将不胜感激。

【问题讨论】:

标签: c++ encryption websocket


【解决方案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 数据,您不需要对其进行解码。它按原样包含在哈希中。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2016-03-02
    • 2011-12-26
    • 1970-01-01
    • 2019-04-05
    • 2013-12-25
    • 1970-01-01
    • 2018-09-20
    • 2012-11-11
    相关资源
    最近更新 更多