身份认证
这里所说的身份认证,指的是狭义上的在计算机及其网络系统中确认操作者身份的过程,从而确定用户是否具有访问或操作某种资源的权限。
之所以要在互联网中进行身份认证,是为了防止攻击者假冒你的身份在系统中进行不利于你的操作。试想一下,万一哪天早晨起来你发现你的支付宝账号被盗了,你余额宝里的钱全没了,那岂不是亏大了。
只不过,和现实世界不同的是,网络世界中一切信息都是用一组特定的数据来表示的,计算机只能识别用户的数字身份,所以对用户的授权本质上就是针对用户数字身份的授权。
因此,如何保证操作者的物理身份和数字身份相对应,就成了一个至关重要的议题了,身份认证也因此在互联网世界中起着举足轻重的作用了。本文将会介绍目前很多网站常用的一种方式——双因素认证(也叫两步验证,英语:Two-factor authentication,缩写为 2FA)。
双因素认证 2FA
虽然网络世界和真实世界对于身份的表示不尽相同,但是对于身份认证的手段与经验是可以相互借鉴的。在真实世界,对用户的身份认证基本依据可以分为这三种:
上述三种认证依据被称为三种「因素」(factor)。因素越多,证明力就越强,身份就越可靠。
因此,在网络世界中,为了达到更高的身份认证安全性,某些场景会将上面 3 种挑选 2 种混合使用,即双因素认证。
在支付宝还没有在中华大地普及的时候,去银行通常需要准备一个叫「U 盾」的东西,在使用网上银行时,用户需要先插上 U 盾,然后再输入密码才能登录网上银行。在这一操作中,U 盾(you have)+密码(you know)这两种因素组合在一起就构成了一个双因素认证。
只是后来,随着移动互联网的普及,手机渐渐成为最离不开人身边的物品了,于是传统的「U 盾+密码」的组合方案就被「手机+密码」的组合替代了。
现如今,短信验证码在国内已经成为使用最广泛的两步验证方法之一了,虽然操作方便,不需要安装额外的 APP,但是验证码的下发依赖网络和运营商信号,有被窃听的风险。试想一下,如果这种验证码的获取不需要依赖运营商和网络,哪怕手机处于飞行模式也可以获取验证码,那么安全性是不是就得到提升了?
而这也就是下面将要说的 TOTP,即**“基于时间的一次性密码(Time-based One-time Password)”**。这是目前公认的可靠解决方案,已被纳入国际标准。
TOTP
流程
TOTP 的流程如下:
- 服务器随机生成一个的密钥,并且把这个密钥保存在数据库中。
- 服务端将该密钥下发,通常是在页面上显示一个二维码,内容中包含密钥。
- 客户端扫描二维码,把密钥保存在客户端。
- 客户端每 30 秒使用密钥和时间戳通过 TOTP 算法生成一个 6 位数字的一次性密码
其实利用 TOTP 验证的流程很简单,这里也只是介绍,如果想深入了解 TOTP 算法的具体实现过程,可以参考 👉 TOTP: Time-Based One-Time Password Algorithm
通过这种方式生成一次性验证码,除去第一次获取服务器下发的密钥外,对网络并无其他要求了,这样即使是在离线情况下也可以使用,而且由于由于这种动态生成的密码通常只会存在 30s,安全性也得到了较大的提升。
只是在实际过程中,肯定要额外考虑一些情况,比如如果有人想要暴力破解验证码时,我们可以对验证的错误次数进行限制;抑或是手机端时间和服务器时间不同步,我们需要通过算法的方式兼容服务器时间的前后 30s,从而有效的避免细微时间上差异而导致的验证失败。
使用现状
目前 TOTP 验证 App 主要分为两类:“独占类”和“开放类”。所谓独占类指的是只支持自家账户登录的两步验证,比如 QQ 安全中心、Steam 验证令牌等。开放类则是一个纯粹的两步验证 App,通过一个 App 去作为多个网站的验证器,例如 Google authenticator
就是一个开源的基于 TOTP 原理实现的一个生成一次性密码的工具。
Google Play Store 上就有许多第三方的基于 TOTP 原理实现的一次性验证码工具,只是由于国内用户使用习惯的问题,除非在一些特殊场合,例如找回密码时会用到 TOTP 验证外,其他大多数情况还是会使用短信验证码的方式,这也算国内外使用习惯的差异了。
总结
总的来说,基于 TOTP 机制的两步验证 APP 有着比短信验证码高得多的安全性和相媲美的便利性,是一种能保障用户财产安全的工具。只是在登录时会多一步,费时且麻烦,可能会引起用户的不适。只是在重要数据面前,还是尽量使用两步验证吧,不然和 AntDesign 一样丢了代码库可就不好了。
以上就是本文的全部内容了,新年已到,想必大家也都已经复工了,在这里祝大家新年快乐,牛年大吉 🐂。如果你觉得我的文章对你有所帮助,还希望在新的一年里可以继续支持「01 二进制」,你们的支持是我更新原创的最大动力!