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)。

簽名的php版本實現:

    public static function sign($appSecret, $params) { if (!is_array($params)) $params = array(); ksort($params); $text = ''; foreach ($params as $k => $v) { $text .= $k . $v; } return md5($appSecret . $text . $appSecret); } 

接口調用方的請求地址類似於:

/api/?f=1&b=23&k=33&sign=signValue 

以上簽名方法安全有效�地解決了參數被篡改和身份驗證的問題,如果參數被篡改,沒事,因為別人無法知道appsecret,也就無法重新生成新的sign。

這里使用了md5的算法進行簽名,也可以自行選擇其他簽名方式,例如RSA,SHA等。

另外,多說一句,微信公眾號開發時,驗證服務器地址的有效性也采用了類似的方法,只是生成簽名的方法不一樣。

請求唯一性保證

md5簽名方法可以保證來源及請求參數的合法性,但是請求鏈接一旦泄露,可以反復請求,對於某些拉取數據的接口來說並不是一件好事,相當於是泄露了數據。

在請求中帶上時間戳,並且把時間戳也作為簽名的一部分,接口提供方對時間戳進行驗證,只允許一定時間范圍內的請求,例如1分鍾(即服務端時間戳減去url請求參數中的時間戳所得到的時間范圍)。因為請求方和接口提供方的服務器可能存在一定的時間誤差,建議時間戳誤差在5分鍾內比較合適。允許的時間誤差越大,鏈接的有效期就越長,請求唯一性的保證就越弱。所以需要在兩者之間衡量。

秘鑰的保存

在簽名的過程中,起到決定性作用之一的是appsecret,因此如何保存成為關鍵。我們分類討論。

接口調用方的代碼跑在服務器的情況比較好辦,除非服務器被攻陷,否則外接無法知道appsecret,當然,要注意不能往日志里寫入appsecret的值,其他敏感值也禁止寫入日志,如賬號密碼等信息。

假如是客戶端請求接口,就需要多想一步了。假如把appsecret硬編碼到客戶端,會有反編譯的風險,特別是android。可以在客戶端登陸驗證成功后,返回給客戶端的信息中帶上appsecret(當然,返回的數據也可能被攔截,真是防不勝防啊。。。)。特別說明一下,在android開發中,假如硬要把appsecret硬編碼,建議把appsecret放到NDK中編譯成so文件,app啟動后去讀取。

TOTP:Time-based One-time Password Algorithm(基於時間的一次性密碼算法)

在一些小型項目中,可能不需要復雜的簽名校驗,只需要�做調用方的身份驗證。TOTP(rfc6238)即可滿足。

TOTP是基於時間的一次性算法,客戶端和服務器端約定秘鑰,加入時間作為運算因子得到一個6位數字。客戶端請求服務端時生成一個6位數字,服務端使用相同算法驗證這個6位數字是否合法。

服務端簽名校驗總關口放在應用程序級別,不必一個一個接口進行校驗

下面再展開一下討論,跟本文討論的主題關系不大。

TOTP允許�客戶端和服務器端存在時間誤差,如口令在N分鍾內有效。給出一下源碼供大家參考:

與TOTP類似的還有 HTOP,它是基於次數的驗證算法。這里不展開討論。

 
TOTP流程

基於TOTP還有很多應用,例如動態的登錄口令。用戶登錄時,除了需要輸入設置的密碼外,還需要輸入動態密碼,每個用戶的秘鑰都不一樣,用戶的手機端安裝一個app即可實現,動態口令每N分鍾變化一次。android客戶端在各大應用市場搜索 google-authenticator,如 百度應用市場,ios客戶端在appstore也可搜索得到。下面給出部分下載鏈接:

支付寶、QQ令牌、銀行客戶端等這些手機客戶端中也有類似的應用,在驗證密碼之后會多出一道動態口令的驗證,他們使用的方案都類似於google-authenticator。

大公司的運維人員,甚至是所有員工登錄內部OA系統(單點登錄),都需要PIN+令牌碼的雙重驗證(PIN是自行設置的固定密碼,令牌碼則是動態口令碼),他們通常使用RSA SecurID雙因素動態口令身份認證解決方案。

 
SecureID_token




免責聲明!

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



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