【问题标题】:How to interpret the browser's Sec-websocket-key for server handshake?如何解释浏览器的 Sec-websocket-key 以进行服务器握手?
【发布时间】:2014-06-27 20:36:04
【问题描述】:

我已经用 C++ 编写了一个支持常规网站的基本 HTTP 服务器,但现在我正在尝试扩展它以支持 websockets。所有的网络和解析都是由我自己的代码完成的,所以没有库——除了我复制并粘贴了一些用于计算 SHA1 并转换为 base64 的代码。

我正在阅读一些描述如何握手传入 websocket 连接的指南,例如:http://www.altdev.co/2012/01/23/writing-your-own-websocket-server/http://enterprisewebbook.com/ch8_websockets.html

我被困在服务器需要从客户端的标头中获取密钥并将魔术字符串附加到其上的部分,然后使用 SHA1 对其进行哈希处理,将其编码为 base64,并将结果作为接受的一部分发回标题。

给我带来麻烦的具体部分是密钥中的“==”,以及服务器发回的结果字符串中的“=”。我找不到任何说明如何处理这些的信息 - 在将魔术字符串附加到它之前,我是从键中删除 ==,还是继续使用它们?另外,我无法弄清楚最终服务器答案末尾的“=”来自哪里——以及为什么服务器的答案只有一个“=”而客户端的密钥有两个“=”

最后,我很困惑为什么服务器使用的魔术字符串是base16,但客户端浏览器发送的密钥已经是base64——我需要在附加之前将服务器字符串转换为base 64,还是需要没关系?

当我转换为 base 64 时,我是将其转换为好像每个 ascii 符号都是数字(因此字符串中的“A”将是 10),还是将整个字符串的二进制表示转换为字符串代表原始二进制但带有base64的数字?

对不起,如果这是一个愚蠢的问题,但我没有做太多的网络编程,所以当文章假设读者对部分信息有所了解时,我会感到困惑。

【问题讨论】:

    标签: c++ websocket


    【解决方案1】:

    伪代码:

    key_decoded = base64_decode(key64)
    magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    response = SHA1(append(key_decoded, magic))
    response_encoded = base64_encode(response)
    

    base64 编码数据末尾的“=”用于将数据填充到所需的长度。你不必对它做任何事情。 (见这里:Why does a base64 encoded string have an = sign at the end)不同长度的输入数据可能需要不同的填充量,因此在您的示例中,两个编码值具有不同的填充量。

    当您转换为 base64 时,您不对输入数据进行任何假设,它只是输入字节。不要将 'a' 转换为 10(您似乎认为 ascii 字符应该代表十六进制数字,这是不相关的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-05-04
      • 2011-12-26
      • 1970-01-01
      • 2023-03-31
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多