回覆列表
-
1 # 9點10分
-
2 # 科技Pioneer
感謝應邀回到本行業的問題。
在回答這個問題之前我感覺我們因該先了解一個HTTPS。
HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。
工作流程為:
第一步:客戶使用https的URL訪問Web伺服器,要求與Web伺服器建立SSL連線。
第二步:Web伺服器收到客戶端請求後,會將網站的證書資訊(證書中包含公鑰)傳送一份給客戶端。
第三步:客戶端的瀏覽器與Web伺服器開始協商SSL連線的安全等級,也就是資訊加密的等級。
第四步:客戶端的瀏覽器根據雙方同意的安全等級,建立會話金鑰,然後利用網站的公鑰將會話金鑰加密,並傳送給網站。
第五步:Web伺服器利用自己的私鑰解密出會話金鑰。
第六步:Web伺服器利用會話金鑰加密與客戶端之間的通訊。
從其工作流程中,我們看出每個連線都會驗證證書,交換金鑰。別人就算截獲你的資料包,重新發送一遍,因為socket不一樣,金鑰也不一樣,後臺解密後應該是一對亂碼才對。所以https本身就是防止重放攻擊的。
客戶端拼接字串規則如下:
介面+引數+時間戳+secretID(如果不是做對外開放性的API,是內部產品呼叫的話那麼secretID可以是寫死的一個ID值)
將以上字串用對稱加密,作為一個sign引數,請求服務端。
比如介面,login,引數有 name、password、加密後的sign
服務端接收到請求後,用對稱解密sign,得到secretID,核對值是否正確,那麼說明請求方是可信任的。返回介面結果,並把sign記錄到redis。
下次接收到同樣請求時發現redis已經有對應的sign值說明是介面重放,不予以正常相應。因為正常使用者呼叫介面時間戳應該是改變的不可能產生同樣的sign值。
如果發現sign解釋出來的secretID是系統不存在的,那麼說明請求方在偽造請求。不予以正常相應。