🗒️双因素认证(2FA)
2023-12-6
| 2024-3-1
0  |  阅读时长 0 分钟
tags
type
status
date
slug
summary
category
password
icon
😀
我们常说的认证(authentication)就是在确认用户的身份,是在进行重要操作时的必要手段,譬如网站登录、银行取现等。
使用密码是生活中最常见的认证手段,但是密码是单一因素,不安全,并且很容易被泄露和冒充。今天我们来学习一种更安全的认证方式——双因素认证。
 

双因素认证的概念

双因素认证(Two-factor authentication,简称 2FA),想要了解2FA,我们首先要知道双因素是指什么。
这里的因素是指证明一个人身份的证据,一般来说可以被分为三种证据。
  • 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码。
  • 个人物品:该用户的私人物品,比如身份证、钥匙。
  • 生理特征:该用户的遗传特征,比如指纹、相貌、虹膜等等。
认证时使用因素越多,越能证明这个人的身份,身份也就越可靠。
回到我们今天所说的「双因素认证」,就能很清晰地明白含义了,即认证时需要同时两个因素的证据才能通过。譬如:银行卡就是生活中最常见的双因素认证。用户必须同时提供银行卡和密码,才能在ATM取出现金。

双因素认证方案

常用的双因素组合是密码 + 某种个人物品,比如网上银行的 U 盾。用户插上 U 盾,再输入密码,才能登录网上银行(现在几乎不再使用 U 盾了,U 盾实物见下图)。
U盾
U盾
但是,用户不可能随时携带 U 盾,手机才是最好的替代品。密码 + 手机就成了最佳的双因素认证方案。很多网站也有这样的要求,在登录账户时,用户通过账号密码登录后,仍需要提供短消息发送的验证码,以证明用户确实拥有该手机。
但是,短消息是不安全的,容易被拦截和伪造,SIM 卡也可以克隆。已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。
因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP
 

TOTP 介绍

TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238
它的步骤如下。
第一步,用户开启双因素认证后,服务器生成一个密钥。
第二步:服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥。
注意,密钥必须跟手机绑定。一旦用户更换手机,就必须生成全新的密钥。
第三步,用户登录时,手机客户端使用这个密钥和当前时间戳,生成一个哈希,有效期默认为30秒。用户在有效期内,把这个哈希提交给服务器。
第四步,服务器也使用密钥和当前时间戳,生成一个哈希,跟用户提交的哈希比对。只要两者不一致,就拒绝登录。
 

TOTP 算法

仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢?
答案就是下面的公式。
TC = floor((unixtime(now) − unixtime(T0)) / TS)
上面的公式中,TC 表示一个时间计数器,unixtime(now)是当前 Unix 时间戳,unixtime(T0)是约定的起始时间点的时间戳,默认是0,也就是1970年1月1日。TS 则是哈希有效期的时间长度,默认是30秒。因此,上面的公式就变成下面的形式。
TC = floor(unixtime(now) / 30)
所以,只要在 30 秒以内,TC 的值都是一样的。前提是服务器和手机的时间必须同步。
接下来,就可以算出哈希了。
TOTP = HASH(SecretKey, TC)
上面代码中,HASH就是约定的哈希函数,默认是 SHA-1。

TOTP 分类

TOTP 有硬件生成器和软件生成器之分,但都是采用上面的算法。TOTP 硬件生成器实物如下图,而TOTP 软件生成器目前市面上有Google Authenticator、Microsoft authenticator、Tofu Authenticator等,界面如下图。
硬件生成器
硬件生成器
软件生成器
软件生成器

📎 参考文章

 
  • 技术分享
  • Windows系统公网远程控制苹果MacOS电脑【使用Mac自带VNC远程】付鹏《逆潮时代:人口、财政变化趋势及大类资产展望》
    目录