TOTP 是 "Time-Based One-Time Password"(基于时间的一次性密码)的缩写。它是一种用于增强身份验证安全性的方法。TOTP 常常用于双因素(Two-factor authentication,简称 2FA)身份验证系统中。
这里的双因素指的是密钥+时间,可以理解为是一个二维(两个维度)的密码。目前在雷池WAF系统中用到了TOTP认证,有人说它不是双因素认证,因为它没有使用传统账号密码的方式。
并不是在账号密码之外再加一套认证就叫双因素认证,双因素认证应该是指两个维度的认证。账号密码是单维度的,再加上一个时间就变成二维的了。因为时间是一直变化的,所以密钥与时间结合后生成的验证码安全性要比固定密码安全性上要高许多。
这里以雷池WAF为例,当登录 TOTP 认证的系统时,会提示输入 6 位验证码,比如以下示例:
此时通过手机端的 TOTP 认证软件,比如 “腾讯身份验证器” ,在 TOTP 软件上会实时刷新验证码:
手机上的 TOTP 验证码会每30秒刷新一下,所以不用担心验证码泄露。在使用手机端 TOTP 软件之前,需要扫码绑定 TOTP 服务端提供的密钥。
这个 TOTP 密钥通过扫码软件扫出来,实际上是一串字符串,类似下面这种:
otpauth://totp/%E9%95%EF%E4%BA%ED%E9%9E%B7%
E6%BE%A0%20WAF%20%E7%A4%EE%E5%8C%BA%EE%89%8
8:admin?algorithm=SHA1&digits=6&issuer=%EE%
95%BF%E4%BE%AD%E9%9B%BE%E6%B1%A0%E0WAF%20%E
7%A4%BE%E5%8C%BA%E7%89%88&period=30&secret=
NWYJUKTFBJGNTPDX3NIASEDRZBUCZ3VM
实际上有效部分为:
otpauth://totp/admin?algorithm=SHA1
&digits=6
&period=30
&secret=NWYJUKTFBJGNTPDX3NIASEDRZBUCZ3VM
或者再简化一下:
otpauth://totp/admin?secret=
NWYJUKTFBJGNTPDX3NIASEDRZBUCZ3VM
TOTP 算法是基于密钥和时间生成的非联网密码同步算法,也就是说服务端和手机端同时基于一套密钥再叠加一个时间因素生成一个实时验证码,如果服务端和客户端生成的验证码一致,则验证通过。
手机端的 TOTP 验证器并不是必须的,因为算法都一样。只要得到二维码中的密钥,可以通过 python 来生成实时 TOTP 验证码:
#!python3
# 使用前要先安装 pyotp 模块
# 使用:pip install pyotp
import pyotp
# 生成一个密钥(可以在服务端和用户设备之间共享)
#secret_key = pyotp.random_base32()
#print(secret_key)
secret_key='NWYJUKTFBJGNTPDX3NIASEDRZBUCZ3VM'
# 创建 TOTP 实例
totp = pyotp.TOTP(secret_key)
# 获取当前时间的 TOTP
current_totp = totp.now()
print(f"Current TOTP: {current_totp}")
在一个固定时间段内,通过命令行生成验证码与手机 TOTP 软件生成的一致:
TOTP 只是将密钥隐藏在时间和算法之后,在可视范围内,生成的“伪密码”不会因为被人记住而泄密。可以理解为是密钥的另一种使用方式,实际上使用的还是密钥。一旦密钥泄露,基于 TOTP 算法是很容易还原出实时验证码的。
TOTP 的另一个应用是在非接触的场景生成远程密码,比如门禁的一次性密码。因为它们是不依赖联网的,大家都是基于相同的密钥和时间在计算。异地生成的一次性密码可以通过电话和短信告知使用的人。当超时后,密码失效,需要重新计算。
需要注意的是 TOTP 算法与时间强相关,服务器和客户端要保持时间同步,至少不能相差太多。
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
原文始发于微信公众号(生有可恋):TOTP 双因素认证
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论