首页/安全/等保与合规速查/FIDO2 / WebAuthn:抗钓鱼的认证方式
密码与认证合规50 条

FIDO2 / WebAuthn:抗钓鱼的认证方式

FIDO2(WebAuthn + CTAP2)使用公私钥凭据取代共享口令:私钥保存在认证器,服务端只存公钥,天然抵抗钓鱼与撞库,可作为密码技术鉴别选项之一。

等保与合规速查安全更新于 2026-10-13

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 版本。
同一账号建议注册两把密钥(主用 + 备用)并妥善保管恢复码;只注册一把,密钥丢失即等于账号锁死,只能走人工核验流程。

易错点

  • 放宽 origin 或 rpId 校验(例如为了兼容多域名而通配):抗钓鱼能力直接失效,等于把 FIDO2 降级成普通签名
  • 把 WebAuthn 当作高敏场景的唯一因素且不留恢复路径:认证器损坏或丢失后账号无法找回,业务中断
  • challenge 复用或由前端生成:攻击者可重放断言,认证信任链断裂
  • 忽略签名计数器检查:认证器被克隆时无法察觉(平台认证器计数器常恒为 0,需按类型区别处理)

数据来源与参考

  • W3C WebAuthn 标准
  • FIDO Alliance 规范文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌