題外話:
有人說:就算是https加密加API接口加密黑客照樣可以攻擊你,小公司沒必要浪費這個精力去考慮這個問題,API接口也沒必要去加密傳輸,過度設計實在是得不償失。
回:家里的錢放屋子里小偷也能偷,干嘛不放到馬路上去呢?把錢鎖在抽屜里是很有必要的。
什么是過度設計:花一百萬買保險柜只為了存一百塊錢。
還有,一個好的產品都是希望在考慮更多情況下,選擇合適的優化方案的情況下完成的,否則就是態度有問題。
一、普通的API加密設計方案(加上https更好)
【步驟A】iOS端加固key
客戶端存儲約定的key不能簡單存放,不然一定反編譯很容易被獲取(因為是簡單加密,不需要太糾結):
(1)、蘋果增加更安全的存儲方式:Keychain(相對于NSUserDefaults數據以明文的形式保存在)提供了一種安全的保存私密信息(密碼,序列號,證書等)的方式,每個ios程序都有一個獨立的keychain存儲,將數據加密后存儲在本地,更安全。
(2)、通過8進制或16進制進行轉換的形式獲取,這樣反編譯后只能看到類似03 78 67 這樣數字,增加難度。
(3)、綜合上面方法存儲
【步驟B】客戶端上傳加密設置
1、把header和參數安裝某種排序,比如page=13nickname=“小貓”生成字符串String1
2、String1拼接時間戳timestamp=134939349944生成String2
3、String2拼接約定的key參數成字符串String3
4、以約定的算法對String3加鹽進行SHA256加密(或者MD5+salt)生成sign
5、登錄的用戶需要把后臺返回的token一起上傳(Token是否有效根據后臺設定refreshToken是否過期判斷,過期要重新加載)
【步驟C】服務器校驗
1、服務端對token、timestamp和sign進行驗證,只有三個參數都正確,查詢緩存沒有的,且timestamp在規定時間內,本次請求才有效
2、根據時間戳timestamp如何設置最大時間間隔:服務器最大時間容差1分鐘+客戶端請求超時30秒 = 1分30秒
3、服務器緩存:將sign以鍵值對的形式存放在緩存服務器中,用來屏蔽重復請求
4、對于需要登錄的請求:將用戶登錄后服務器返回給客戶端的Token以鍵值對的形式存放在緩存服務器中。服務端接收到請求后進行Token驗證,如果Token不存在,說明請求無效。
至此:一個普通的API加密已經完成,一般黑客基本無心耗費精力來破解了,投入產出比很重要,虧本買賣誰做啊!
二、如果需要加強的,學習一下相關知識
1、關于加密的概念,很多人想當然的以為自己的加密方式最安全,只要不告訴別人就行,哈哈,好比閉門鎖國,可能一炮就被別人干掉了。可以看看[應用密碼學]
2、認為MD5不安全了,網上可以反查。能夠反查的都是一些有規律的字符,有效的處理效果才能更佳,參考應用密碼學的笑話之MD5+Salt不安全
3、服務端動態生成token,客戶端調用的時候需要回傳token,參考 微信公共平臺 access_token
4、相關隨筆
移動開發通信之http/https概念-優缺點-選擇
移動開發通信之https加密協議SSL/TLS理解
移動開發通信之get/post理解和使用
其他學習資料:
應用密碼學
螞蟻金服開發平臺 簽名與驗簽
微信公共平臺 access_token
通過Spring Session實現新一代的Session管理