C ++ - WebSockets是否强制执行加密,如何获取"明文"?

时间:2016-10-19 23:57:16

标签: c++ websocket

我的朋友正在学习如何在他的网络服务器上乱搞WebSockets,所以我决定尝试学习如何将我的HTTP / 1.1连接升级到成功运行的WebSockets!但我发送新的websocket协议数据,但我检索加密/压缩等信息。

所以我的问题是

  1. 数据是加密/压缩的吗?
  2. 我如何检索明文?
  3. WebSockets是否像TCP连接? (我知道WebSockets是基于HTTP构建的,它建立在TCP上)但我知道它们支持双向流,所以我有点想通明明文。
  4. 代码:(这根本没有调试,因为我只是快速连接到我发现与Fiddler搞乱的WebSocket echo服务器)

        int main()
    {
    WSADATA WsaData = { 0 };
    WSAStartup(MAKEWORD(2, 2), &WsaData);
    
    addrinfo hints = { 0 }, *results = nullptr;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AF_INET;
    
    getaddrinfo("echo.websocket.org", "80", &hints, &results);
    
    SOCKET hSocket = socket(results->ai_family, results->ai_socktype, results->ai_protocol);
    connect(hSocket, results->ai_addr, static_cast<int>(results->ai_addrlen));
    
    std::string SendBuffer;
    SendBuffer = "GET http://echo.websocket.org HTTP/1.1\r\n";
    SendBuffer += "Host: echo.websocket.org\r\n";
    SendBuffer += "Upgrade: websocket\r\n";
    SendBuffer += "Connection: Upgrade\r\n";
    SendBuffer += "Origin: http://www.websocket.org\r\n";
    SendBuffer += "Sec-WebSocket-Key: BBw/08+HrO3UfLPU/jeq1g==\r\n";
    SendBuffer += "Sec-WebSocket-Version: 13\r\n";
    SendBuffer += "Sec-WebSocket-Protocol: chat\r\n\r\n";
    
    
    char RecvBuffer[1024], MessageBuffer[50];
    int ReturnCode = 0;
    ReturnCode = send(hSocket, SendBuffer.c_str(), SendBuffer.length(), 0);
    ReturnCode = recv(hSocket, RecvBuffer, 5000, 0);
    
    ReturnCode = send(hSocket, "Hello!", 7, 0);
    ReturnCode = recv(hSocket, MessageBuffer, 50, 0);
    
    
        return 0;
    }
    

    WebSocket协议 - 升级响应:

    HTTP/1.1 101 Web Socket Protocol Handshake
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Headers: content-type
    Access-Control-Allow-Headers: authorization
    Access-Control-Allow-Headers: x-websocket-extensions
    Access-Control-Allow-Headers: x-websocket-version
    Access-Control-Allow-Headers: x-websocket-protocol
    Access-Control-Allow-Origin: http://www.websocket.org
    Connection: Upgrade
    Date: Wed, 19 Oct 2016 23:54:17 GMT
    Sec-WebSocket-Accept: 6+RXVMNG1sZqeIs/Y1tlISzHAFI=
    Server: Kaazing Gateway
    Upgrade: websocket
    

    将数据发送到WebSocket响应:

    \x2\x3\ê
    

2 个答案:

答案 0 :(得分:3)

请阅读定义WebSocket协议的RFC 6455。特别是section 5: Data Framing section 6: Sending and Receiving Data

WebSocket不是纯文本协议。它实际上是一个使用成帧消息的二进制协议,可能包含文本数据:

  

成功握手后,客户端和服务器以本规范中提到的概念单位来回传输数据&#34; message&#34;。在线上,消息由一个或多个帧组成。 WebSocket消息不一定对应于特定的网络层框架,因为碎片消息可能由中间人合并或拆分。

     

帧具有关联类型。属于同一消息的每个帧包含相同类型的数据。从广义上讲,有文本数据的类型(解释为UTF-8 [RFC3629]文本),二进制数据(其解释留给应用程序)和控制框架(不打算为应用程序传送数据)但是代替协议级信令,例如发信号通知连接应该关闭)。该版本的协议定义了六种帧类型,留下了十种用于将来使用。

您的代码根本没有考虑到这一点。就套接字代码而言,唯一的纯文本部分是初始HTTP升级握手。握手完成后,您必须发送和接收带帧的二进制消息。不幸的是,框架过程有点复杂。

您最好的选择是不要手动实现WebSocket,而是使用现有的WebSocket库,例如libwebsocketsWebSocket++easywsclient等。

答案 1 :(得分:0)

在升级响应中,您明确告诉服务器您允许压缩:

SendBuffer += "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n";

如果您不想要压缩,请移除permessage-deflate扩展名。

https://en.wikipedia.org/wiki/DEFLATE