防重放
重放攻擊就是攔截app的HTTP請求包崖面,然后多次攻擊后臺服務器元咙。
解決方案:
1.利用隨機數和時間戳
客戶端每次請求生成一個隨機數,請求的時候帶上傳入后臺巫员,后臺如果是第一次接收到蛾坯,就將隨機數存入redis,有效期為60秒疏遏。當再次收到這個請求的時候,會判斷本次隨機數在redis里面是否存在救军,如果存在說明是重放攻擊财异,如果不存在繼續(xù)將新的隨機數存入redis。
有人這個時候會問唱遭,如果抓到一個報文戳寸,等60秒之后是不是就可以重放成功了?答案是yes。如果只采用上述方式拷泽,會有這種情況疫鹊。當然你也可以將隨機數的有效期放到足夠大,但是這樣會有隨機數存儲越來越多司致,查詢時間越來越長的情況拆吆。
解決上面的問題,可以利用時間戳脂矫。就是每次請求除了帶上隨機數枣耀,還帶上當時的時間戳。后臺接收到的時候庭再,除了判斷隨機數是否存在捞奕,還需要判斷客戶端的時間戳和服務器當前的時間的差值是否超過60秒(一般http請求60秒是能夠到達服務器的),如果超過60秒拄轻,也認為是重放攻擊颅围,請求無效。
其實可以看出恨搓,隨機數+時間戳的方式院促,意思就是60秒內的防重放由隨機數解決。超過60秒的放重放由時間戳解決,這樣就完美的解決了防重放的問題一疯。
2.利用隨機數接口
這種方式是服務端增加一個getRadom的接口撼玄,每次請求先調用一次這個接口,這樣客戶端獲得一個隨機數墩邀,同事服務端會將這個隨機數存入redis中掌猛。
當客戶端發(fā)送請求時,服務端接收到會判斷帶過來的隨機數在redis中是否存在眉睹,如果存在說明是該請求報文是第一次調用荔茬。如果不存在,說明是重放攻擊竹海,請求無效慕蔚。