需求概述
客戶端信道早在1.1版本中便實現了服務器防重放攻擊功能,但始終沒有實現客戶端防重放攻擊。這樣會使得客戶端存在被重放攻擊的危險,如用戶在轉賬時被重放了轉賬失敗頁面,導致用戶重複轉賬。 爲此,我們需要在客戶端信道中實現客戶端防重放功能。
功能需求
我們需要實現以下需求:
- 在服務器響應中增加序列號,實現客戶端防重放功能
- 兼容之前版本的信道通信,以便在升級服務器後,可以兼容舊客戶端。
設計
爲兼容舊版本信道協議,我們需要新增1.5版本協議來實現客戶端防重放功能。1.5信道協議在1.4協議基礎上進行升級。
防重放邏輯
- 在服務器響應報文的前面增加組別和防重放序列號。
- 格式與請求序列號格式相同,即組別(1位byte) + 序列號(8位byte) + 響應內容。
- 由於從1.4版本後摘要值添加在響應內容前,因此1.5版本需要將摘要值添加在序列號之前,即摘要 + 組別 + 序列號 + 響應內容。
- 客戶端收到響應後先解析組別和序列號,並與本地同組別的請求序列號進行比較,驗證序列號合法性。如果請求序列號與響應序列號相同則視爲合法,合法再處理校驗摘要值及響應內容,如果非法則提示網絡錯誤。其中網絡錯誤提示信息可配置。
- 會話超時時,服務器統一返回20位byte(全是0)數據,不分國密非國密。
序列號生成邏輯
- 響應序列號生成的規則爲:與本次客戶端請求序列號相同。
- 由於服務器本地可以獲取到當前請求對應的請求序列號,因此響應序列號只需使用該值即可。
響應hamc校驗摘要值計算
- 由於序列號作爲響應內容的一部分,因此摘要需要以加入序列號之後的響應內容來計算。即摘要值 = 對(組別 + 序列號 + 響應內容)做hamc加密。
- 國密加密模式下摘要值爲32位byte,非國密模式下摘要值爲20位byte。
HTTP防重放邏輯
修改接口ewp_ssl:ssl_sign/2處理邏輯:
- 修改摘要值的計算方法
- 響應報文修改爲:摘要 + 組別 + 序列號 + 響應內容
TCP防重放邏輯
修改接口ewp_ssl:ssl_sign/2處理邏輯:
- 修改摘要值的計算方法
- 響應報文修改爲:{tcp, 摘要, 組別 + 序列號, 響應內容}
- 根據TCP設計文檔 4.1.2 TCP接口,服務器響應格式的ResponseMessages,追加Type類型3,表示 組別(1位byte) + 序列號(8位byte),格式爲:Type(1 byte) + Length(4 bytes) + Content(Length bytes)。如:<