程治胜
摘要 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.