天天看點

安全傳輸平台項目擴充——項目延展

在學習安全傳輸平台項目總結了筆記,并分享出來。有問題請及時聯系部落客:​​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唯一識别)

安全傳輸平台項目擴充——項目延展