C 如何防止重放攻擊

2022-02-16 03:28:03 字數 1615 閱讀 9884

重放攻擊

重放攻擊是指黑客通過抓包的方式,得到客戶端的請求資料及請求連線,重複的向伺服器傳送請求的行為。 比如你有乙個 「購買」 的操作,當你點選購買按鈕時,向伺服器傳送購買的請求。而這時黑客對你的請求進行了抓包,得到了你的傳輸資料。 因為你填寫的都是真實有效的資料,是可以購買成功的,因此他不用做任何改變,直接把你的資料再往伺服器提交一次就行了。這就導致了,你可能只想購買乙個產品的,結果黑客重放攻擊,你就購買了多次。如果是使用者操作的話,肯定就會莫名奇妙:怎麼購買了那麼多同樣的產品,我只買了乙個啊? 所以,重放攻擊的危害還是挺大的,特別是涉及到金錢交易時,因此防重放攻擊在電商專案中是必不可少的。

解決方案

時間戳(tamp) + 數字簽名(sign)。 也就是說每次傳送請求時多傳兩個引數,分別為 tamp 和 sign。比如

原先請求為

修改之後為 ?tamp=1403149835&sign=945bf36r046bd84df2985ad625c9f92415eccd1w

數字簽名的作用是為了確保請求的有效性。因為簽名是經過加密的,只有客戶端和伺服器知道加密方式及key,所以第三方模擬不了。我們通過對sign的驗證來判斷請求的有效性,如果sign驗證失敗則判定為無效的請求,反之有效。 但是數字簽名並不能阻止重放攻擊,因為黑客可以抓取你的tamp和sign(不需做任何修改),然後傳送請求。這個時候就要對時間戳進行驗證。

時間戳的作用是為了確保請求的時效性。我們將上一次請求的時間戳進行儲存,在下一次請求時,將兩次時間戳進行比對。如果此次請求的時間戳和上次的相同或小於上一次的時間戳,則判定此請求為過時請求,無效。因為正常情況下,第二次請求的時間肯定是比上一次的時間大的,不可能相等或小於。

有人會問,我直接用時間戳不就行了,為什麼還要數字簽名?因為黑客可能對請求進行抓包,然後修改時間戳為有效的時間戳值。我們的數字簽名採用 tamp+key 進行組合加密,即使黑客修改了 tamp ,但是由於黑客不知道key,所以 sign 驗證這步就成功的阻止了黑客的請求。

例項**

加密方式採用 sha1,sha1加密方法進行了封裝,寫成了string的擴充套件方法。

///

///數字簽名

//////

時間戳(由客戶端傳入)

///key///

private

string sign(string tamp, string

key)

驗證方法, 客戶端的加密方式和服務端是一樣的,如果兩者的加密結果不一致,則驗證失敗。 如果客戶端是js,一定要對js做**混淆,禁止右鍵等。因為我是用session儲存上一次請求的時間戳的,而session是會過時的,當session過時時黑客再進行攻擊,就會得手,所以限制請求有效期為30秒。

///

///檢查請求是否有效,防重放

//////

時間戳(由客戶端傳入)

///key

///驗籤(由客戶端傳入)

///private

bool checkrequest(string tamp, string key, string

sign)

else

}else

}

登入重放攻擊 SSH如何防禦重放攻擊

ssh之所以能夠保證安全,原因在於它採用了公鑰加密。整個過程是這樣的 遠端主機收到使用者的登入請求,把自己的公鑰發給使用者。使用者使用這個公鑰,將登入密碼加密後,傳送回來。遠端主機用自己的私鑰,解密登入密碼,如果密碼正確,就同意使用者登入。如果中間人在使用者第二個步驟獲取到這個請求,這個請求裡面就包...

Web安全防範 防止重放攻擊

我們在開發介面的時候通常會考慮介面的安全性,比如說我們通常會要求請求的url攜帶乙個經過演算法加密的簽名sign到服務端進行驗證,如果驗證通過,證明請求是合法的。比如以下的url 醬紫,可能語言難以理解,我畫個圖先 首先正常的請求系統會要求校驗,當你的合法請求被黑客攔截之後,黑客就會重複地傳送該合法...

防重放攻擊

以前總是通過timestamp來防止重放攻擊,但是這樣並不能保證每次請求都是一次性的。今天看到了一篇文章介紹的通過nonce number used once 來保證一次有效,感覺兩者結合一下,就能達到乙個非常好的效果了。重放攻擊是計算機世界黑客常用的攻擊方式之一,所謂重放攻擊就是攻擊者傳送乙個目的...