密钥协商客户端和服务器流程

打印 上一主题 下一主题

主题 952|帖子 952|积分 2856

非本地密钥协商客户端服务器通信(客户端)

步调

密钥协商(生成密钥的过程):对数据举行加密的是对称加密,加密的数据长度没有限制,密钥分发分发困难,对密钥分发用的是非对称加密
密钥校验:验证双发使用的密钥是不是同一个。
密钥注销:将当前密钥废弃掉。
客户端

客户端是发送哀求的一端(自动方)
客户端的实现

1、在客户端发送哀求
1)密钥协商
2)密钥校验
3)密钥注册
2、客户端必要提供和用户交互的功能(Qt)
3、客户端和服务器通信必要携带数据(封装到结构体里)
1)通信的业务数据
2)鉴别省份的数据->客户端的ID
3)和客户端通信的服务器ID
4)必要一个标记->服务器根据这个标记来判定客户端要哀求做什么事情->事先约定好
1->密钥协商
2->密钥校验
3->密钥注册
5)给对方提供校验数据,判定数据块是不是被修改了
署名->rsa
客户端结构体的封装

  1. struct RequestMsg
  2. {
  3.         int cmdType;
  4.         string clientID;
  5.         string serverID;
  6.         string sign;
  7.         string data;
  8. }
  9. // 数据分析
  10. cmdType: 发送给服务器的数据, 服务器需要对去进行判断:
  11.         - 1 -> 秘钥协商
  12.         - 2 -> 秘钥校验
  13.         - 3 -> 秘钥注销
  14. clientID: 所有有效的客户端都会被分配给一个有效的唯一的ID
  15. serverID: 客户端要连接的服务器对应的ID
  16. data: 对应的业务数据, 根据cmdType不同而不同
  17. 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)针对业务逻辑处置处罚得到的业务数据
  1. // 服务器给客户端回复的数据
  2. struct RespondMsg
  3. {
  4.         bool status;
  5.         int seckeyID;
  6.         string clientID;
  7.         string serverID;
  8.         string data;
  9. };
  10. **status: 客户端请求的处理状态
  11. data:         实际的业务数据**
  12. clientID: 秘钥协商客户端的ID
  13. serverID: 秘钥协商服务器的ID
  14. seckeyID: 只要在秘钥协商生成新秘钥的时候才有用
复制代码
服务器举行密钥协商通信流程

1、启动服务器并设置监听
服务器端port -> 端口必要从设置文件中读(原因:不确定客户使用的是哪一个端口)
2、服务器必须能接收多客户端毗连
多线程/IO多路转接
3、乐成和客户端创建毗连->等待接收客户端发送的哀求数据
4、收到客户端哀求数据->剖析
序列化之后的数据
把数据反序列化->结构体
5、根据cmdType判定客户端必要干什么
  1. switch(cmdType)
  2. {
  3.         case 1:
  4.             秘钥协商();
  5.             break;
  6.         case 2:
  7.             秘钥校验();
  8.             break;
  9.         case 3:
  10.             秘钥注销();
  11.             break;
  12.         default:
  13.             break;
  14. }
复制代码
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是通过读设置文件获取的
  1. {
  2.   "ServerID": "luffy",
  3.   "ClientID": "robin"
  4. }
复制代码
假如用数组的话要明白告诉用户第一个是SeverID还是ClientID
包罗json文件目录




protobuf生成封装好的类

  1. syntax="proto3";
  2. message RequestMsg
  3. {
  4.         int32 cmdType=1;
  5.         bytes clientID=2;
  6.         bytes serverID=3;
  7.         bytes sign=4;
  8.         bytes data=5;
  9. }
  10. message RespondMsg
  11. {
  12.         bool status=1;
  13.         int32 seckeyID=2;
  14.         bytes clientID=3;
  15.         bytes serverID=4;
  16.         bytes data=5;
  17. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表