Java請求中關於如何避免防重放攻擊

重放攻擊介紹
(入侵者從網絡上截取主機A發送給主機B的報文,並把由A加密的報文發送給B,使主機B誤以爲入侵者就是主機A,然後主機B向僞裝成A的入侵者發送應當發送給A的報文。–介紹引用網址https://www.jianshu.com/p/7887f16581c0
防禦手段
防止重放攻擊的方法是使用不重數

  1. 加隨機數
    該方法優點是認證雙方不需要時間同步,雙方記住使用過的隨機數,如發現報文中有以前使用過的隨機數,就認爲是重放攻擊。缺點是需要額外保存使用過的隨機數,若記錄的時間段較長,則保存和查詢的開銷較大。
  2. 加時間戳
    該方法優點是不用額外保存其他信息。缺點是認證雙方需要準確的時間同步,同步越好,受攻擊的可能性就越小。但當系統很龐大,跨越的區域較廣時,要做到精確的時間同步並不是很容易。)

最近幾天我在做一個關於客戶端請求服務端安全問題,主要是針對被別人惡意攻擊----有效避免防重放攻擊。

我的做法是:
方法: 時間戳校驗 + mac簽名校驗 雙重驗證
具體是:
在項目裏面,當客戶端請求我服務器的時候,會給我傳遞一些公共參數,比如客戶端請求的時間戳,以及加密後的mac簽名。
第一步: 我在攔截器裏面拿到請求時間戳之後,轉換爲毫秒值,這時候我服務器端也會生成一個當前時間毫秒值,做差值比較
if((當前時間-請求時間)>60000 );//60秒
那就認爲請求報文已經被攔截,正在攻擊,此請求有異常,結束請求。
如果是<6秒 ,暫時認爲是符合的(有疑問往下看),讓請求繼續往下走。

比較時間差值:

		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		Date parse = simpleDateFormat.parse("20190625093842");
		long req_time = parse.getTime();
		Date date = new Date();
		long now_time = date.getTime();
		System.out.println((now_time-req_time)>60000);

第二步
在步驟一的基礎上, 已經判斷了時間差值, 不安全,因爲一秒鐘就可能被請求很多次,所以還需要進行mac驗證。
這時候我藉助了cache緩存器 (CacheManager類) , 思路是:
把客戶端請求時間戳作爲key,mac簽名作爲value,保存到cache裏面,這時候共傳遞了三個參數,key, value ,緩存名字 到cache裏面。
在這裏插入圖片描述在這裏插入圖片描述
此時已經保存,然後下次客戶客戶端請求,先根據時間戳和緩存名去cache裏面取值,如果能拿到mac簽名並且不爲空,這時候就可以斷定正在被重放攻擊,攔截下來。如果根據時間戳拿不到mac,說明正常請求,然後把正常請求的時間戳,mac 保存到cache裏面就行了。
在這裏插入圖片描述
timeToLiveSeconds=“60”: 緩存裏60秒後會失效,這樣就不會一直累加到緩存裏面(當然有redis也可以藉助redis). 大概就是這麼個步驟。

       											do-time:2019/6/25  
       											筆者:dk
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章