系統從外部獲取數據時,一般採用API接口調用的方式來實現。請求方和接口提供方之間的通訊過程,有這幾個問題須要考慮:android
今天跟你們探討一下主流的通訊安全解決方案。算法
參數簽名方式
這種方式是主流。它要求調用方按照約定好的算法生成簽名字符串,做爲請求的一部分,接口提供方驗算簽名便可知是否合法。步驟一般以下:
①接口提供方給出appid和appsecret
②調用方根據appid和appsecret以及請求參數,按照必定算法生成簽名sign
③接口提供方驗證簽名
生成簽名的步驟以下:
①將全部業務請求參數按字母前後順序排序
②參數名稱和參數值連接成一個字符串A
③在字符串A的首尾加上appsecret組成一個新字符串B
④對字符串進行md5獲得簽名sign
假設請求的參數爲:f=1,b=23,k=33,排序後爲b=23,f=1,k=33,參數名和參數值連接後爲b23f1k33,首尾加上appsecret後md5:
md5(secretkey1value1key2value2...secret)。安全
以上簽名方法安全有效地解決了參數被篡改和身份驗證的問題,若是參數被篡改,沒事,由於別人沒法知道appsecret,也就沒法從新生成新的sign。
這裏使用了md5的算法進行簽名,也能夠自行選擇其餘簽名方式,例如RSA,SHA等。服務器
請求惟一性保證
md5簽名方法能夠保證來源及請求參數的合法性,可是請求連接一旦泄露,能夠反覆請求,對於某些拉取數據的接口來講並非一件好事,至關因而泄露了數據。
在請求中帶上時間戳,而且把時間戳也做爲簽名的一部分,在接口提供方對時間戳進行驗證,只容許必定時間範圍內的請求,例如1分鐘。由於請求方和接口提供方的服務器可能存在必定的時間偏差,建議時間戳偏差在5分鐘內比較合適。容許的時間偏差越大,連接的有效期就越長,請求惟一性的保證就越弱。因此須要在二者之間衡量。app
祕鑰的保存
在簽名的過程當中,起到決定性做用之一的是appsecret,所以如何保存成爲關鍵。咱們分類討論。
接口調用方的代碼跑在服務器的狀況比較好辦,除非服務器被攻陷,不然外接沒法知道appsecret,固然,要注意不能往日誌裏寫入appsecret的值,其餘敏感值也禁止寫入日誌,如帳號密碼等信息。
假如是客戶端請求接口,就須要多想一步了。假如把appsecret硬編碼到客戶端,會有反編譯的風險,特別是android。能夠在客戶端登錄驗證成功後,返回給客戶端的信息中帶上appsecret(固然,返回的數據也可能被攔截,真是防不勝防啊。。。)。特別說明一下,在android開發中,假如硬要把appsecret硬編碼,建議把appsecret放到NDK中編譯成so文件,app啓動後去讀取。編碼