鍍金池/ 問答/Java  Linux/ 關于加簽名防攻擊的疑問

關于加簽名防攻擊的疑問

在網(wǎng)上看到一個方案是:“客戶端將參數(shù)排序進行MD5加密后,得到sign。 服務端再次將你的參數(shù)排序進行MD5加密,比較兩次得到的值,相同校驗成功。為了防止抓包,然后不停發(fā)送攻擊的包“

這樣做 咋就能防止攻擊了呢?
攻擊者也可以進行 把參數(shù)MD5加密后發(fā)給服務器啊。

回答
編輯回答
不討囍

其實我倒是關注 將參數(shù)排序 這個不排序 有什么影響嗎?如果直接把提交的數(shù)據(jù)拿來用不是更方便,畢竟安全體現(xiàn)再 appkey 上了啊

2017年5月9日 23:40
編輯回答
久不遇

如果只做md5,一般要在md5時候,加一個appkey之類的東東,或者說salt,這個東東是不通過參數(shù)傳遞的(前后端都知道值),這樣就防止別人篡改和構造請求了。

如果同時做md5和加密,也可以,密鑰不傳就可以了。

2018年5月31日 03:54
編輯回答
愛是癌

補充一下樓上的答案,重點說說重放攻擊問題。

有可能請求被其他人抓包,拿來重復請求。
那么設計思路是下面這樣的:

首先,所有方案在加密的時候都應該有一個約定的秘鑰。保證攻擊者不能自己算出sign

方案A:驗證md5是否被請求過

這樣每次請求都有一個唯一的md5,服務端在第一次完成請求后,把md5寫入緩存。
下次處理請求之前先判斷一下有沒有這個md5,如果有就代表是重復請求。

但有沒有想到這里有個缺點:
每一個請求都要寫一個md5進緩存,請求量比較大的話非常占緩存

方案B:給參數(shù)里加個時間戳

如果時間差在60s以上,代表這個請求是被別人抓取到了,拿來做重復請求攻擊。

這種方案也有缺點:
客戶端和服務端的時間一致性要求比較高。

終極方案:兩個結合一下。

時間戳+md5
1、時間差120s以上代表重復請求
2、md5寫緩存,緩存時長120s(大于等于上面的值就行),判斷如果有md5代表重復請求

這樣相對比較好的解決了重復請求問題。

2018年1月10日 19:58