我正在使用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 ==”
答案 0 :(得分:2)
我认为你可以跳过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所做的事情,握手成功完成。