【问题标题】:How does a WebSocket key work?WebSocket 密钥如何工作?
【发布时间】:2016-09-17 10:05:35
【问题描述】:

最近我一直在研究 WebSockets,我觉得它们很酷。但是,如果我看一下here,有些事情我不清楚。

请求:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

回复:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

请求者指定主机,因此中间服务器将知道请求应该到达哪里。请求者发送一个编码为 base64 的随机字符串,服务器发回一个加盐的 SHA1 加密密钥。当连接处于活动状态时,是否会在两者之间使用此密钥?如果是这样,有没有办法在连接断开的情况下重复使用这个密钥?

【问题讨论】:

    标签: browser websocket


    【解决方案1】:

    正如您在维基百科链接中提到的那样:

    除了 Upgrade 标头之外,客户端还发送一个包含 base64 编码随机字节的 Sec-WebSocket-Key 标头,服务器使用 Sec-WebSocket-Accept 标头中的密钥哈希值进行回复。 这是为了防止缓存代理重新发送之前的 WebSocket 会话,并且不提供任何身份验证、隐私或完整性。

    Sec-WebSocket-Key 仅用于握手内部,不用于实际通信。

    密钥旨在通过发送随机密钥来防止代理缓存请求。如果代理仍然返回缓存响应,可以通过验证Sec-WebSocket-Accept 标头来检查。

    客户端可以忽略Sec-WebSocket-Accept 标头(并希望响应没有被缓存),WebSocket 协议仍然可以正常工作。
    在这种情况下,服务器可以实现忽略Sec-WebSocket-Key 标头而不返回Sec-WebSocket-Accept 标头。

    如何为响应或验证生成Sec-WebSocket-Accept 标头可以在此答案中阅读:
    generate "Sec-WebSocket-Accept" from "Sec-WebSocket-Key"

    【讨论】:

      【解决方案2】:

      散列函数附加固定字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11(一个 GUID)到从 Sec-WebSocket-Key 标头(未从 base64 解码),适用 SHA-1 哈希函数,并使用 base64 对结果进行编码。

      https://en.wikipedia.org/wiki/WebSocket#Protocol%20handshake

      更多信息请访问:https://www.rfc-editor.org/rfc/rfc6455#section-1.3

      【讨论】:

        猜你喜欢
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多