Service认证连接

来源:互联网 发布:webpack windows 编辑:程序博客网 时间:2024/06/06 19:27

最近正在学习protobuf相关知识,于是就结合实际项目来实践一下。

首先,来简单了解一下protobuf:

protobuf是google的一个开源项目,可用于以下两种用途:

(1)数据的存储(序列化和反序列化),类似于xml、json等;

(2)制作网络通信协议。


下面我们来定义remote6认证模块的protobuf协议:

//认证请求4000
message Auth
{
optional string authInfo = 1; //认证信息
}

message MessageContent 
{
//上下文
optional string context = 1;

//协议号
optional uint32 type    = 2;

//具体协议内容
optional bytes content  = 3;
}

message ProtocolPack
{
//终端id
repeated string endID              = 1;

//中间业务服务器处理类型
optional ProcessType processType   = 2;

//消息类型
optional ProtocolType protocolType = 3;

//消息内容
optional MessageContent message    = 4;

//全链路监控中的日志id
optional string traceId    = 5;

}

 定义好协议以后,就可以通过protogen.exe将我们的文件转换成对应的C#代码了,protogen.exe可自行去网上下载。

ProtoGen是用来根据***.proto文件生成对应的***.cs文件的,而做数据存储功能只需要用到protobuf-net.dll即可

生成C#代码的命令:protogen.exe -i:test.proto -o:test.cs


将.proto文件生成.cs文件后,下面就开始我们的认证过程:

1、认证过程:

认证材料:6位随机数,物理mac,sn号,encrypt加密


生成六位随机数:



MD5加密:


AESEncrypt--加密后返回十六进制:


封装第一层数据包并序列化(Auth):


封装第二层数据包(MessageContent):


生成32位uuid(e10a9775-fd14-4704-a2ad-c07096a2a911):


认证消息类型:type=4000

封装最后一层数据包并序列化加密(ProtolPack):


注意,这里的ProtocolPack加密后需要返回byte数组,与上面的AuthInfo加密后返回16进制数据不同,并且两个加密key和iv也不同。


Auth和ProtocolPack的加密密钥分别为:


最后填充自定义包:

首先我们来看一下remote6通信协议:




下面通过wireshark抓包来看一下消息协议的组成:


我们可以很清楚的看到,消息组成结构为:0xAB+4字节的消息长度+2字节保留字+protobuf消息内容+0xBA

下面我们来组装数据包:


最后再将组装的数据包socket发送出去。

服务器收到认证请求后,会返回认证结果,我们再对认证结果进行反序列处理即可。

原创粉丝点击