java - 如何確保服務端的接口調用安全?
問題描述
服務端提供各種功能接口供客戶端調用,那么怎樣才能確保請求是來自合法的客戶端,而不是非法的請求呢?
問題解答
回答1:驗證token,或者服務端用OAuth2框架
回答2:你是如何定義合法和非法的?在SSO框架下,有token就是橫著走,如果是第三方肯定需要appid和appsecret,需要授權的話還要帶上AccessToken,這樣也是橫著走,最簡單的是寫一個IP攔截器,只允許信任IP通過,但是是用于內部互相調用的高級別攔截了,一般來說對方提供了token或appsecret,基本上都算是合法的吧?
回答3:在設計API時,要保證RESTful API的安全性,主要考慮三個大方面:
1.對受限資源的登錄授權2.對請求做身份認證3.對敏感數據進行加密
一、受限資源的登錄授權此流程不是本文重點,不贅述,基本流程如下:
客戶端提交賬號信息(用戶名+密碼)到服務端
服務端驗證成功,返回AccessToken給客戶端存儲3.訪問受限資源時,客戶端帶入AccessToken就可訪問。
二、請求認證如果不對請求進行簽名認證,那么可以簡單的通過fiddler等工具輕易抓包拿到數據,并進行篡改,提交,大規模批量調用,則會使系統產生大量垃圾數據,系統資源被大量消耗,甚至無法正常使用(另說,當然可以通過GateWay進行限流),因而我們需要對請求進行簽名認證。
URL格式URL:schema://domain/path?query&imei×tamp&sign
參數說明簽名方法sign=signature(path?query&imei×tamp&SIGN_KEY)
驗證過程認證邏輯1、初始時,服務端存有各App版本的SIGN_KEY,客戶端存有對應版本的SIGN_KEY2、當要發送請求之前,通過簽名方法加密,得到一個sign3、發送請求的時候,連同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)、僅對部分敏感數據做加密(例如賬號+密碼),并加入某種隨機數作為加密鹽,以防范數據被篡改。
回答4:我們用的RSA加密算法,請求數據的參數均轉成json然后用服務器RSA證書對json進行加密,http請求就可以了,服務端私鑰解密
回答5:使用oauth2或者類似的token之類的
相關文章:
1. 小程序怎么加外鏈,語句怎么寫!求救新手,開文檔沒發現2. javascript - ...mapGetters和...mapState獲取到的state,怎么拿來在methods中操作?3. python - linux怎么在每天的凌晨2點執行一次這個log.py文件4. javascript - 在 vue里面用import引入js文件,結果為undefined5. 如何分別在Windows下用Winform項模板+C#,在MacOSX下用Cocos Application項目模板+Objective-C實現一個制作游戲的空的黑窗口?6. Java反射問題:為什么android.os.Message的recycleUnchecked方法不能通過反射獲取到?7. php如何獲取訪問者路由器的mac地址8. git - 使用淘寶npm安裝hexo出現問題?9. php - 微信開發驗證服務器有效性10. [python2]local variable referenced before assignment問題
