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