2FA 概念
认证即确认用户身份,密码是最常见的认证方法,但易泄露。双因素认证(2FA)通过密码以外的其他因素提升安全性。
常见认证因素:
- 秘密信息(如密码);
- 个人物品(如身份证、U 盾);
- 生理特征(如指纹、虹膜)。
因素越多,安全性越高。多因素认证(MFA)可进一步提升安全。
2FA 认证方案
常见方案:
- 密码 + 物理设备(如 U 盾);
- 密码 + 手机短信验证码(易被拦截和伪造,见);
- 密码 + 一次性密码(OTP)。
OTP 公开协议、强算法,难以泄露和重放,是主流 2FA 方案。
OTP 类型:
- HOTP:基于计数器,RFC4226;
- TOTP:基于时间,RFC6238(主流)。
TOTP 原理与实现
TOTP 步骤:
- 用户开启 2FA,服务器生成密钥;
- 用户保存密钥到生成器(扫码或手动);
- 登录时,客户端用密钥和当前时间戳生成哈希(有效期 30 秒),提交服务器;
- 服务器用密钥和时间戳生成哈希比对。
算法:
- 时间计数器 TC = floor((unixtime(now) − unixtime(T0)) / TS)
- TOTP = HASH(SecretKey, TC)
TOTP 客户端
常见软件:
- Google Authenticator
- Microsoft Authenticator
- FreeOTP
Python 实现 TOTP/HOTP
推荐 PyOTP 库。
安装:
pip install pyotp
TOTP 示例:
import pyotp
totp = pyotp.TOTP('base32secret3232')
totp.now() # 当前验证码
totp.verify('492039') # 验证
HOTP 示例:
import pyotp
hotp = pyotp.HOTP('base32secret3232')
hotp.at(0) # 计数器为 0 时的验证码
hotp.verify('316439', 1401) # 验证
生成 base32 密钥:
pyotp.random_base32()
生成 Google Authenticator 兼容链接:
totp = pyotp.TOTP('JBSWY3DPEHPK3PXP')
totp.provisioning_uri("[email protected]", issuer_name="Secure App")
2FA 缺点
最大问题是账户恢复。密钥丢失后需备用哈希或其他恢复方式,否则存在安全隐患。