双因素认证的几种形态:TOTP、短信与硬件密钥
晴空白T
6 min read
双因素认证(2FA)不是"多输一次密码"那么简单,它的安全强度完全取决于第二因子的抗篡改性。选错形态,2FA 可能只挡住了最弱的攻击者,对针对性入侵几乎无效。
三种形态的本质差异
认证因子通常分三类:你知道的(密码)、你拥有的(设备/密钥)、你固有的(生物特征)。2FA 要求跨至少两类。下面三种都属于"你拥有"这一类,但信任根不同,抗钓鱼能力差异巨大。
| 形态 |
信任根 |
典型威胁 |
抗钓鱼能力 |
| TOTP |
共享密钥 + 时间窗口 |
设备被植入木马、seed 泄露 |
弱 |
| 短信 |
手机号 + 运营商 |
SIM 换绑、短信拦截 |
弱 |
| 硬件密钥 |
非对称密钥 + 物理触碰 |
需物理接触设备 |
强 |
判断标准很直接:攻击者能否在不接触你实体的情况下拿到第二因子。能,则弱;不能,则强。
TOTP:便利与隐患并存
TOTP 基于 RFC 6238。服务端和客户端各持一份密钥 seed,按 30 秒窗口对当前时间做 HMAC-SHA1,双方独立算出同一串数字:
import hmac, hashlib, struct, time
def totp(secret: bytes, step: int = 30, digits: int = 6) -> str:
counter = int(time.time()) // step
msg = struct.pack(">Q", counter)
h = hmac.new(secret, msg, hashlib.sha1).digest()
o = h[-1] & 0x0F
code = (struct.unpack(">I", h[o:o+4])[0] & 0x7FFFFFFF) % (10 ** digits)
return str(code).zfill(digits)
边界条件:客户端时钟漂移超过一个窗口就会验证失败。有些服务为兼容把窗口放宽到前后各一个(共约 90 秒),这确实降低了误拒,但也给拦截到的验证码留出了时间余量。seed 一旦以二维码形式存进手机截图,就等价于把第二因子交给了任何能读到那张图的人。
踩坑:把 TOTP seed 同时写进多个云笔记、用同一张截图多处备份,会让"你拥有"退化成"你知道的密码被到处复制"。正确做法是把 seed 只放进受主密码保护的密码管理器,导出备份时加密离线保存。
短信验证码:最易被降级的因子
短信的信任根是手机号,而手机号的控制权在运营商侧。经验上,社工换绑、伪基站、以及部分地区的短信拦截服务,都能让短信因子失效。它最大的问题是:攻击者不需要接触你的设备,只要拿到号码控制权即可完成重置。
短信仍比纯密码强,但不该作为高价值账户(例如资金账户、主邮箱)的唯一第二因子。若某系统仅提供短信这一种 2FA,应把该账户关联的主邮箱也启用更强的因子,形成纵深。
硬件密钥:基于非对称密码的强形态
硬件密钥(支持 FIDO/U2F 的实体设备)把私钥封在芯片里,每次认证需用户物理触碰,且私钥永不离开设备。协议层做"来源绑定":签名的挑战值包含请求方的 origin(域名),钓鱼网站拿到的签名对真实站点无效——这是它抗钓鱼的根本原因。
注册:设备生成 (pub, priv),priv 留在芯片内,pub 交给服务端
登录:服务端下发 challenge + 允许的 origin
设备校验 origin 与注册时来源一致
用户触碰 → 用 priv 对 challenge 签名返回
服务端用 pub 验签
边界条件:硬件密钥会丢、会坏,必须至少登记两支并分散存放。支持 resident key(可发现凭据)的密钥能省去输用户名环节,但设备丢失后恢复成本更高,需配合备用因子使用。
恢复码才是真正的兜底
无论选哪种第二因子,都必须先生成"恢复码"——一组一次性备用码。把它离线打印或存进密码管理器,避免第二因子本身成为单点故障。经验上,真正把人锁在门外的,往往不是攻击,而是只设了 2FA 却没备份恢复路径。
普通账户的折中方案:启用 TOTP 并关闭短信作为主因子;高价值账户强制硬件密钥。任何形态下,恢复码和密钥备份都要走离线、加密、分散存放三条线。
2FA 也会失效的边界
硬件密钥虽强,但并非无懈可击。设备丢失且备用因子没设好,会把自己挡在门外;物理胁迫下触碰设备也能完成认证,这是"你拥有"因子的固有局限。TOTP 在设备本身被植入键盘记录或屏幕镜像时同样失效,因为第二因子和第一因子处在同一台被控设备上,攻击者可以同时拿到。
结论很朴素:2FA 提高的是"远程撞库、凭证拖库后复用"这类自动化攻击的门槛,它不防设备本身被控,也不防物理层面的胁迫。把 2FA 当作纵深防御里的一层而不是唯一防线,才是合理的预期。高价值账户仍应叠加设备加密、生物锁、异常登录告警,让单点被突破时还有后续关卡。此外,恢复码本身也要当密钥保管:打印件别贴显示器旁,电子副本走加密。恢复路径的安全等级,决定了你整个 2FA 的下限。
1 view
0 likes
0 comments