【问题标题】:WebSocket: How does the client get the server guid?WebSocket:客户端如何获取服务器 guid?
【发布时间】:2015-09-19 16:19:06
【问题描述】:

RFC6455 第 7 和 8 页,您可以看到服务器如何处理客户端的 Sec-WebSocket-Key 值(连接个人 GUID,使用 SHA1 并返回 base64 编码字符串)。

我猜这是出于安全原因。如果客户端知道服务器 GUID,它可以进行相同的计算并将答案与其个人结果进行比较,以识别服务器。

但是客户端如何知道服务器的 GUID?还是这个算法有完全不同的原因?

【问题讨论】:

    标签: security http networking websocket handshake


    【解决方案1】:

    为了证明握手被接收,服务器必须采取 两条信息并将它们组合起来形成响应。这 第一条信息来自|Sec-WebSocket-Key| 客户端握手中的头字段:

        Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    

    具体来说,如上例所示,|Sec-WebSocket-Key|
    标头字段的值为“dGhlIHNhbXBsZSBub25jZQ==”,服务器
    将连接字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”
    形成字符串“dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-
    C5AB0DC85B11"。然后,服务器将采用 SHA-1 哈希,
    给出值 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6
    0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea。这个值是
    然后进行 base64 编码(参见 [RFC4648] 的第 4 节),给出值
    “s3pPLMBiTxaQ9kYGzzhZRbK+xOo=”。然后这个值会在
    中回显 |Sec-WebSocket-Accept|头域。

    客户端不需要知道 GUID。这是一种防止代理重用 websocket 响应的机制。

    https://en.wikipedia.org/wiki/WebSocket#Protocol_handshake

    【讨论】:

    • 可能值得一提的是用于生成的终端命令是echo -n "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" | openssl dgst -binary -sha1 | openssl base64。此外,十六进制的中间 sha1 总和为 b37a4f2cc0624f1690f64606cf385945b2bec4ea 但请注意,在对其进行 base64 编码之前,您必须将其转换为二进制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多