双因素认证 2FA
第一次听到 2FA 这个缩写名词是 GitHub 宣布,到 2023 年底,所有用户都必须要启用双因素身份验证 (2FA),不能只用密码登录 Github 啦。
而听到双因素认证国内用户应该非常熟悉,就是各种账户要求输入短信验证码进行二次认证(双重认证),来确保你确实为账号拥有者。
相比短信验证码我们更熟悉的二次验证的方式是使用 ATM 机取钱,此过程中你需要插入银行卡再输入密码才能登录 ATM 机取钱。而网上银行则使用 U 盾(带 USB 接口的银行卡),用户插上 U 盾,再输入密码,才能登录网上银行。所以二次认证方式属于设备认证,以硬件实体作为令牌的(硬件级保障)。
1. 前言
在上面讲到的设备级认证中除了短信验证方式之外,需要使用额外的认证设备银行卡或 U 盾,但是随时携带额外的不通用的认证设备是不便的,10 个银行使用需要额外携带 10 张额外银行卡,所以手机才是最好的替代品。手机与密码就成了最佳的双因素认证方式。
其中短信验证码,这种方式很好理解,就是只有账号绑定的手机号能够收取到验证码,所以能够输入正确验证码的一般就是本人了,除非短信被人获取或伪造。
除了短信验证码这种方式,还有一种 TOTP 的概念,下面详细来讲解一下 TOTP 的实现方式。
2. TOTP
TOTP 的全称是 “基于时间的一次性密码”(Time-based One-time Password),它是公认的可靠解决方案,已经写入国际标准 RFC6238 中。
(1) 第一步,用户开启双因素认证后,服务器生成一个密钥,再将密钥内容以二维码方式呈现在用户面前。

(2) 第二步,服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥。
(3) 第三步,用户登录时,手机客户端使用这个密钥和当前时间戳,生成一个哈希(Hash),有效期默认为 30 秒。用户在有效期内,把这个哈希提交给服务器。

(4) 第四步,服务器也使用密钥和当前(30 秒内)时间戳,生成一个哈希,跟用户提交的哈希比对,只要两者不一致,就拒绝登录。
注意:密钥必须跟手机绑定,一旦用户更换手机,就必须生成全新的密钥,同时密钥只能用于加密不能解密,所以即使密钥被获取也不影响安全。
3. TOTP 算法
仔细看上一节的第四步骤,你可能会有一个问题,就是手机客户端和服务器,如何保证 30 秒期间都得到同一个哈希呢?答案就是下面的公式:
T C = f

最低0.47元/天 解锁文章
2300

被折叠的 条评论
为什么被折叠?



