Websockets - Sec-WebSocket-Accept 不匹配

Posted

技术标签:

【中文标题】Websockets - Sec-WebSocket-Accept 不匹配【英文标题】:Websockets - Sec-WebSocket-Accept mismatch 【发布时间】:2012-02-23 12:09:09 【问题描述】:

我正在用 C++ 编写 websocket 服务器,但在计算 Sec-WebSocket-Accept 密钥时遇到了问题。我已经测试了 sha1 并且它生成了正确的值(我从***示例中获取了字符串并得到了相同的哈希),我还找到了在线 base64 转换器来测试第二部分,它似乎工作正常。但是从其他问题可以看出,我的字符串太长了。

  std::string secKey =  readHeader(buffer,n,"Sec-WebSocket-Key");
  std::string magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

  secKey.append(magic);
  unsigned char hash[20];
  char hexstring[41];

  sha1::calc(secKey.c_str(),secKey.length(),hash);
  sha1::toHexString(hash,hexstring);
  std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hexstring) ,strlen(hexstring));

对于 secKey = "4aRdFZG5uYrEUw8dsNLW6g==" 我得到编码值 "YTYwZWRlMjQ4NWFhNzJiYmRjZTQ5ODI4NjUwMWNjNjE1YTM0MzZkNg=="

【问题讨论】:

【参考方案1】:

我认为您可以跳过 toHexString 行并改为 base64 编码 20 字节哈希。

sha1::calc(secKey.c_str(),secKey.length(),hash);
std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hash), 20);

这就是我的C++ server 所做的并且握手成功完成。

【讨论】:

@Nikita,很高兴它有效。如果您对我的回答感到满意,您能接受吗(赞成/反对投票按钮下方的绿色勾号)? 我昨天尝试这样做,但我还没有足够的声誉,抱歉 =) 我认为你应该能够做到这一点。您需要单击向上/向下箭头下方的勾号轮廓。接受答案会增加你的声誉,所以如果一个低的初始代表阻止你这样做会有点不公平:-) 我的错!我正在单击向上箭头。现在接受,谢谢!)

以上是关于Websockets - Sec-WebSocket-Accept 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Go 实现 WebSockets:1.什么是 WebSockets

WebSockets Tutorial(教程一)————WebSockets简介

Rails 中的 WebSockets:在使用 websockets 时,我们是不是必须在现有应用程序中创建一个新的 WebSocketController?

结合 websockets 和 http

Websockets:命名服务器的含义?

Websockets 比 WebRTC 快?