WebAuthn与TOTP:2019年正确实现2FA
自2019年3月起,Trail of Bits团队与Python软件基金会合作,在支撑PyPI的Warehouse代码库中实现了双因素认证(2FA)。目前PyPI已支持基于时间的OTP(TOTP)和WebAuthn(测试版)两种认证方式。
2FA的本质与误区
实施双因素认证前,必须明确以下技术要点:
- 第二因素不应是可知识信息:认证要素应该是用户拥有或固有的特征,而非用户知晓的信息
- 不可替代第一因素:WebAuthn是例外,因其更强的安全保障可单独作为认证因素
- 安全等级可排序:WebAuthn始终优于TOTP,系统应优先提示用户使用更安全的认证方式
- 认证顺序不可逆:不应在验证第一因素前要求第二因素,这会导致用户混淆
- 恢复代码设计:应提供可选的恢复代码机制,但需明确告知其会绕过2FA安全机制
用户行为模式与技术应对
技术用户(如PyPI维护者)常出现以下可能破坏2FA安全的行为:
风险行为 | 技术风险 | 解决方案 |
---|---|---|
截图保存TOTP二维码 | TOTP密钥泄露 | 文档警示用户勿保存二维码 |
多设备共用TOTP | 扩大攻击面 | 文档建议仅配置单一设备 |
使用可导出明文的TOTP应用 | 密钥管理不安全 | 推荐不支持明文导出的应用 |
错误扫描二维码 | 丢失第二因素 | 要求输入有效TOTP码完成配置 |
删除TOTP密钥 | 账户锁定 | 文档警告并提供应用建议 |
桌面保存恢复代码 | 绕过第二因素 | 恢复代码设为可选并建议打印保存 |
WebAuthn与TOTP技术对比
对称与非对称加密实现
TOTP采用对称加密方案,存在以下技术特点:
- 客户端与服务器共享密钥
- 实现简单但存在安全局限:
- 安全性依赖存储环境
- 缺乏设备身份标识
- 无原生防重放机制
- 6-8位编码可能存在暴力破解风险
WebAuthn采用非对称加密,具有以下技术优势:
- 客户端生成密钥对,公钥发送至服务器
- 包含设备身份标识(凭证ID)
- 内置防重放和防克隆保护
- 包含源信息和安全上下文保证
实施成本差异
- TOTP:多平台免费应用支持Google的otpauth URI标准
- WebAuthn:多数用户需购买安全密钥(25-50美元),但未来移动设备可能原生支持
技术实现建议
-
避免重复造轮子:
- TOTP推荐使用PyCA的hazmat.primitives.twofactor等成熟实现
- WebAuthn可参考Duo开源的Go/Python库
-
参考实现案例:
- 可研究Warehouse代码库中的TOTP和WebAuthn实现
- 支持多WebAuthn密钥,即将添加可选恢复代码功能
-
淘汰不安全方案:
- 应逐步淘汰SMS/语音验证码
- 对新用户禁用传统方案
- 对仍使用传统方案的用户加强日志监控
通过合理的技术选型和实现,可以构建既安全又用户友好的双因素认证系统。WebAuthn作为新兴标准提供了更强的安全保障,而TOTP则保持了良好的可用性,两者结合能为不同需求的用户提供灵活的认证选择。