FIDO2 是什么
FIDO2 是 FIDO 联盟与 W3C 共同推出的免口令认证标准,由两部分组成:WebAuthn 规定浏览器与网站之间的调用接口,CTAP2 规定认证器与客户端之间的通信协议。它用非对称密钥取代共享口令——注册时认证器在设备内生成密钥对,私钥永不导出,服务端只保存公钥;登录时认证器用私钥对服务端下发的随机挑战签名,服务端用公钥验签。验签会绑定站点的 origin 与 rpId,因此凭据无法被伪造域名复用,这一点是口令加短信验证码做不到的。
基本信息
| 标准组成 | W3C WebAuthn(浏览器 API)+ FIDO CTAP2(认证器协议) |
|---|---|
| 认证器形态 | 平台认证器(Windows Hello、Touch ID、安卓指纹)与跨平台认证器(USB/NFC/蓝牙安全密钥) |
| 私钥位置 | 认证器安全芯片内,不可导出 |
| 服务端存储 | 公钥、凭据 ID、签名计数器、AAGUID |
| 账号恢复 | 需另设恢复码或第二把密钥,标准本身不提供找回 |
| 常见部署 | Chrome/Edge/Firefox/Safari 均已支持,需 HTTPS 或 localhost |
典型使用场景
- 管理员与运维账号登录:把最高权限账号从口令风险中摘出来,避免钓鱼页窃取凭据
- 企业内部单点登录:作为强因素接入统一身份平台,替代短信验证码
- 面向公众的高价值业务(支付、提现、改密)二次确认,降低撞库后的账号接管损失
- 开发者与代码仓库账号:GitHub、GitLab 等平台支持安全密钥作为第二因素
- 无共享密钥的共享终端场景:如产线工位机,用硬件密钥代替写在纸上的口令
注册与登录流程
注册与登录流程
注册(navigator.credentials.create)
服务端生成 challenge + rpId + user.id → 浏览器调用认证器
认证器生成密钥对,返回 attestationObject + clientDataJSON
服务端校验 origin、rpId、challenge,保存公钥与 credentialId
登录(navigator.credentials.get)
服务端下发新 challenge 与 allowCredentials → 认证器用私钥签名
服务端用已存公钥验签,并检查签名计数器是否回退(判断克隆)
要点:challenge 必须一次性且服务端生成;origin 与 rpId 校验不可放宽;
时间窗内不允许同一断言重复提交(防重放)与口令认证对比
| 维度 | 口令 + 短信 | FIDO2 |
|---|---|---|
| 防钓鱼 | 短信可被代理页面实时转发,无法防 | 验签绑定 origin,伪造站点拿到签名也无法复用 |
| 服务端泄露 | 口令散列被撞库即失守 | 服务端只有公钥,泄露不能伪造登录 |
| 用户体验 | 记忆负担与短信延迟 | 指纹或按一下密钥即可 |
| 依赖条件 | 手机号可用 | 认证器遗失需提前配恢复方式 |
WebAuthn Level 2 于 2021 年成为 W3C 正式推荐标准。CTAP2 之上还有 CTAP2.1,新增企业级证明与密钥直连能力,采购硬件密钥时注意其支持的 CTAP 版本。
同一账号建议注册两把密钥(主用 + 备用)并妥善保管恢复码;只注册一把,密钥丢失即等于账号锁死,只能走人工核验流程。