掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在大前端時(shí)代的安全性一文中講了 Web 前端和 Native 客戶端如何從數(shù)據(jù)安全層面做反爬蟲策略,本文接著之前的背景,將從 API 數(shù)據(jù)接口的層面講一種技術(shù)方案,實(shí)現(xiàn)數(shù)據(jù)安全。

成都創(chuàng)新互聯(lián)公司主營大箐山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),大箐山h5小程序制作搭建,大箐山網(wǎng)站營銷推廣歡迎大箐山等地區(qū)企業(yè)咨詢
一、 API 接口請(qǐng)求安全性問題
API 接口存在很多常見的安全性問題,常見的有下面幾種情況
所以針對(duì)上述的問題也有一些解決方案:
關(guān)于 HTTPS 證書雙向認(rèn)證和 Web 端反爬蟲技術(shù)方案均在大前端時(shí)代的安全性一文中有具體講解。接下來引出本文主角:防重放
二、 請(qǐng)求參數(shù)防篡改
在之前的文章也講過,HTTPS 依舊可以被抓包,造成安全問題。抓包工具下數(shù)據(jù)依舊是裸奔的,可以查看Charles 從入門到精通文中講的如何獲取 HTTPS 數(shù)據(jù)。
假如通過網(wǎng)絡(luò)層高手截獲了 HTTPS 加證書認(rèn)證后的數(shù)據(jù),所以需要對(duì)請(qǐng)求參數(shù)做簽名。步驟如下
因?yàn)橹虚g人不知道簽名密鑰,所以即使攔截到請(qǐng)求,修改了某項(xiàng)參數(shù),但是無法得到正確的簽名 signature,這樣構(gòu)造的一個(gè)請(qǐng)求,會(huì)被服務(wù)器判定為一次非法請(qǐng)求。
三、 防重放策略
在工程師文化中,我們要做一個(gè)事情,就首先要對(duì)這個(gè)事情下個(gè)定義。我們才能知道做什么、怎么做。
理論上,一個(gè) API 接口請(qǐng)求被收到,服務(wù)會(huì)做校驗(yàn),但是當(dāng)一個(gè)合法請(qǐng)求被中間人攔截后,中間人原封不動(dòng)得重復(fù)發(fā)送該請(qǐng)求一次或多次,這種重復(fù)利用合法請(qǐng)求進(jìn)行得攻擊被成為重放。
重放會(huì)造成服務(wù)器問題,所以我們需要針對(duì)重放做防重放。本質(zhì)上就是如何區(qū)別去一次正常、合法的請(qǐng)求。
3.1 基于 timestamp 的方案
理論上,客戶端發(fā)起一次請(qǐng)求,到服務(wù)端接收到這個(gè)請(qǐng)求的時(shí)間,業(yè)界判定為不超過60秒。利用這個(gè)特征,客戶端每次請(qǐng)求都加上 timestamp1,客戶端將 timestamp1 和其他請(qǐng)求參數(shù)一起簽名得到 signature,之后發(fā)送請(qǐng)求到服務(wù)器。
假如中間人攔截到請(qǐng)求,修改了 timestamp 或者其他的任何參數(shù),但是不知道密鑰,所以服務(wù)器依舊判定為非法請(qǐng)求。
中間人從抓包、篡改參數(shù)、發(fā)起請(qǐng)求的過程一般來說大于60秒,所以服務(wù)器依舊會(huì)判定為非法請(qǐng)求。
基于 timestamp 的設(shè)計(jì)缺陷也很明顯,種種原因下,60秒內(nèi)的請(qǐng)求,會(huì)鉆規(guī)則漏洞,服務(wù)器判定為一次合法請(qǐng)求。
3.2 基于 nonce 的方案
既然時(shí)間戳?xí)新┒?,那么新方案是基于隨機(jī)字符串 nonce。也就是說每次請(qǐng)求都加入一個(gè)隨機(jī)字符串,然后將其他參數(shù)一起利用密鑰加密得到簽名 signature。服務(wù)端收到請(qǐng)求后
但是該方案也有缺點(diǎn),因?yàn)楫?dāng)次的請(qǐng)求都需要和集合中去搜索匹配,所以該集合不能太大,不然匹配算法特別耗時(shí),接口性能降低。所以不得不定期刪除部分 nonce 值。但是這樣的情況下,被刪除的 nonce 被利用為重放攻擊,服務(wù)器判定為合法請(qǐng)求。
假設(shè)服務(wù)器只保存24小時(shí)內(nèi)請(qǐng)求的 nonce,該存儲(chǔ)仍舊是一筆不小的開銷。
3.3 基于 timestamp + nonce 的方案
根據(jù) timestamp 和 nonce 各自的特點(diǎn):timestamp 無法解決60秒內(nèi)的重放請(qǐng)求;nonce 存儲(chǔ)和查找消耗較大。所以結(jié)合2者的特點(diǎn),便有了 「timestamp + nonce 的防重放方案」。
步驟:
該集合不應(yīng)該直接操作文件或者數(shù)據(jù)庫,否則服務(wù)端 IO 太多,造成性能瓶頸。可以是 mmap 或者其他內(nèi)存到文件的讀寫機(jī)制。根據(jù)場景可以選擇樂觀鎖、悲觀鎖。
其中有一個(gè) timestamp 的問題,服務(wù)器會(huì)將請(qǐng)求參數(shù)中的 timestamp 判斷差值,其中一個(gè)致命的缺點(diǎn)是服務(wù)器的時(shí)間和客戶端的時(shí)間是存在時(shí)間差的,當(dāng)然你也可以通過校驗(yàn)時(shí)間戳解決此問題。時(shí)間同步請(qǐng)繼續(xù)看下面部分。
四、 計(jì)算機(jī)網(wǎng)絡(luò)時(shí)間同步技術(shù)原理
客戶端和服務(wù)端的時(shí)間同步在很多場景下非常重要,舉幾個(gè)例子,這些場景都是經(jīng)常發(fā)生的。
所以該現(xiàn)象在計(jì)算機(jī)領(lǐng)域有非常普遍,有解決方案。
如果精度要求不高的情況下:先請(qǐng)求服務(wù)器上的時(shí)間 ServerTime,然后記錄下來,同時(shí)記錄當(dāng)前的時(shí)間 LocalTime1;需要獲取當(dāng)前的時(shí)間時(shí),用最新的當(dāng)前時(shí)間 (LocalTime2 - LocalTime1 + ServerTime)
拿 iOS 端舉例:
如果需要精度更高,比如 100納秒的情況,則需要使用 NTP(Network Time Protocol)網(wǎng)絡(luò)時(shí)間協(xié)議、PTP (Precision Time Protocol)精確時(shí)間同步協(xié)議了。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流