FIDO/WebAuthn
本文约需 2 分钟阅读
FIDO (Fast IDentity Online) 和 WebAuthn 是为实现不依赖密码的身份验证而制定的国际标准规范。通过将 FIDO Alliance 制定的技术规范与 W3C 作为 Web 标准推荐的 WebAuthn API 相结合,可以从浏览器和应用程序中使用基于公钥密码的身份验证。它在设计上就内置了对钓鱼攻击的抵抗力,且不把密码托付给服务器,因此可以减少密码泄露转化为实际损害的途径。
FIDO Alliance 的成立与规范的演进
FIDO Alliance 于 2012 年 7 月由 PayPal 、 Lenovo 、 Nok Nok Labs 、 Validity 、 Infineon 、 Agnitio 共同组建 (对外正式发布是在 2013 年 2 月)。Alliance 自述其成立目的在于解决各种强认证技术之间缺乏互操作性的问题,以及减轻用户创建和记忆大量用户名与密码的负担。 2014 年 12 月 9 日,作为 FIDO 1.0 公布了两项规范的最终版。 UAF (Universal Authentication Framework) 面向通过生物识别等方式实现的无密码登录, U2F (Universal 2nd Factor) 面向通过 USB 或 NFC 连接的认证器 (安全密钥) 实现的双因素身份验证。
此后,把 W3C 的 WebAuthn API 与 FIDO Alliance 的 CTAP (Client to Authenticator Protocol) 组合起来的 FIDO2 工作不断推进, WebAuthn 于 2019 年 3 月 4 日成为 W3C 建议 (正式的 Web 标准)。WebAuthn 是浏览器端的 API 规范, CTAP 是与认证器 (安全密钥或生物识别设备) 之间的通信协议。这两者的结合使得可以从 Web 浏览器直接使用硬件认证器。此后自 2022 年起,作为通行密钥将 FIDO2 认证信息进行云同步的机制已在主要操作系统和凭据管理器中实现,即使没有专用物理密钥的用户也能使用。
基于公钥密码的认证流程
FIDO/WebAuthn 的认证以质询-响应方式工作。在传统的密码认证中会将“秘密字符串”发送到服务器,而在 FIDO 中送往服务器的并不是私钥本身,而是对质询的签名。基本构成是把私钥保留在认证器内部;像通行密钥那样同步到多台设备的形态,则会依据凭据管理器的实现以加密状态进行同步。
在这种方式下,服务器端保存的是公钥和认证信息的标识符等,并不保存认证秘密本身。即使服务器遭到入侵,以目前已知的方法也无法在现实的时间内从公钥求出私钥,因此数据泄露本身并不会直接导致认证信息被滥用。
抗钓鱼机制 - 来源验证
FIDO/WebAuthn 之所以能抵抗钓鱼,最大的原因在于认证过程中内置了来源 (域名) 验证。浏览器会把发起认证请求的来源记录在 clientData 中,认证器则对包含该数据哈希与 RP ID (服务的域名) 哈希的值进行签名。由于服务器会核对收到的来源是否与自己期望的一致,即使攻击者在伪造网站 (例如 examp1e.com) 上要求用户认证,也无法直接挪用为正规网站 (example.com) 注册的认证信息。即使用户被骗访问了伪造网站,认证也不会成立,钓鱼得以成立的空间大幅缩小。不过,如果仍保留密码等其他认证方式作为回退手段,攻击者仍可能转而针对这些方式。这在探讨通行密钥迁移的挑战时也是一个重要视角。
与通行密钥的关系
通行密钥是 FIDO2/WebAuthn 的一种实现形态。技术上是相同的基于公钥密码的认证,但通行密钥与传统 FIDO2 不同之处在于可以通过云将认证信息同步到多台设备。传统的 FIDO2 安全密钥与物理设备绑定,因此丢失时的恢复是一个难题。同步型通行密钥通过 iCloud 钥匙串、 Google 密码管理器等凭据管理器,让同一个通行密钥可在多台设备上使用,以此应对这一课题。另一方面,可同步的范围由各凭据管理器的提供方决定,把密钥的保管交给提供方这一点仍是与物理密钥的差异。与生物识别认证结合后,只需与解锁设备相同的操作即可登录。
支持状况与实务考量
Chrome 、 Safari 、 Firefox 、 Edge 等主要浏览器均已支持 WebAuthn API (具体的支持范围会因版本和操作系统而异,实施前请查阅各浏览器的资料)。在操作系统层面, Windows Hello 、 macOS / iOS 的 Touch ID / Face ID 、 Android 的生物识别都可作为 FIDO2 认证器使用。在企业部署中,也有把 YubiKey 等硬件安全密钥用作多因素认证手段的构成。
作为实务上的注意事项,引入 WebAuthn 还需要服务器端的配合。需要实现生成质询、保存公钥、验证签名的逻辑,而处理这些步骤的库 (如 SimpleWebAuthn 、 py_webauthn 等) 已经公开,可用来替代自行编写验证处理。此外,掌握加密的基础知识,尤其是理解公钥密码的原理,在排查问题时会很有帮助。同时了解生物识别认证的风险和两步验证的基础,就能看清认证设计的整体面貌。
这篇文章对您有帮助吗?