說(shuō)說(shuō)API的防重放機(jī)制

我們?cè)谠O(shè)計(jì)接口的時(shí)候,最怕一個(gè)接口被用戶截取用于重放攻擊。重放攻擊是什么呢?就是把你的請(qǐng)求原封不動(dòng)地再發(fā)送一次,兩次...n次,一般正常的請(qǐng)求都會(huì)通過(guò)驗(yàn)證進(jìn)入到正常邏輯中,如果這個(gè)正常邏輯是插入數(shù)據(jù)庫(kù)操作,那么一旦插入數(shù)據(jù)庫(kù)的語(yǔ)句寫(xiě)的不好,就有可能出現(xiàn)多條重復(fù)的數(shù)據(jù)。一旦是比較慢的查詢操作,就可能導(dǎo)致數(shù)據(jù)庫(kù)堵住等情況。

這里就有一種防重放的機(jī)制來(lái)做請(qǐng)求驗(yàn)證。

timestamp+nonce

我們常用的防止重放的機(jī)制是使用timestamp和nonce來(lái)做的重放機(jī)制。

timestamp用來(lái)表示請(qǐng)求的當(dāng)前時(shí)間戳,這個(gè)時(shí)間戳當(dāng)然要和服務(wù)器時(shí)間戳進(jìn)行校正過(guò)的。我們預(yù)期正常請(qǐng)求帶的timestamp參數(shù)會(huì)是不同的(預(yù)期是正常的人每秒至多只會(huì)做一個(gè)操作)。每個(gè)請(qǐng)求帶的時(shí)間戳不能和當(dāng)前時(shí)間超過(guò)一定規(guī)定的時(shí)間。比如60s。這樣,這個(gè)請(qǐng)求即使被截取了,你也只能在60s內(nèi)進(jìn)行重放攻擊。過(guò)期失效。

但是這樣也是不夠的,還有給攻擊者60s的時(shí)間。所以我們就需要使用一個(gè)nonce,隨機(jī)數(shù)。

nonce是由客戶端根據(jù)足夠隨機(jī)的情況生成的,比如 md5(timestamp+rand(0, 1000)); 它就有一個(gè)要求,正常情況下,在短時(shí)間內(nèi)(比如60s)連續(xù)生成兩個(gè)相同nonce的情況幾乎為0。

網(wǎng)友評(píng)論