API接口簽名驗證


系統從外部獲取數據時,通常采用API接口調用的方式來實現。請求方和接口提供方之間的通信過程,有這幾個問題需要考慮:

  1. 請求參數是否被篡改;
  2. 請求來源是否合法;
  3. 請求是否具有唯一性;

今天跟大家探討一下主流的通信安全解決方案。

 

參數簽名方式

這種方式是主流。它要求調用方按照約定好的算法生成簽名字符串,作為請求的一部分,接口提供方驗算簽名即可知是否合法。步驟通常如下:
①接口提供方給出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分鍾內比較合適。允許的時間誤差越大,鏈接的有效期就越長,請求唯一性的保證就越弱。所以需要在兩者之間衡量。

 

秘鑰的保存 

在簽名的過程中,起到決定性作用之一的是appsecret,因此如何保存成為關鍵。我們分類討論。
接口調用方的代碼跑在服務器的情況比較好辦,除非服務器被攻陷,否則外接無法知道appsecret,當然,要注意不能往日志里寫入appsecret的值,其他敏感值也禁止寫入日志,如賬號密碼等信息。
假如是客戶端請求接口,就需要多想一步了。假如把appsecret硬編碼到客戶端,會有反編譯的風險,特別是android。可以在客戶端登陸驗證成功后,返回給客戶端的信息中帶上appsecret(當然,返回的數據也可能被攔截,真是防不勝防啊。。。)。特別說明一下,在android開發中,假如硬要把appsecret硬編碼,建議把appsecret放到NDK中編譯成so文件,app啟動后去讀取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM