日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

API设计中防重放攻击

發(fā)布時(shí)間:2025/6/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 API设计中防重放攻击 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HTTPS數(shù)據(jù)加密是否可以防止重放攻擊?

否,加密可以有效防止明文數(shù)據(jù)被監(jiān)聽,但是卻防止不了重放攻擊。

防重放機(jī)制

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

timestamp+nonce

我們常用的防止重放的機(jī)制是使用timestamp和nonce來做的重放機(jī)制。
timestamp用來表示請(qǐng)求的當(dāng)前時(shí)間戳,這個(gè)時(shí)間戳當(dāng)然要和服務(wù)器時(shí)間戳進(jìn)行校正過的。我們預(yù)期正常請(qǐng)求帶的timestamp參數(shù)會(huì)是不同的(預(yù)期是正常的人每秒至多只會(huì)做一個(gè)操作)。每個(gè)請(qǐng)求帶的時(shí)間戳不能和當(dāng)前時(shí)間超過一定規(guī)定的時(shí)間。比如60s。這樣,這個(gè)請(qǐng)求即使被截取了,你也只能在60s內(nèi)進(jìn)行重放攻擊。過期失效。
但是這樣也是不夠的,還有給攻擊者60s的時(shí)間。所以我們就需要使用一個(gè)nonce,隨機(jī)數(shù)。
nonce是由客戶端根據(jù)足夠隨機(jī)的情況生成的,比如 md5(timestamp+rand(0, 1000)); 也可以使用UUID, 它就有一個(gè)要求,正常情況下,在短時(shí)間內(nèi)(比如60s)連續(xù)生成兩個(gè)相同nonce的情況幾乎為0。

服務(wù)端

服務(wù)端第一次在接收到這個(gè)nonce的時(shí)候做下面行為:?1 去redis中查找是否有key為nonce:{nonce}的string?2 如果沒有,則創(chuàng)建這個(gè)key,把這個(gè)key失效的時(shí)間和驗(yàn)證timestamp失效的時(shí)間一致,比如是60s。?3 如果有,說明這個(gè)key在60s內(nèi)已經(jīng)被使用了,那么這個(gè)請(qǐng)求就可以判斷為重放請(qǐng)求。
示例
那么比如,下面這個(gè)請(qǐng)求:
http://a.com?uid=123&timestam...
這個(gè)請(qǐng)求中的uid是我們真正需要傳遞的有意義的參數(shù)
timestamp,nonce,sign都是為了簽名和防重放使用。
timestamp是發(fā)送接口的時(shí)間,nonce是隨機(jī)串,sign是對(duì)uid,timestamp,nonce(對(duì)于一些rest風(fēng)格的api,我建議也把url放入sign簽名)。簽名的方法可以是md5({秘要}key1=val1&key2=val2&key3=val3...)
服務(wù)端接到這個(gè)請(qǐng)求:?1 先驗(yàn)證sign簽名是否合理,證明請(qǐng)求參數(shù)沒有被中途篡改?2 再驗(yàn)證timestamp是否過期,證明請(qǐng)求是在最近60s被發(fā)出的?3 最后驗(yàn)證nonce是否已經(jīng)有了,證明這個(gè)請(qǐng)求不是60s內(nèi)的重放請(qǐng)求

web層面也可以采用在頁面中加入token方式,手機(jī)驗(yàn)證碼,滑動(dòng)驗(yàn)證碼等方式來防止攻擊

總結(jié)

以上是生活随笔為你收集整理的API设计中防重放攻击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。