【分享】對外API介面安全設計

語言: CN / TW / HK

前言

最近公司業務需要對外提供介面,之前沒有什麼對外介面開發經驗所以最近找了很多文章,惡補了一下對外介面開發知識,這篇算是自己開發介面的一個總結吧。下圖我設計介面的大體流程

對外介面的安全問題

1.傳輸過程的安全 請求報文在網路傳輸過程中可能會被劫持篡改請求引數資訊,導致服務端接收錯誤的引數。所以我們引入簽名機制,就好比一個指紋鎖,我需要一個正確的指紋才能開啟鎖,這裡的指紋就是簽名。介面請求方根據介面雙方約定的簽名規則對引數進行簽名,即使請求引數被篡改,我們通過雙方生成的簽名進行驗籤來拒絕這次請求。生成簽名的演算法可以使用摘要演算法最常用的SHA256。     以上所述我們可以保證請求資料由介面請求方到伺服器端的資料不會被篡改,那麼服務端返回到介面請求方的資料怎麼能保證這個資料是由服務端返回的未被篡改過的資料。這裡我的做法通過RSA演算法生成公私鑰,伺服器端儲存私鑰,線下提供公鑰給介面請求方,由介面請求方生成一個自己的金鑰secretKey,通過RSA演算法用公鑰對secretKey進行加密,將加密後的欄位通過請求頭的方式傳給服務端,服務端用私鑰解密得到secretKey,在服務端返回資料的時候用AES演算法進行加密,介面請求方用自己secretKey進行解密來保證返回資料的安全性。

2.到達服務端的安全 請求到達服務端需要判斷這個請求方的身份是否合法。以及是否被DoS攻擊。判斷身份是否合法我們可以利用token的方式,通過下線分配給介面請求方一個id和密碼類似於使用者登入的使用者名稱和密碼來獲取token(token可以是一次性的也可以設定有效時間段),每次請求都帶上token,服務端進行身份校驗。粗略的防止類似於DoS攻擊這樣的我們可以引入時間戳的機制,設定請求有效期例如三分鐘內的請求有效其它的無效,但是這種方法並不能阻止DoS攻擊,三分鐘內同樣可以使用DoS攻擊來使伺服器癱瘓。我們可以使用黑名單機制,對這個介面請求方的所有操作都直接返回錯誤或者拉入IP黑名單。如果對於頻繁的介面請求,可以採用限流機制(常見的限流方式有漏斗限流和令牌桶限流演算法)。 在對外介面中如果是寫入操作我們還需要防止重複寫入資料,例如新增資料,我們通常只要新增一條例外一條相同的請求過來我們應該直接返回上次相同的結果而不是再新插入一條資料。關於重複寫入資料的問題我採用的最簡單的方式就是寫入之前先去庫裡面查一次,如果存在就直接返回,無需繼續插入資料。(當然還有更多優化的方式) 同時,也可以使用一些API閘道器工具如Eolinker配合保護。

使用地址:www.eolinker.com

分享到: