websocket原理、加密、解密

websocket是什么,websocket是基于tcp/ip协议封装的一套实现tcp连接的接口,或者说是工具。我们应该都知道他的业务应用逻辑。
1创建socket
2绑定
3监听
4等待数据
5接受数据
那么他和http之间有什么区别呢,websocket原理又是如何加密和解密的?
http协议:\r\n分割、请求头和请求体\r\n分割、无状态、短连接,属于超文本传输协议,对应于应用层,用于如何封装数据。
websocket协议:\r\n分割,创建连接后不断开、验证+数据加密,属于传输控制协议,对应于传输层,主要解决数据在网络中的传输。
websocket本质就是一个创建连接后不断开的socket,当连接成功之后,客户端会自动向服务端发送消息,包含: Sec-WebSocket-Key和magic_string。
什么是magic_string?
客户端向服务端发送消息时,会有一个’sec-websocket-key’和’magic string’的随机字符串(魔法字符串),
服务端接收到消息后会把他们连接成一个新的key串,进行编码、加密,确保信息的安全性。
所有服务端接收之后,会对该数据进行加密
  事实上,我们第一次发送websocket请求也是一种http请求,我们只是把请求头Upgrade设置为websocket\r\n Connection: Upgrade\r\n,该字段用于改变 HTTP 协议版本或者是换用其他协议,对于Sec-WebSocket-Key 字段,它由客户端生成并发给服务端,用于证明服务端接收到的是一个可受信的连接握手,可以帮助服务端排除自身接收到的由非 WebSocket 客户端发起的连接,该值是一串随机经过 编码的字符串,服务端通过从客户端请求头中读取 Sec-WebSocket-Key 与一串全局唯一的标识字符串魔法字符串做拼接,生成长度为160位的 SHA-1 字符串,然后进行 编码,作为 Sec-WebSocket-Accept 的值回传给客户端。即解析头部构造字典、base64加密、构建响应头、发送、客户端校验,然后进行双工通道进行数据传输,这里借助其他博主的流程图帮助大家理解
在这里插入图片描述发送的数据是加密,解密,根据payload_len的值进行处理:

-payload_len <= 125

-payload_len == 126

-payload_len == 127

获取内容:

-mask_key

数据

根据mask_key和数据进行位运算,就可以把值解析出来。
  客户端通过ws.send()发送请求、服务器接收,并且send_msg加密发送
  接收后解码指令如下例子
  在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的WebSocket加密解密可以通过使用SSL/TLS协议来实现。具体来说,可以使用Unity的`SslStream`类来对WebSocket通信进行加密解密。 在使用`SslStream`之前,需要先创建一个`TcpClient`对象来与WebSocket服务器建立连接。然后,可以使用`SslStream`的构造函数来创建一个加密的流对象。最后,可以使用`SslStream`的`Read()`和`Write()`方法来对WebSocket通信进行加密解密。 以下是一个示例代码: ```csharp using System; using System.Net.Sockets; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; using UnityEngine; public class WebSocketClient : MonoBehaviour { private TcpClient tcpClient; private SslStream sslStream; private byte[] receiveBuffer = new byte[1024]; private async Task Connect(string serverIp, int serverPort) { tcpClient = new TcpClient(); await tcpClient.ConnectAsync(serverIp, serverPort); // Create SslStream object with client certificate validation sslStream = new SslStream(tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); // Authenticate server and client with SSL/TLS connection try { await sslStream.AuthenticateAsClientAsync(serverIp); } catch (AuthenticationException e) { Debug.LogError($"SSL/TLS authentication failed: {e.Message}"); tcpClient.Close(); return; } // Start listening for incoming WebSocket messages await Receive(); } private async Task Receive() { // Read incoming data from WebSocket server int bytesReceived = await sslStream.ReadAsync(receiveBuffer, 0, receiveBuffer.Length); // Decrypt received data // Process decrypted data // Continue listening for incoming WebSocket messages await Receive(); } private void Send(string message) { // Encrypt outgoing data // Send encrypted data to WebSocket server byte[] sendBuffer = System.Text.Encoding.UTF8.GetBytes(message); sslStream.Write(sendBuffer, 0, sendBuffer.Length); } private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { // Perform certificate validation if needed return true; } } ``` 请注意,以上代码仅提供了WebSocket加密解密的基本思路,具体实现可能因应用场景而有所不同。还需要根据实际情况进行一些改进,比如对接收到的数据进行解析和处理,对发送的数据进行封装和编码等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值