zoukankan      html  css  js  c++  java
  • 安全传输平台项目扩展——项目延展

    在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主: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,转载请注明出处。

  • 相关阅读:
    Silverlight Tips(2)
    Sl4程序部署至IIS7
    Silverlight Tips(1)
    Silverlight中使用MVVM(5):Command II
    Linq操作之Except,Distinct,Left Join
    Ubuntu搭建Django+Flup+Nginx环境
    ASP.NET 4.0 与 Entity Framework 4第四篇Entity Framework在三层架构中的使用
    玩转博客园的5个小技巧
    Linux下安装Django1.2和MysqlPython
    Linux下如何给Subversion和Mercurial设置HTTP代理
  • 原文地址:https://www.cnblogs.com/Alliswell-WP/p/CPlusPlus_SecureTransmissionPlatform_Project14.html
Copyright © 2011-2022 走看看