淺談API安全設計 - 簡書

long_broken 8年前發布 | 24K 次閱讀
文/江湖一鍵飄(簡書作者)
原文鏈接:http://www.jianshu.com/p/d7c52d113a68

一、簡述

安全是恒久的話題,如果不注意防范,會帶來很嚴重的后果。比如:

1.接口被大規模調用消耗系統資源,影響系統的正常訪問,甚至系統癱瘓

2.數據泄露

3.偽造(篡改)數據,制造垃圾數據

4.App被仿制…

那么我們設計API時,就要保證RESTful API的安全性,主要包括三大方面:

a) 對受限資源的登錄授權

b) 對請求做身份認證,并且防止篡改,重放攻擊

c) 對敏感的數據做加密

二、受限資源的登錄授權

此流程不是本文重點,不贅述,基本流程如下:

1. 客戶端提交賬號信息(用戶名+密碼)到服務端

2.  服務端驗證成功,返回AccessToken給客戶端存儲

3.訪問受限資源時,客戶端帶入AccessToken就可訪問。

三、請求認證

如果不對請求進行簽名認證,那么可以簡單的通過fiddler等工具輕易抓包拿到數據,并進行篡改,提交,大規模批量調用,則會使系統產生大量垃圾數據,系統資源被大量消耗,甚至無法正常使用(另說,當然可以通過GateWay進行限流),因而我們需要對請求進行簽名認證。

URL格式

URL:schema://domain/path?query&imei×tamp&sign

556984-008502aa7099bd2a.png
參數說明

 

簽名方法


sign=signature(path?query&imei×tamp&SIGN_KEY)

556984-63379a989b4417e7.png
驗證過程

 

認證邏輯

1、初始時,服務端存有各App版本的SIGN_KEY,客戶端存有對應版本的SIGN_KEY

2、當要發送請求之前,通過簽名方法加密,得到一個sign

3、發送請求的時候,連同sign一起發送給服務器端

4、服務器端首先驗證時間戳timestamp是否有效,比如是服務器時間戳5分鐘之前的請求視為無效;

5、然后取對應版本的SIGN_KEY驗證sign是否合法

6、為了防止重放攻擊,需要檢查sign是否在redis中存儲,如不存在則存入redis(緩存5分鐘)

如何防止數據篡改

這里通過簽名參數中包含原有請求的所有參數,改動任意參數,sign值都會不同,因此無法篡改。

如何防止重放攻擊

由于簽名算法中還有imei(設備唯一Id)、timestamp參數,且簽名算法為不可逆算法(如md5或sha1),因而對于正常的每個請求sign值不會重復。此時服務端可以存儲5分鐘的sign值,來做重放攻擊時的驗證過濾,超過5分鐘的請求則直接被timestamp校驗過濾。

總結

如此便實現了請求認證,防止數據篡改,重放攻擊,但是需要確保App密鑰(SIGN_KEY)的安全保存,其優點是容易理解與實現,缺點是需要承擔安全保存密鑰和定期更新密鑰的負擔。

四、敏感據加密

1)、部署SSL基礎設施(即HTTPS),敏感數據的傳輸全部基于SSL。

2)、僅對部分敏感數據做加密(例如賬號+密碼),并加入某種隨機數作為加密鹽,以防范數據被篡改。

 本文由用戶 long_broken 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!