程治勝
摘要??? Token是用戶登陸的唯一票據,只要APP傳來的Token和服務器端一致,就能證明已經成功登陸。但是Token機制不是萬能的,Token就像一把鑰匙,只要有了這把鑰匙就可以從服務器中獲取到系統數據,而Token在客戶端或者在傳輸過程中可能存在被截獲的風險。因此本文使用函數運算,另外構造一個多因子策略混合Token簽名,以降低Token被截獲后的影響,提高APP開放接口認證的安全性。
【關鍵詞】Token認證 簽名sign 多因子策略混合
1 Token的作用
最近幾年,隨著大數據以及人工智能等技術的產業化應用,對于移動應用的攻擊出現了新的趨勢。越來越多的黑灰產從業人員正在利用APP端的接口信息開發工具,非法獲取信息,或者進行薅羊毛等黑灰產業。其技術原理主要是通過分析和破解接口的通訊協議,模擬客戶端發送報文,從而獲取用戶數據,如果在開發過程中認證有缺陷,就極易被攻擊者攻擊,泄露數據甚至是客戶的隱私信息,也會對企業的業務造成很大影響。因為APP端沒有和PC端一樣的session機制,所以無法判斷用戶是否登陸,以及無法保持用戶狀態,所以就需要一種機制來實現session,這就是Token的作用。
2 Token的原理及缺陷
Token是用戶登陸的唯一票據,只要APP傳來的Token和服務器端一致,就能證明你已經登陸。客戶端通過API向服務器端發送(用戶名和密碼)進行登陸認證,服務器端接收到該請求后,驗證用戶信息是否正確。如果正確,則返回一個唯一不重復的字符串UID,然后在Redis(任意緩存服務器)中維護Token與UID的用戶信息關系,以便其他api對Token的校驗。判斷Token是否有效,根據請求過來的Token,查詢Redis緩存中的UID,如果獲取不到這說明該Token已過期。服務器接收到接口請求后,根據用戶獲取API_TOKEN,然后按簽名規則生成簽名,并與接口參數簽名對比,如果相同,則執行業務方法。簽名如下:
sign=MD5(UID+Timestamp+RandomString+Salt1+Token)
其中,客戶端通過API向服務器端發送(用戶名和密碼)進行登陸認證,服務器端接受到該請求后,驗證用戶信息是否正確。如果正確,則返回一個唯一不重復的字符串UID;Timestamp一般用來給服務器驗證請求時間區間,5-30分鐘不等,明文顯示;RandomString作為簽名的參數作用不大,明文顯示。Salt1:為客戶端與服務端保留,是個常量。一般不在接口中傳遞。但是,將App放進模擬器或者反編譯,就能獲得Salt1;
Token是App登錄后,服務端返回給客戶端的一個憑證,App會將其存在客戶端,下次再打開App時,直接讀Token,傳Token到服務端做驗證,免去重新輸入用戶密碼的麻煩。但是Token機制不是萬能的,Token就像一把鑰匙,只要有了這把鑰匙就可以從服務器中獲取到系統數據,而Token在客戶端或者在傳輸過程中可能存在被截獲的風險,萬一Token在客戶端或者在傳輸過程中被截獲怎么辦?
3 多因子策略混合Token簽名算法
本文構造了一個多因子策略混合Token簽名,通過函數運算得到:
New_Token=φ(UID,Timestamp,RandomStringToken,salt),φ為函數名
New_Token不在接口中傳輸,把New_Token也放到sign簽名中:
sign=MD5(UID+Timestamp+RandomString+Salt1+Token+New_Token)
其中,每次接口請求都要在客戶端構造New_Token,并將其發送至服務器端進行驗證,可以防止即便Token被截獲和Salt1被破解,客戶端的請求sign簽名中的New_Token與服務器端的New_Token相符才能獲得授權。
此外,我們還可以通過Ip和Deviceid進行限制,進一步提高認證的安全性,具體如下:
New_Token=φ(UID,Timestamp,RandomString,Token,salt,Ip,Deviceid)
從而得到:
sign=MD5(UID+Timestamp+RandomString+Salt1+Token+New_Token)
4 結束語
本文僅研究了提高APP開放接口認證的安全性的一種多因子策略混合Token簽名算法,APP接口認證的方式是仁者見仁智者見智,各種方式,各種結構,各有優缺點,但共同的目的一方面要防止用戶篡改請求參數,另一方面請求偽造及重復發送,第三保證用戶來源合法。對于敏感的Api接口,需使用https協議,https是在http超文本傳輸協議加入SSL層,它在網絡間通信是加密的,所以需要加密證書,且https協議需要ca證書,會產生一定的費用,成本相對較高。
參考文獻
[1]諾蘭G.(Godfrey的Android App[M].人民郵電出版社出版,2016:140-143.
[2]APP接口安全性設計淺析,https://blog.csdn.net/cafebar123/article/details/73650905.
[3]基于Token的身份驗證和安全問題,https://blog.csdn.net/qq_35246620/article/details/55049812.
[4]Web安全之token,https://blog.csdn.net/fhjdzkp/article/details/78845826.
[5]APP接口安全token設計,https://blog.csdn.net/b452608/article/details/50967849.
[6]WebApi安全性使用TOKEN+簽名驗證,https://blog.csdn.net/qq_33329988/article/details/78274344.