【发布时间】:2013-08-18 09:02:41
【问题描述】:
在draft-ietf-hybi-thewebsocketprotocol-17的1.3节“打开握手”中,对Sec-WebSocket-Key的描述如下:
为了证明握手被接收,服务器必须获取两条信息并将它们组合起来形成响应。第一条信息来自|Sec-WebSocket-Key|客户端握手中的头字段:
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==对于这个头域,服务器必须取值(在头域中,例如 base64 编码的 [RFC4648] 版本减去任何前导和尾随空格),并将其与全局唯一标识符(GUID , [RFC4122]) "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 字符串形式,不太可能被不理解 WebSocket 协议的网络端点使用。然后在服务器的握手 [FIPS.180-2.2002] 中返回此连接的 SHA-1 哈希(160 位)、base64 编码(参见 [RFC4648] 的第 4 节)。
这是我无法理解的事情:为什么不简单地返回代码 101?如果正确使用 Sec-WebSocket-Key 是为了安全,或者为了证明他们可以处理 websocket 请求,那么任何服务器都可以根据需要返回预期的密钥,并假装自己是 WebSocket 服务器。
【问题讨论】:
-
有没有人想到 Sec-WebSocket-Key HTTP 标头可以是公共 RSA 密钥?如果您了解 OpenSSL,显然反之亦然?这项技术是如此强大,以至于仅仅考虑它在浏览器上下文中的潜力就真的限制了它在宏伟计划中的潜力?
-
@suchislife 不,规范说这是为每次握手随机选择的 16 字节 b64 编码随机数。
标签: websocket