非本地密钥协商客户端服务器通信(客户端)
步调
密钥协商(生成密钥的过程):对数据举行加密的是对称加密,加密的数据长度没有限制,密钥分发分发困难,对密钥分发用的是非对称加密。
密钥校验:验证双发使用的密钥是不是同一个。
密钥注销:将当前密钥废弃掉。
客户端
客户端是发送哀求的一端(自动方)
客户端的实现
1、在客户端发送哀求
1)密钥协商
2)密钥校验
3)密钥注册
2、客户端必要提供和用户交互的功能(Qt)
3、客户端和服务器通信必要携带数据(封装到结构体里)
1)通信的业务数据
2)鉴别省份的数据->客户端的ID
3)和客户端通信的服务器ID
4)必要一个标记->服务器根据这个标记来判定客户端要哀求做什么事情->事先约定好
1->密钥协商
2->密钥校验
3->密钥注册
5)给对方提供校验数据,判定数据块是不是被修改了
署名->rsa
客户端结构体的封装
- struct RequestMsg
- {
- int cmdType;
- string clientID;
- string serverID;
- string sign;
- string data;
- }
- // 数据分析
- cmdType: 发送给服务器的数据, 服务器需要对去进行判断:
- - 1 -> 秘钥协商
- - 2 -> 秘钥校验
- - 3 -> 秘钥注销
- clientID: 所有有效的客户端都会被分配给一个有效的唯一的ID
- serverID: 客户端要连接的服务器对应的ID
- data: 对应的业务数据, 根据cmdType不同而不同
- sign: 签名, 对数据(data)签名**私钥签名**
复制代码 密钥协商客户端通信流程
1、提供一个可以或许和用户交互的界面(Qt)
2、用户选择的秘钥协商
3、构造数据, 初始化struct RequestMsg
1)cmdType=1
2)clientID=读设置文件(把客户端ID写入到设置文件内里,只必要维护一份)
3)serverID=读设置文件
4)data=非对称加密的公钥
5)sign=data的署名
4、对数据struct RequestMsg举行序列化->生成字符串
protobuf对应的类
5、数据发送服务器
套接字通信的类->TcpSocket
1)创建一个通信对象
2)毗连服务器
服务器IP和端口—>来自于设置文件
3)给服务器发送序列化后的数据
4)接收数据(默认是壅闭的)->等待服务器回复数据(回复的是对称加密的密钥->使用公钥加密的密文)
5)接收到服务器回复的数据(数据是序列化的)->反序列化->数据还原
使用封装的序列化的类举行操作
6)得到原始数据
将对称加密的密钥剖析->公钥加密的数据
通过私钥解密->原始的对称加密的密钥
非本地密钥协商客户端服务器通信(客户端)
秘钥协商服务器需求分析
被动接受客户端哀求, 不必要和用户举行交互
可以是以保卫进程
接收客户端哀求, 处置处罚 -> 给客户端回复数据
1)哀求的处置处罚状态
2)针对业务逻辑处置处罚得到的业务数据
- // 服务器给客户端回复的数据
- struct RespondMsg
- {
- bool status;
- int seckeyID;
- string clientID;
- string serverID;
- string data;
- };
- **status: 客户端请求的处理状态
- data: 实际的业务数据**
- clientID: 秘钥协商客户端的ID
- serverID: 秘钥协商服务器的ID
- seckeyID: 只要在秘钥协商生成新秘钥的时候才有用
复制代码 服务器举行密钥协商通信流程
1、启动服务器并设置监听
服务器端port -> 端口必要从设置文件中读(原因:不确定客户使用的是哪一个端口)
2、服务器必须能接收多客户端毗连
多线程/IO多路转接
3、乐成和客户端创建毗连->等待接收客户端发送的哀求数据
4、收到客户端哀求数据->剖析
序列化之后的数据
把数据反序列化->结构体
5、根据cmdType判定客户端必要干什么
- switch(cmdType)
- {
- case 1:
- 秘钥协商();
- break;
- case 2:
- 秘钥校验();
- break;
- case 3:
- 秘钥注销();
- break;
- default:
- break;
- }
复制代码 6、用户哀求的是密钥协商
验证客户端的身份
clientID,serverID验证是不是有效ID
sign校验署名
真正的密钥协商
1)生成一个随机的字符串->对称加密的密钥
2)使用得到的公钥举行加密->得到密文
3)初始化回复的数据struct RespondMsg
status = true/false
data = 密文
clientID, serverID = 通过服务器端数据举行初始化
seckeyID = 生成新秘钥的时候才必要初始化这个变量
4)序列化要发送的数据struct RespondMsg -> 字符串
5)通过网络通信举行发送 -> 客户端
程序
json文件存放serverID和ClientID
serverID和ClientID是通过读设置文件获取的
- {
- "ServerID": "luffy",
- "ClientID": "robin"
- }
复制代码 假如用数组的话要明白告诉用户第一个是SeverID还是ClientID
包罗json文件目录
protobuf生成封装好的类
- syntax="proto3";
- message RequestMsg
- {
- int32 cmdType=1;
- bytes clientID=2;
- bytes serverID=3;
- bytes sign=4;
- bytes data=5;
- }
- message RespondMsg
- {
- bool status=1;
- int32 seckeyID=2;
- bytes clientID=3;
- bytes serverID=4;
- bytes data=5;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |