WebSocket密钥如何工作?

时间:2016-09-17 10:05:35

标签: browser websocket

最近我一直在研究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中的随机字符串,服务器返回一个salted SHA1加密密钥。在连接处于活动状态时,是否会在两者之间使用此密钥?如果是这样,即使连接断开,是否可以重用此密钥?

2 个答案:

答案 0 :(得分:4)

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

  

除了升级标头之外,客户端还发送包含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"

答案 1 :(得分:0)

  

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

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

更多信息:https://tools.ietf.org/html/rfc6455#section-1.3