人机接口与机机接口认证那些事
我们在使用手机访问网络服务的过程中,比如使用视频软件看电影、看新闻的时候,会涉及一个典型的使用场景如图1所示:
图1 网络交互场景
(1)由于视频资源大多数都具有版权,视频提供方希望只给VIP用户提供服务。所以我们需要先使用账号+密码的方式登录视频软件客户端,以便视频服务提供方鉴别我们是否具有该资源访问权限;
(2)当访问视频资源的时候,视频资源可能来自于多个版权方,每个版权方都有自己的资源服务器,这个涉及资源或服务共享,当然这个过程可能在用户的角度无感知。
但从开发者角度,有两点是软件开发者所重点关注的:
(1)服务提供方:以什么方式核实当前用户身份?
(2)三方服务提供方:以什么方式核实当前服务调用方的身份?
这里引入两个概念:
人机接口:指人与计算机之间或者人与后台服务直接建立联系、交换信息的输入/输出的接口。
机机接口:指计算机与计算机之间或者两个不同后台服务直接建立联系、交换信息输入/输出的接口。
本文重点介绍人机接口中基于移动端应用Token机制和机机接口中的后台服务间AK/SK认证方式。对于人机中的设备认证(指纹、面部识别等)和机机中的设备认证(设备指纹、可信设备等)不做介绍。
本文不对Token的基本原理进行展开,重点介绍一下关于移动端应用Token机制业务痛点,并提出一种优化解决方案。
手机应用很多都有账号登录认证功能,用户通过账户密码方式登录后,服务端都会生成并下发一个Token,一种可以在指定有效时间免重新登录认证的认证凭证,之后客户端携带token即可完成验证。
不同于B/S架构token可以设置成很短的有效期(如几小时),C/S架构的如果设置Token的有效期很短会直接影响用户体验,这主要区别在于web访问和应用使用的频率不同,web访问是接近实时需求(很少有用户需要长期访问指定网站),应用使用则是事件性的(可能一周只用一次,但每次使用的时候如果Token都失效了,效果等同于每次都需要重新登录认证,体验很差)。问题来了,从用户体验角度是不是Token永久有效最好?
如果不考虑安全性,从用户体验角度的确永久的Token是最好的。那安全问题在哪呢?
(1)移动设备不可信(例如:获取其他人的手机或者丢失等场景),涉及设备认证,不展开介绍;
(2)Token有效期内被窃取了,攻击者可利用该Token仿冒用户身份从而导致信息或者财产损失。
1.1 业界常见的Token方案
目前移动应用Token有效期方案大致有以下几种,如图2所示:
图2 Token有效期方案
注:Access Token即“访问令牌”,是客户端向资源服务器换取资源的凭证,Refresh Token即“刷新令牌”,是客户端向认证服务器换取Access Token的凭证,不直接参与资源认证请求所以使用频率低于Access Token,泄露概率相对较低(如若泄露,风险等同长期Token)。Token泄露风险示意流程如图3所示:
图3 Token泄露风险示意流程
结合上面分析,我们可以看到Token有效期越长会导致泄露概率越高,攻击者长期仿冒用户访问资源风险越高。所以可以考虑将Token有效期尽量减少规避此类问题,但这个会导致用户体验不够好。
1.2 Token解决方案优化
综合上述方案分析,是否可以基于现有Token方案再优化一下,使得能够在满足用户体验的前提下安全性又能得到保障。针对上述问题重新设计方案思路如下:
(1)设置短期有效Token,例如1天时间,减少Token长期使用泄露风险;
(2)支持失效Token自更新机制,端侧使用失效Token向服务器请求时,服务端自动生成新Token下发给客户端。规避频繁登录问题;
(3)Token生成包含递增序列作为参数,该序列会被服务端记录,一个失效Token只能自刷一次,且需与记录的递增参数相同;
(4)可设置Token自刷新有效次数来加强用户体验,如30次(单次有效期1天的话,那就是1个月有效)。自刷新次数超过限制需要用户重新登录认证生成新Token。
Token失效情况下自刷新综合流程如图4所示:
图4 Token自刷新流程示意
优势:
(1)可灵活保障用户体验,可以通过服务端单方面配置完成用户重新认证频率;
(2)降低长期Token泄露风险,自刷新Token有效期短,泄露风险低;
(3)服务端可以通过失效的Token重新使用情况判断用户是否存在泄露,存在被攻击风险,结合(1)可以及时告知用户风险,然后重新要求用户登录认证。
目前机机接口认证主要是AK/SK认证,本文重点关于该方式使用进行简单说明,并对其使用不当导致的风险进行说明。
AK (Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。
SK (Secret Access Key):与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。
在SK得到妥善保存的基础上,AK/SK相对于Token安全性更高。其主要原理类是消息认证码机制,引入私密协商密钥使得攻击者与接入方信息不对等。
AK/SK认证示意图如图5所示:
图5 AK/SK认证流程
通过上述示意图我们可以知道Access Key ID(AK)是需要在网络中传输的,本身安全性可控,但Secret Access Key(SK)不直接经过网络传输,并且如果泄露会直接导致认证被仿冒。但往往会由于开发者安全意识差导致需要保密存储的SK在代码中硬编码,直接泄露给攻击者,这样攻击者直接利用认证信息则可以仿冒接入方非法接入服务方提供的收费服务。
攻击利用场景如图6所示:
图6 攻击利用场景
上述分析可以看出,AK/SK硬编码导致的泄露风险较大,所以请勿将机机接口认证方式用于客户端与服务提供方直接交互,可以引入人机接口认证方式和机机接口认证方式来实现业务方案,如图7所示:
图7 认证流程示意图
方案说明:客户端不直接保存AK/SK,有服务端以配置形式加密存储于自身服务器。这样相对于硬编码方案,对于认证信息变更维护更加灵活可控。
总结:
无论是人机接口认证还是机机接口认证,解决的都是信任的问题。如何做好安全功能设计,这就需要站在不信任的前提去思考。安全无小事,防患于未然,无危则安,无损则全。
参考文章:
https://www.jianshu.com/p/e0ac7c3067eb
https://blog.51cto.com/u_15082391/4521181