最近按客戶的需求,需要在實現伺服器防重放的前提下實現客戶端的防重放機制,解決當惡意截獲伺服器返回資料,重複提交給客戶端來反覆重走交易流程,造成不安全的隱患。
現階段我所知道的防重放有以下幾種實現方式:
1. 時間戳
2. 序號
3. 挑戰方式,及提問和應答
我採用了比較容易,而且容錯性高的序列號方式來實現雙向的防重放。具體的實現邏輯如下:
1、實現1個單例的會話管理類 sessionmanager,儲存乙個組號和序列號,組號一般在多個會話中使用,用來記錄當前會話編號,序列號記錄當前組號下傳送請求的編號。初始值都為0。
2、每當客戶端向伺服器傳送請求時,客戶端需要從單例中取出當前的組號、序列號,拼接在請求之前,傳送給伺服器,儲存請求時的組號序列號,並且sessionmanager組號的序列號+1;
3、伺服器接收到請求,解析報文,獲取組號和序列號,並且儲存到本地,當接收到下次來的客戶端請求時,伺服器把請求中的組號序列號解析出來和本地儲存的做比較,如果小於或者等於儲存的序列號,那麼此次的客戶端請求可能為重放攻擊。大於則為正常請求。
4、伺服器每次接受到請求時,只會處理非重放攻擊的請求,並且把客戶端請求中的組號序列號拼接到響應中,一起返回給客戶端。
5、客戶端再接收到伺服器響應後,解析報文,獲取組號序列號,和請求時拼接的組號序列號對比,如果不相同,則視為重放攻擊,相同時為正常響應。
Redis客戶端和伺服器
一 redis客戶端 redisserver結構中儲存了所有客戶端的狀態資訊。struct redisserver 命令client list可以列出目前所有連線到伺服器的客戶端。命令client setname name 可以給客戶端設定乙個名字。偽客戶端 由於伺服器必須接收來自客戶端的命令以執行...
Redis 客戶端和伺服器
客戶端的資料結構 typedef struct redisclient redisclient 名字 name 標誌值 flags 指向客戶端正在使用的資料庫的指標,以及該資料庫的號碼 當前要執行的命令 命令的引數 命令的個數,以及指向命令實現函式的指標 輸入緩衝區 querybuf 輸出緩衝區 複...
QT UDP客戶端和伺服器實現步驟
一般在udp通訊中,不存在嚴格意義上的伺服器端 客戶端,因為不需要建立連線,可以理解為接收端和傳送端。傳送端向指定埠傳送資料,接收端從指定埠讀取資料,反之亦然。為了實現傳送端與接收端的雙向通訊,在每一端需要定義兩個埠 傳送資料埠 接收資料埠,具體組成如下所示 上圖可以看出,傳送端將資料傳送到指定的傳...