WebSocket服务器握手响应

Websocket server handshake response

本文关键字:响应 服务器 WebSocket      更新时间:2023-10-16

我正在尝试设置WebSocket通信。我可以打开Websocket,但我不知道如何正确获得握手响应。根据几个网站:

"此外,服务器可以在此处确定扩展/子协议请求;有关详细信息,请参见其他信息。sec-websocket-peccept零件很有趣。服务器必须从客户端发送的sec-websocket-key派生。得到它,将客户的sec-websocket-key和" 258EAFA5-E914-47DA-95CA-95CA-C5AB0DC85B11"一起使用(这是一个"魔术字符串"(,请返回结果的sha-1 hash,然后返回基本64编码哈希...因此,如果密钥是" 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 =

我获得正确答案的唯一方法是通过此站点。它似乎使SHA1编码错误,但是总的64位答案是正确的吗?无论如何,将不胜感激。

pseudocode:

sec_websocket_key = "dGhlIHNhbXBsZSBub25jZQ=="
magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
return base64(sha1(sec_websocket_key .. magic_string))

假设您已安装了OpenSSL:

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-并且您使用的实现返回原始数据,而不是HEX DIGEST。哈希函数的输出应为160位(20个字节(长。

另外,请记住,即使Sec-WebSocket-Key看起来像base64数据,您也无需解码。它包含在hash as-is中。