C++ WebSocket 服务器实现(接受密钥不匹配)
Posted
技术标签:
【中文标题】C++ WebSocket 服务器实现(接受密钥不匹配)【英文标题】:C++ WebSocket Server Implementation (Accept Key missmatch) 【发布时间】:2013-02-26 19:05:55 【问题描述】:我尝试搜索但没有找到任何答案。 我正在用 c++ 制作一个 websocket 服务器,但我无法让接受密钥工作。
这是我的代码:
std::string magicKey = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
key.append(magicKey);
unsigned char* sha_str = SHA1(reinterpret_cast<const unsigned char*>(key.c_str()), key.length(), nullptr);
std::string final = base64_encode(reinterpret_cast<const unsigned char*>(sha_str), strlen((char*)sha_str));
我正在使用 openssl/sha.h
【问题讨论】:
【参考方案1】:你是否在末尾连接“=”?
等价的perl代码是为了验证你是否需要
use Digest::SHA qw(sha1_base64);
my $clientKey="xyz";
my $specifcationGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
my $fullWebSocketKey = "$clientKey$specifcationGUID";
# dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
#print "Fill socket key is $fullWebSocketKey\n";
# 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf
# 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea
print sha1_base64($fullWebSocketKey) . "=";
【讨论】:
但是在 sha1 和 base64 之后它已经得到了最后的“=”。需要2个吗?? 尝试将代码中的最终字符串与 perl 的字符串进行比较,它们应该是相同的 另外请检查 sha1 字符串的长度应该是 20。strlen(str) 也可能是一个问题。 那么 sha_str 应该有 20 的长度?所以如果 strlen((char*)sha_str) 不返回 20 是不是错了? 所以,我得到了密钥末尾的'/n',所以我删除了它并开始工作。以上是关于C++ WebSocket 服务器实现(接受密钥不匹配)的主要内容,如果未能解决你的问题,请参考以下文章
Websockets - Sec-WebSocket-Accept 不匹配