17-登录功能功能架构设计三(验证码登录)
xiangliheart
xiangliheart
发布于 2022-03-25 / 16 阅读 / 0 评论 / 0 点赞

17-登录功能功能架构设计三(验证码登录)

三类验证码登录设计

常用的验证码登录方式有3种,分别是手机验证码登录、动态令牌登录和语音验证码登录。虽然邮箱也可以用于发送验证码,但是由于其在国内的普及度,以及需要登录邮箱之后再获取验证码,便捷性较低,所以使用较少。

不同的验证码登录使用的都是不同的实现技术,手机验证码登录涉及短信发送技术,动态令牌登录涉及动态密钥的计算技术,语音验证码登录涉及TTS(Text To Speech,从文本到语音)技术。

4.3.1 手机验证码登录注册设计

手机验证码登录注册方式是目前使用比较广泛的登录方式,界面原型如图4-6所示,其优势主要有两个:(1)免去了用户的记忆成本,现在每个人都有各种系统账号和密码,很难记忆,如果设置为一样

的,则又有很大的安全隐患;(2)登录的同时完成快速注册,用户无须再填写密码、确认密码等其他信息。

1. Token技术基础知识

手机验证码、图片验证码、身份鉴别等场景会大量使用Token技术。在计算机领域中,Token代表令牌,它一般使用在各种身份鉴别、认证授权的应用场景中。可以将Token看作一种暗号,当系统想要访问一些受保护的资源时,必须要先对暗号进行核对,从而保证安全性。

Token就是一串字符,往往具有唯一性,代表一次认证授权的唯一标识。Token的形式没有具体的规定,一串数字、一个JSON串、一段二进制代码都可以作为Token。Token中可以携带信息,也可以不携带信息。例如,可以将用户的账号加密在Token中进行传输,JWT就是一种携带了信息的Token串(参见5.8.3 小节)。

图4-6 App手机验证码登录注册原型

Token具有有效期,为了保证安全性,Token并不是永久有效的,而是要进行定期失效和定期更换。因此,Token往往结合Session、

Redis、Memcached等使用。

2.手机验证码登录注册设计手机验证码登录注册流程如图4-7所示,包含以下8个步骤。

(1)   用户在客户端输入手机号,点击“获取验证码”按钮。

(2)   客户端向服务端发送请求,获取短信验证码。

(3)   服务端向用户手机发送短信验证码。

(4)   服务端生成Token并返回给客户端,目的是将验证码、手机号、Token绑定,增加安全校验,这一步也是被大多数设计者经常忽略的一步。

(5)   用户将接收到的手机验证码录入页面中,点击“登录”按钮。

(6)   客户端携带用户输入的短信验证码,以及Token请求服务端。

(7)   服务端校验用户提交的验证码与Token所对应的验证码是否匹配并且有效。如果数据校验通过,则检查此手机号是否已经注册。如果没有注册,则直接生成默认的账户信息,待用户后续完善,同时记录用户登录的Session。

(8)   服务端返回登录成功,客户端跳转页面,完成登录。

图4-7 手机验证码登录注册流程

拓展思考1:第1~2步,发送短信验证码的服务是开放式服务(无须登录即可调用),因此存在被攻击的风险,怎样防止攻击,可参见

7.2节。

拓展思考2:第3步,服务端发送短信验证码不可以使用MQ或异步发送方式,登录注册验证码短信的特点是实时性要求很高,用户点击 “获取验证码”按钮必须在60秒内收到,否则用户就会重新发送,或者失去耐心。因此,对于验证码类短信要采用同步发送机制,并且需要将短信是否已发送的状态反馈给用户。

拓展思考3:第4~7步,如果没有Token机制,那么会有什么风险?例如,在用户的手机上植入木马盗取短信信息,一旦获取到用户的验证码就可以直接在其他设备使用,而与具体的执行环境无关。Token机制要求短信验证码和Token必须一一对应,并且Token存储在获取手机验证码的设备上,这样即使用户的短信验证码泄露了,但是其他手机上并没有本验证码对应的Token,因此依然无法完成登录。

4.3.2 动态令牌登录设计

如果你开通银行的个人网银业务,就会得到类似图4-8所示的设备,上面的密码每隔1分钟刷新一次,因此也叫作动态口令。在网上银行办理业务时需要录入上面的密码,通过校验才可以登录成功,或者在支付环节也需要输入。

图4-8 网银动态令牌

动态令牌登录的核心思想是提供一个软件或设备,根据一定的算法,每隔60秒生成一组动态验证码,一般为6~8位数字,在用户登录时必须输入此动态验证码。

QQ安全中心、腾讯手机管家、网银动态口令、U盾都属于这种设计。动态验证码的好处是一次一密,无须记忆密码,无须发送短信,无须联网,没有任何其他成本,配合用户名和密码做二次校验,可以具有更高的安全性。

图4-9所示为腾讯手机管家动态令牌,中间所显示的6位数字就是腾讯手机管家生成的动态令牌,每隔一段时间更换一次,这是一种基于软件的实现方式。

思考:银行下发的网银动态口令设备,不与任何服务器联网,而动态令牌每分钟刷新一次密码,服务器是如何验证它是否正确的呢?

图4-9 腾讯手机管家动态令牌

动态令牌有一个唯一标识码,在银行办理网银业务时,会与客户的银行账户绑定。这样就完成了动态令牌、银行账户、银行系统三者之间的绑定。动态令牌与银行系统之间是通过银行账户而联系在一起的,如图4-10所示。

图4-10 动态令牌绑定关系

虽然存在绑定,但是设备并没有联网,服务器又是如何校验动态口令的正确性的呢?这就要了解TOTP( Time-Based One-Time

Password Algorithm,基于时间的一次性密码算法)技术。

动态令牌设备本身是有电源和芯片的,其中包含时钟设备,虽然与银行服务器无法保持百分之百的同步,但是差别不会很大。如图4-11 所示,动态口令设备在制作时就写入了固定的密钥,每个用户的密钥均不相同,借助特定的哈希算法就可以计算出动态口令。因此,动态口令的计算公式可以简写为Hash(设备时间+用户密钥)=动态口令。

图4-11 动态口令生成

使用动态口令的登录流程如图4-12所示。

(1)用户在个人网银页面录入用户名、密码,点击“登录”按钮。(2)银行服务器校验用户名和密码是否匹配。

(3)     如果用户名和密码匹配,则返回验证通过,并要求用户录入动态口令。

(4)     用户从动态口令设备上查看动态口令,并录入系统中提交。

(5)     客户端将动态口令提交给银行服务器。

(6)     这一步最为重要。服务器根据当前的用户信息,找到用户所绑定的设备唯一编码,取出设备密钥,并根据当前服务器的时间,通过哈希算法计算出动态口令,即Hash(服务器时间+用户密钥)=动态口令。使用服务器计算出的动态口令,与用户提交的动态口令进行比对,如果匹配,则流程继续。

(7)     给客户端返回登录成功。

图4-12 使用动态口令的登录流程

注意无论是电子口令设备还是服务器,都要保证在同一个时间窗口内计算的口令是相同的,这个时间窗口就是刷新时间,如1分钟。那么,在这1分钟之内,电子口令设备和服务器计算出的密钥都应该是相同的,这样两者才能够相互匹配。

因此,时间窗口越长,越便于用户录入,时间窗口越短则越安全,一般时间窗口设置为30秒或1分钟。

4.3.3 语音验证码登录注册设计

语音验证码登录是手机验证码的变种,为了解决验证码各种收不到而导致的用户体验问题,可以使用语音验证码作为补充手段。当短信验证码收不到时,用户可以选择使用语音验证码。

App语音验证码登录注册原型如图4-13所示。当用户录入完手机号,点击“语音验证码”按钮时,将会提示用户注意收听来自×××的电话,从而获取验证码。

图4-13 App语音验证码登录注册原型

语音验证码采用机器人主动拨打的方式,一般话术为“您本次业务办理的验证码为××××”,反复播放三次。

思考:语音验证码是如何发送出去的呢?如何主动给用户拨打电话?

下面通过阿里云的语音验证码服务来进行讲解。如图4-14所示,云通信是阿里云的语音通信产品。接入方将语音模板发送给云通信系统,云通信系统请求运营商完成语音呼叫,当用户接通电话时,通过

TTS技术将文字内容转化为语音播放给用户。

图4-14 语音验证码发送流程

TTS是人机对话的一部分,也就是文字转语音技术。

语音模板“尊敬的阿里云用户您好,您的验证码是${vericode}。”,其中${vericode}为变量部分,由接入方系统生成并传入。

思考:用户接听到语音验证码,然后将验证码录入App中,那么服务端是如何验证验证码的正确性呢?

如图4-15所示,语音验证码登录注册的整个过程可以分为3个阶段。

图4-15 语音验证码登录注册流程

1.语音验证码播报阶段

用户录入手机号,点击“语音验证码”按钮,App携带手机号请求服务端,服务端生成数字验证码,并将验证码和语音模板ID一同发送给语音服务商(模板一般是在第三方语音服务商平台上先行申请定

义)。语音服务商将验证码与模板内容进行拼装,形成最终的话术。然后通过运营商给用户拨打电话,用户接通电话后,播放TTS语音。

2.验证码验证阶段

用户将收听到的语音验证码录入App中,提交给服务端,服务端与事先存储好的验证码进行比对,验证其有效性。如果有效,则完成登录/注册流程。

3.回执阶段

回执分为两种,一种是异步回执,另一种是同步回执。回执的目的是将语音播报的结果通知给服务端。回执信息包含用户电话号码、播报ID、播报状态(成功、失败)等。如果时效性要求较高,则应该使用同步回执,播报完毕后,语音服务商会主动回调服务端接口完成通知。

异步回执主要是通过批处理定时回调通知,或者MQ通知的方式完成,主要目的是进行数据同步和订单对账。


评论