安全传输平台项目扩展——项目延展
在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
11-安全传输平台项目扩展-第03天(项目延展-项目演说)
目录:
一、复习
二、安全传输平台项目扩展——项目延展
一、复习
》4大基础组件:
1)统一报文编码解码 libmessagereal.so .h ---> .dll .lib .h
2)统一通信组件socket --- windows socket 通信
3)共享内存 --- windows shm 机制
4)数据库访问 (客户端无需数据库)
》物理组件集成:
统一报文编解码组件:
messagereal.lib 、messagereal.dll 、 keymng_msg.h
集成动态库到项目中。 属性 → 配置属性 → 连接器 → 输入 → 附加依赖项 → 编辑 → messagereal.lib
messagereal.dll 放置到 .exe 所在目录位置。
messagereal.lib 放置到 .cpp 所在目录位置。
共享内存组件:
myipc_shm.cpp 、myipc_shm.h
集成源码到项目中。 属性 → 配置属性 → C/C++ → 常规 → SDL检查 → “否(/sdl-)”
Socket通信组件:
poolsocket.cpp 、poolsocket.h 、 socketlog.cpp 、 socketlog.h 、 socketutil.cpp 、 socketutil.h
集成源码到项目中。
-----将 Linux 业务代码移植到win下:-------------------------------------------------------------------------
添加与客户端相关的源码:
keymng_shmop.c → keymng_shmop.cpp
keymngclient.c 是在Linux 下组织文字界面的,不需要。
keymngclientop.c → keymngclientop.cpp
keymnglog.c → keymnglog.cpp
keymng_shmop.h
keymngclientop.h
keymnglog.h
去除 cpp文件 #include 中 Linux 专用 头文件。
添加 #define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
修改 源码对接平台差异错误:
open(fileName, O_WRONLY|O_CREAT|O_APPEND, 066) → (int) fopen(fileName,"w+")
pNode = mapaddr + i*sizeof(NodeSHMInfo); → pNode = (NodeSHMInfo *)mapaddr + i*sizeof(NodeSHMInfo);
ICLevelName → ICKeyMngLogName;
----- 整合图形客户端业务:-----------------------------------------------------------------------------------
实现“系统初始化”Button 功能 : ( initUpdate() )
引入头文件:keymngclientop.h → ViewClient.cpp
定义全局变量:MngClient_Info pCltInfo; → ViewClient.cpp ---- 只读。
调用:MngClient_InitInfo(&mngClientInfo); 初始化。 AfxMessage().显示错误信息。
【注意】:修改 MngClient_InitInfo 中,服务器IP地址。
实现“密钥协商”Button 功能:
调用:MngClient_Agree(&mngClientInfo); 协商密钥。AfxMessage().显示错误信息。
【注意】:内存释放 MFC 中验证严格, ===== 把握:谁开辟,谁释放 原则。
msgKey_Req_Data:是在报文编码过程中 使用 MsgEncode() 函数创建的内存。
应使用 MsgMemFree() 释放。 如:
MsgMemFree((void **)&msgKey_Req_Data, 0);
msgKey_Res_Data:是在数据通信过程中 使用 sckClient_rev() 函数创建的内存。
应使用 sck_FreeMem() 释放。 如:
sck_FreeMem((void **)&msgKey_Res_Data);
实现“密钥校验”Button 功能:
调用:MngClient_Check(&mngClientInfo); 协商密钥。AfxMessage().显示错误信息。
实现“密钥注销”Button功能:
调用:MngClient_Revoke(&mngClientInfo); 协商密钥。AfxMessage().显示错误信息。
》内存释放:
原则:谁开辟,谁释放。
创建库时,如有函数开辟了内存,必须提供对应的内存释放函数给用户。
int poolget(int **cache(传出)); int free(int *cache(传入));
------外联接口设计思想:----------------------------------------------------------------------------------------
.so / .dll 和 .h
项目中外联接口主要有两个作用: 1. 读共享内存。 2. 加解密数据。
函数接口:
int DataEnc(char *clientid, char *serverid, unsigned char *indata, int indatalen, unsigned char *oudata, int *outdatalen);
int DataDec(char *clientid, char * serverid, unsigned char *indata, int indatalen, unsigned char *outdata, int *outdatalen);
int tag = 0 / 1; 加密, 解密。
int DataEncAndDec(char *clientid, char *serverid, unsigned char *indata, int indatalen, unsigned char *outdata, int outdatalen);
操作共享内存时, 需要使用到keyid。它可以以两种方式传入到函数接口中:
1)直接作为函数接口,传递到函数中。
int DataEncAndDec(char *clientid, char *serverid, unsigned char *indata, int indatalen,
unsigned char *outdata, int outdatalen, int keyid, int maxnode);
2)接口读配置文件获取。
配置文件应存放在: $(HOME)/etc/1.ini e.g. KEYID=1111 、 MAXNODE=10
这样,直接调接口效率会比较低。所以应封装初始化函数和结束函数给用户。
int DataEncAndDec_init(char *filename); //读配置文件,获取数据存入全局变量中。
int DataEncAndDec(char *clientid, char *serverid, unsigned char *indata, int indatalen,
unsigned char *outdata, int outdatalen);
int DataEncAndDec_finish();
项目开发中,不同的用户需求,选用不同的接口封装方式,效率几近相同。没有孰优孰劣之分。
=======对称加密: 加密秘钥和解密密钥一致。===================================
加密三要素:
y = ax + b 明文、密文, 密钥, 算法。
常见对称加密体系:
AES DES 3DES SM3/n
分组加密原理:
采用分组加密的方式:对 不满足 8 字节部分,打padding。 但,从补丁明文恢复到原始明文时,有问题。无法区分原始明文和补丁明文。
缺几补几。
补丁长度 = 分组数据长度 - 数据长度 % 8 (缺8补8) 0-7 打补丁
只对一整块数据,只做一次 padding 操作, 缺几补几。
大数据要分块传输、存储。无论多大的数据,只对最后一个分组进行 padding 操作。在中间不能进行该操作。
一般加密供应商给用户应提供两个API函数: 一个打padding的函数、一个不打padding的API函数。
大多数用户不了解加密过程,通常对其隐藏实现细节。只提供加密、解密接口。
-------加密大文件加解密案例:-----------------------------------------------------------------------
cryptproj-文件加密项目
-------外联接口的使用:--------------------------------------------------------------------------------
appinterface/
=======非对称加密:===============================================
特征:加密密钥 和 解密密钥,不一样。 密钥对( 公钥、私钥 )。
银行开户:
1)提交身份证
2)柜员 审核 ---> 人为管理
(1)调用银行内部密钥生成系统,得到密钥对(公钥、私钥)。
(2)将私钥灌入 KEY 中。(网银key、U盾)
(3)将 公钥 + 个人身份信息 ---> 数字证书。 (包含“公钥”和“个人身份信息”两部分内容)
数字证书:
简单理解成“网络身份证”。解决了虚拟世界(网络世界)中,两端之间身份识别问题。
示例:
360 → 菜单 → “选项” → “高级设置” → “管理证书”
MicroSoft edge → 菜单 → “使用 Internet Explorer 打开” → “工具” → “Internet 选项” → “内容”标签页 → “证书”
可导出证书,选择.BER格式 或者 base64编码格式 (将DER编码后得到的可见字符格式)。
查看证书:
详细信息中,包含公钥和使用者相关身份信息。
公钥的作用:
1)验证身份 B → 验证 → A
(1)A 产生随机数 r1, 用私钥加密 r1 → r1S (签名)
(2)A 将 r1和r1S 给 B。 则B有了明文:r1 和 密文:r1S
(3)B 从公共网点上下载 A 的证书。 若 B 无法下载,A也可以将自己的证书一起给B。
(4)B 用 A的证书中的“公钥”,解密 密文:r1S → r2 。 校验 r1 和 r2 是否相等。 (验证签名)
(5)若相等,则能确定,数据加密动作,是 A 完成的。
签名,类似公司加盖公章。具有法律效力(电子签名法)。
2)数据加密: C 、 D
(1)C 用 D 的公钥加密,将加密数据给D
(2)D 用自己的私钥解密。
项目 模块 简析:
1)基础组件 模块 (报文编解码、通信组件、共享内存、数据库操作组件)
2)密钥相关 模块 (server、client、 shm、 DB)
3)管理终端 模块 (MFC图形界面、win 数据库、配置文件)
4)外联接口 模块 (数据加解密、封装)
二、安全传输平台项目扩展——项目延展
》项目框架图:
------项目的思考:------------------------------------------------------------------------------------
1)更换密钥 如何保证外联应用业务的 连续性?
冗余密钥
2)安全传输平台解决的最主要的问题?
(1)密钥的问题 解决对称密钥体系中 密钥的安全分发
(2)数据加密的问题 对主流密码设备的群调度 调度平台
(3)网点 信息系统管理
3)如何保证对称密钥协商过程中的安全性?
具体一点:如何保证r1 r2 两个随机数的安全性?
采用非对称密钥体系 来保证对称密钥r1 r2的产生
RSA ECC DES3
(1)给A B两个结点产生A(公私密钥对) B(公私密钥对)
(2) A _ B之间 双向身份认证
(3)r1 r2 A要给B发送r1 要保证r1数据的安全?
A 产生r1
A 用 B 的公钥加密r1 扔给B
B 用自己的私钥解密,得到 r1
同样的道理 r2 也可以按照这个方法 保证r2的安全传输
4)如果服务器是一个集群
A A1 -- A6
B
如何保证 A的密钥和 A1-A6的密钥一致?
(1)实时密钥同步。 协商后A分发, A1-A6 上部署密钥同步服务器的接收端。
(2)A1-A6 主动从A上下载密钥。 或定时下载。
5)结点和结点上下级联?
在终端上,同时部署 keymngserver 和 keymngclient(通过IP+port唯一识别)
在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
posted on 2020-08-05 21:36 Alliswell_WP 阅读(344) 评论(0) 编辑 收藏 举报