API介面安全性設計以及各引數的作用

2021-10-19 13:38:37 字數 2864 閱讀 2685

對於乙個暴露在網際網路中的軟體服務來說,網路安全一直都是乙個很重的話題,時刻都要提防著各種各樣的攻擊,本編文章主要圍繞api介面方面展開安全性思考,也是在近期學習過程中的一些總結與感悟,拿出來與大家進行分享,如有錯誤也歡迎各位幫助糾正!

1、敏感資料明文傳輸

2、資料傳輸被抓包竊取

3、資料被抓包篡改

4、重放攻擊

5、dos攻擊

1、token

2、timestamp

3、sign

4、nonce

5、key

接下來我們通過問題驅動,來看看這些引數存在的意義!

我們都知道http協議的特點是通訊無狀態,客戶端與服務端的每一次通訊都是陌生的,也就意味著客戶端第一次登陸系統時通過使用者名稱、密碼驗證通過後,也只是一次有效,一旦重新整理頁面就必須重新進行身份驗證,這誰受得了?

於是就引入了token機制,當客戶端第一次通過使用者名稱、密碼在服務端驗證通過後,服務端生成乙個token返回給客戶端,之後客戶端每次請求只需要帶上這個token即可表明身份。

當服務端快取token時,可以用來控制使用者登入的有效期,比如在生成token時,也把token快取在redis中並設定失效時間為30分鐘,那麼之後客戶端的每次請求都可以先從redis中判斷token是否存在,如不存在則表示未登入或者登入已過期。

現在token就是訪問系統的身份令牌,一旦token被竊取也就意味著攻擊者可以冒充他人身份對系統進行非法訪問,所以一般都需要在https中進行傳輸。

timestamp引數就是乙個時間戳,主要可以用來防止dos攻擊的,當服務端收到url請求時,通過timestamp與當前伺服器的時間進行比對,如果超過指定的閾值(比如1分鐘),則認為本次請求無效,不過如果攻擊者能夠在1分鐘內進行攻擊的話,那timestamp的作用就只能減少攻擊的時間,而不能阻止攻擊行為。

如果你想到攻擊者可以通過修改timestamp值來進行攻擊的話,那麼就需要依靠sign來解決了。

當然timestamp還可以單純的用來記錄時間等常規操作。

dos是denial of service的簡稱,即拒絕服務,造成dos的攻擊行為被稱為dos攻擊,其目的是使計算機或網路無法提供正常的服務。最常見的dos攻擊有計算機網路寬頻攻擊和連通性攻擊。

dos攻擊是指故意的攻擊網路協議實現的缺陷或直接通過野蠻手段殘忍地耗盡被攻擊物件的資源,目的是讓目標計算機或網路無法提供正常的服務或資源訪問,使目標系統服務系統停止響應甚至崩潰,而在此攻擊中並不包括侵入目標伺服器或目標網路裝置。這些服務資源包括網路頻寬,檔案系統空間容量,開放的程序或者允許的連線。這種攻擊會導致資源的匱乏,無論計算機的處理速度多快、記憶體容量多大、網路頻寬的速度多快都無法避免這種攻擊帶來的後果。

nonce是乙個在客戶端生成的隨機數,可以用來防止重放攻擊,服務端可以規定nonce值一次性有效,服務端把客戶端發來的nonce快取到乙個集合中,然後每次先從集合中判斷是否存在當前發來的nonce值,如果存在則認為當前請求為重複請求,直接拒絕。

思考乙個問題,服務端難道要一直維護這個nonce集合嗎?這肯定不現實,所以一般會結合timestamp,你可以規定timestamp為1分鐘內有效,那麼自然nonce集合中儲存的資料最多也就是1分鐘內的客戶端發來的請求。

現在我們通過nonce解決了重放攻擊的問題,並且通過timestamp解決了儲存nonce集合數量過大的問題。

sign即簽名,主要用於解決資料被篡改的問題,sign值一般通過data(業務引數)+token+key+timestamp+nonce拼接,然後再經過摘要演算法(比如md5)生成sign簽名,並傳遞給服務端,而服務端則分別獲取data、token、key、timestamp、nonce並按照約定的方式和演算法也生成乙個簽名,再與客戶端傳來的sign進行比對,如果一直則表示引數沒有被篡改過。

由於攻擊者得不到key值,也就無法篡改引數後重新生成有效的簽名。(關於為什麼得不到key,請看下面對key值的分析)

當然由於data、token、key、timestamp、nonce都需要進行傳輸,所以也需要使用https進行傳輸。

key是乙個隨機數,用來作為對稱加密中的金鑰,主要可以對data、token、nonce進行加密,這樣就可以解決資料明文傳輸的問題(也就是通過瀏覽器的f12可以看到明文資料的問題),服務端得到key後,只需要對被key加密後的資料進行解密即可。

不過key自己作為引數傳遞的一部分,要如何保證自己不被發現呢,這又涉及到非對稱加密的問題,key可以在客戶端用公鑰進行加密,服務端再通過私鑰進行解密即可,而公鑰是可以對外暴露的(因為被公鑰加密的資料,拿公鑰是解不開的)。

現在所有的引數的都派上用場了,當然如果要防止資料傳輸過程中被抓包竊取的問題還得需要通過https來解決。

摘要演算法的特點就是不可逆,生成的內容是固定長度的,驗證時通過同樣的演算法生成後進行比對驗證,一般可用於數字簽名。

對稱加密的特點就是通過乙個金鑰可以進行加密、解密,速度快、效率高,不過加密解密的雙方如何安全的傳遞金鑰就成了關鍵,只要有一方洩露了金鑰,整個加密演算法就無用了。

非對稱加密相對對稱加密來說效率偏低,但是相對安全,非對稱加密使用了兩個金鑰,乙個是對外公開的,稱為公鑰,乙個是對內保密的,稱為私鑰,通過公鑰加密的資料再用公鑰去解密是解不開的,只有私鑰才能解開,這是非對稱加密的關鍵。

一般客戶端儲存公鑰,服務端儲存私鑰,然後客戶端生成隨機生成對稱加密的金鑰,把這個金鑰通過非對稱加密的公鑰進行加密,並傳遞給服務端,服務端只需要通過私鑰解密,就可以得到對稱加密的金鑰,這樣通過一次非對稱加密的方式就完成了金鑰的安全傳遞,之後雙方就可以通過對稱加密進行資料傳輸了,這樣既解決了金鑰傳遞的安全問題,又解決了非對稱加密的效率問題。

有關https相關的內容,可以參考我的另一篇博文:通俗易懂的理解https的作用與原理

API介面安全性設計

介面的安全性主要圍繞token timestamp和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看 token授權機制 使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token 通常是uuid 並將token userid以鍵值對的形式存放在快取伺服器中。服務端接收...

API介面安全性設計

介面的安全性主要圍繞token timestamp和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看 token授權機制 使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token 通常是uuid 並將token userid以鍵值對的形式存放在快取伺服器中。服務端接收...

API介面安全性設計

介面的安全性主要圍繞token timestamp和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看 token授權機制 使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token 通常是uuid 並將token userid以鍵值對的形式存放在快取伺服器中。服務端接收...