Socket安全

来源:互联网 发布:js new对象删除 编辑:程序博客网 时间:2024/06/05 22:44
Socket安全
之前我们用的Socket是包的长度加包体内容
 
    /// <summary>
    /// 封装数据包
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    private byte[] MakeData(byte[] data)
    {
        byte[] retBuffer = null;
        using (MMO_MemoryStream ms = new MMO_MemoryStream())
        {
            ms.WriteUShort((ushort)data.Length);
            ms.Write(data, 0, data.Length);
            retBuffer = ms.ToArray();
        }
        return retBuffer;
    }
然后,我们对数据进行安全加密,这里就需要我们从新处理一下我们这个数据包了,因为传输的数据要具有一定的安全性,所以就要对其内容多加一下处理,
1还是要标明咱们的包的总长度
2这里我们做一个压缩的处理,游戏数据太大我们就需要进行压缩处理
3CRC16效验,这是用来判断我们收到的数据是否具有完整性,还有是否被修改过
4然后在用Xor异或对内容再次进行加密
5异或之后的数据就是咱们真正需要的数据
 
具体代码如下
这里是封装数据包
 private byte[] MakeData(byte[] data)
    {
        byte[] retBuffer = null;
        //1,如果数据包的长度大于m_CompressLen   则进行压缩
        bool isCompress = data.Length > m_CompressLen ? true : false;
        if (isCompress)
        {
            byte[] compressBuffer = ZlibHelper.CompressBytes(data);
        }
        //2先异或
        data = SecurityUtil.Xor(data);
        //3Crc效验
        ushort crc = Crc16.CalculateCrc16(data);

        using (MMO_MemoryStream ms = new MMO_MemoryStream())
        {
            ms.WriteUShort((ushort)(data.Length + 3));
            ms.WriteBool(isCompress);
            ms.WriteUShort(crc);
            ms.Write(data, 0, data.Length);
            retBuffer = ms.ToArray();
        }
        return retBuffer;
    }



然后咱们需要把这些数据进行解析
 using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))
                        {
                         //判断是否压缩
                            isCompress = ms.ReadBool();
                          //crc
                            crc = ms.ReadUShort();
                            ms.Read(bufferNew, 0, bufferNew.Length);
                        }
                        int newCrc = Crc16.CalculateCrc16(bufferNew);
                        if (newCrc == crc)
                        {
                            //异或  得到原始数据
                            bufferNew=SecurityUtil.Xor(buffer);
                            if (isCompress)
                            {
                                bufferNew =ZlibHelper.DeCompressBytes(bufferNew);
                            }
                            ushort protoCode = 0;
                            byte[] protoContent = null;
                            using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))
                            {
                                //协议编号
                                 protoCode = ms.ReadUShort();
                                 ms.Read(protoContent, 0, protoContent.Length);
                                 EventDispatcher.Instance.Dispatch(protoCode, protoContent);
                            }
                        }
                        else
                        {
                            break;
                        }


以上是客户端的代码,服务端的代码和客户端的是一样的,这里我就不写了
原创粉丝点击