84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
现在要做这样一个判断,用户下载了某个app(平台不限ios/android)后,在初次启动app时向服务器发起一个http请求,我想判断这个请求是从app发过来的而不是来自其他工具的恶意访问。因为想到http请求中带的参数是可能被截获,所以尽管服务器端通过请求参数的验证和user-agent等的验证,也不能完全确保请求来源的合法性。请教有没有高安全性的解决方案!谢谢!
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
行動app可以考慮自簽名ssl憑證。 ssl pinning保證請求安全。除非反編譯原始碼,否則幾乎為0的可能性偽造請求。
update:
看到這問題又被頂上來了,忍不住更新一下回答。
首先,把問題細分化看。
假設情境1 - App要求內容為公開內容(例如:新聞清單、文章清單、發布評論(假設評論不需要登入)): 如上的回答,自簽名SSL(所謂的自簽名目的是節省那一年幾十或幾百、幾千塊的憑證費用)即可。
假設情境2 - App請求內容為私有內容(如網路銀行、內部客戶端等需要使用者登入): 1.登錄,取得用戶唯一證書(每次登陸都產生新的證書,覆蓋已有證書) 2.App端請求攜帶該用戶唯一憑證請求
這個問題可以進一步升級為: http的請求,如何不被攔截並偽造.
因為 web 是不安全的, 所以很難做到請求會被攔截. 因此, 我們假設請求一定會被攔截. 所以也帶來一個問題: 如果請求所攜帶的參數一直不變, 那麼肯定請求就很容易被偽造了.
因此, 把思路轉向: 每次請求所攜帶的參數都不一樣. 很容易就能想到公鑰私鑰的解決方案. 使用公鑰對某一參數進行加密, 然後到服務端進行解密. 同時, 為了讓這一參數隨時變化, 很明顯一個比較簡單的參數就是時間了.
在對時間進行加密後, 服務端就可以解密出來, 得到時間. 然後時間進行驗證. 考慮到時間會有誤差, 所以服務端可以加一個誤差值.
這個方案的漏洞是: 如果 app 被破解了, 公鑰和參數可以獲取了之後, 就可以認為偽造加密後的數據, 進行請求.
沒有絕對的安全, 只是把破解的難度加大而已.
想要傳輸的安全就用https 請求參數可以參考軟體序號的機制,例如透過某種演算法把mac位址和時間戳加密,然後把mac位址和加密後的mac位址、時間戳一同傳過來伺服器校驗
http沒有很好的防破解方法 只有加強破解的難度 digest認證方式不錯
行動app可以考慮自簽名ssl憑證。 ssl pinning保證請求安全。除非反編譯原始碼,否則幾乎為0的可能性偽造請求。
update:
看到這問題又被頂上來了,忍不住更新一下回答。
首先,把問題細分化看。
假設情境1 - App要求內容為公開內容(例如:新聞清單、文章清單、發布評論(假設評論不需要登入)):
如上的回答,自簽名SSL(所謂的自簽名目的是節省那一年幾十或幾百、幾千塊的憑證費用)即可。
假設情境2 - App請求內容為私有內容(如網路銀行、內部客戶端等需要使用者登入):
1.登錄,取得用戶唯一證書(每次登陸都產生新的證書,覆蓋已有證書)
2.App端請求攜帶該用戶唯一憑證請求
這個問題可以進一步升級為: http的請求,如何不被攔截並偽造.
因為 web 是不安全的, 所以很難做到請求會被攔截. 因此, 我們假設請求一定會被攔截.
所以也帶來一個問題: 如果請求所攜帶的參數一直不變, 那麼肯定請求就很容易被偽造了.
因此, 把思路轉向: 每次請求所攜帶的參數都不一樣.
很容易就能想到公鑰私鑰的解決方案. 使用公鑰對某一參數進行加密, 然後到服務端進行解密.
同時, 為了讓這一參數隨時變化, 很明顯一個比較簡單的參數就是時間了.
在對時間進行加密後, 服務端就可以解密出來, 得到時間. 然後時間進行驗證.
考慮到時間會有誤差, 所以服務端可以加一個誤差值.
這個方案的漏洞是: 如果 app 被破解了, 公鑰和參數可以獲取了之後, 就可以認為偽造加密後的數據, 進行請求.
沒有絕對的安全, 只是把破解的難度加大而已.
想要傳輸的安全就用https
請求參數可以參考軟體序號的機制,例如透過某種演算法把mac位址和時間戳加密,然後把mac位址和加密後的mac位址、時間戳一同傳過來伺服器校驗
http沒有很好的防破解方法 只有加強破解的難度
digest認證方式不錯