天天看点

安全传输平台项目扩展——项目延展

在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。

10-安全传输平台项目扩展-第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唯一识别)

安全传输平台项目扩展——项目延展