2FA 概念

认证即确认用户身份,密码是最常见的认证方法,但易泄露。双因素认证(2FA)通过密码以外的其他因素提升安全性。

常见认证因素:

  • 秘密信息(如密码);
  • 个人物品(如身份证、U 盾);
  • 生理特征(如指纹、虹膜)。

因素越多,安全性越高。多因素认证(MFA)可进一步提升安全。

2FA 认证方案

常见方案:

  • 密码 + 物理设备(如 U 盾);
  • 密码 + 手机短信验证码(易被拦截和伪造,见);
  • 密码 + 一次性密码(OTP)。

OTP 公开协议、强算法,难以泄露和重放,是主流 2FA 方案。

OTP 类型:

  • HOTP:基于计数器,RFC4226;
  • TOTP:基于时间,RFC6238(主流)。

TOTP 原理与实现

TOTP 步骤:

  1. 用户开启 2FA,服务器生成密钥;
  2. 用户保存密钥到生成器(扫码或手动);
  3. 登录时,客户端用密钥和当前时间戳生成哈希(有效期 30 秒),提交服务器;
  4. 服务器用密钥和时间戳生成哈希比对。

算法:

  • 时间计数器 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 缺点

最大问题是账户恢复。密钥丢失后需备用哈希或其他恢复方式,否则存在安全隐患。

参考链接