双因素认证TOTP原理

双因素认证 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 l o o r ( ( u n i x t i m e ( n o w ) − u n i x t i m e ( T 0 ) ) / T S ) TC = floor((unixtime(now) − unixtime(T0)) / TS) TC=floor((unixtime(now)unixtime(T0))/TS)

上面的公式中,TC 表示一个时间计数器,其中 unixtime(now) 是当前 Unix 时间戳,而 unixtime(T0) 是约定的起始时间点的时间戳,默认是 0,也就是 1970 年 1 月 1日。TS 则是哈希有效期的时间长度,默认是 30 秒。因此上面的公式就变成下面的形式:

T C = f l o o r ( u n i x t i m e ( n o w ) / 30 ) TC = floor(unixtime(now) / 30) TC=floor(unixtime(now)/30)

所以,只要在 30 秒以内,TC 的值都是一样的。前提是服务器和手机的时间必须同步。接下来,就可以算出哈希了,哈希计算方式是约定的哈希函数 SHA-1

T O T P = H A S H ( S e c r e t K e y , T C ) TOTP = HASH(SecretKey, TC) TOTP=HASH(SecretKey,TC)

4. 自制 TOTP

TOTP 很容易写,各个语言都可以实现,只要遵循上一节的计算方式,读取电脑上的时间戳转化为 Unix 标准时间戳,套用公式,再调用哈希函数 SHA-1,哈希生成一般有标准库可以使用,生成 TOTP,再使用打印函数输出即可。

5. TOTP 缺点

(1) 双因素认证的优点在于,比单纯的密码登录安全得多。就算密码泄露,只要手机还在,账户就是安全的。各种密码破解方法,都对双因素认证无效。

(2) 缺点在于,登录多了一步,费时且麻烦,用户会感到不耐烦。而且也不意味着账户的绝对安全,入侵者依然可以通过盗取 cookie 或 token,劫持整个对话。

(3) 双因素认证还有一个最大的问题,那就是帐户的恢复。一旦忘记密码或者遗失手机,想要恢复登录,势必就要绕过双因素认证,这不就又形成了一个安全漏洞。

6. 总结

TOTP 认证没有规定需要使用哪种 APP,只要遵循了通一个标准即可,并且都是通用的,一个 APP 可以用于多个使用了 TOTP 验证的平台认证,所以可以使用 F2AS

APP,Authy,Google Authenticator 等等 ,还有可以使用开源的甚至自制。

详细查看:

https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

https://zhuanlan.zhihu.com/p/380881406

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值