FIDO2 深度解析:WebAuthn、通行密钥与安全实践 (ZH)
一份关于 FIDO2 的技术指南:WebAuthn 和 CTAP 的作用、注册和认证流程、通行密钥、防网络钓鱼、认证、恢复以及部署中可能遇到的陷阱。.
FIDO2 包含两个公钥认证标准:万维网联盟的 Web 认证 API (WebAuthn) 和 FIDO 联盟的客户端到认证器协议 (CTAP)。它们共同允许依赖方注册和使用加密凭证,而无需存储像密码那样可重复使用的共享秘密。
正确实施和验证时,FIDO2 可以提供防网络钓鱼和防重放攻击的认证。它不能证明个人的法定身份,不能决定谁应该被允许注册,不能保护受损的服务器会话,也不能修复弱化的账户恢复流程。这些都是必须围绕认证过程设计的辅助控制措施。
主要收获
- FIDO2 是 WebAuthn 加上 CTAP。WebAuthn 将网站或应用程序连接到客户端;CTAP 将客户端平台连接到漫游认证器。
- 私钥保留在认证器中。依赖方存储公钥,并验证对新挑战和范围化上下文的签名。
- 域绑定产生防网络钓鱼功能。为某个依赖方标识符注册的凭证不能简单地被重放到攻击者不相关的域。
- 通行密钥是 FIDO 凭证。它们可以是设备绑定的,也可以在提供商的设备之间同步,从而带来不同的保障、恢复和可移植性权衡。
- 恢复是安全模型的一部分。如果电子邮件、支持或身份恢复路径可以通过较弱的证据替换凭证,强大的 FIDO2 登录可能会被绕过。
什么是 FIDO2?
FIDO 联盟规范概述将 FIDO2 定义为 W3C WebAuthn 规范和 FIDO 客户端到认证器协议的组合。这些标准将系统划分为协作角色:
- 依赖方:注册凭证和验证认证断言的网站或服务。
- 客户端:通常是实现 WebAuthn 并协调过程的浏览器或操作系统组件。
- 认证器:创建和使用凭证密钥的平台组件或外部设备。
- 用户:同意注册或认证,并可能通过 PIN、密码或生物识别在本地进行验证的人。
W3C WebAuthn Level 3 规范定义了一个用于创建和使用范围限定到依赖方的公钥凭证的 Web API。脚本永远不会收到私有凭证密钥。它们通过认证器和客户端接收结构化数据和加密证明。
FIDO2、WebAuthn、CTAP、U2F 和通行密钥的比较
| 术语 | 实际含义 | 主要边界 |
|---|---|---|
| FIDO2 | WebAuthn 和 CTAP 标准一起使用 | 完整的标准家族,而非一个 API 调用 |
| WebAuthn | 浏览器或客户端 API 以及用于公钥凭证的依赖方数据模型 | 连接依赖方到客户端 |
| CTAP2 | 客户端平台与漫游认证器之间的协议 | 通过 USB、NFC 和 BLE 等传输方式承载外部认证器通信 |
| U2F / CTAP1 | 早期 FIDO 协议,通常与第二因子安全密钥相关联 | 比现代 FIDO2 功能更受限 |
| 通行密钥 | 专为无密码登录设计的可发现 FIDO 凭证 | 可以同步或设备绑定 |
| 安全密钥 | 通过 USB、NFC 或其他支持的传输方式连接的漫游硬件认证器 | 一种可能的认证器形式 |
| 平台认证器 | 内置于设备或操作系统的认证器 | 通常通过本地 PIN 或生物识别激活 |
“无密码”描述的是用户旅程,而不是所有可能的部署。服务可以使用 WebAuthn 作为密码后的第二因子,作为主要的多因子凭证,或与其他认证器一起使用。依赖方必须决定哪些凭证特性和标志符合受保护操作的保障要求。
FIDO2 注册工作原理
注册,也称为凭证创建,将一个新的公钥凭证绑定到依赖方的账户。
1. 服务器创建注册选项
依赖方生成一个新鲜、不可预测的挑战,并将公钥凭证创建选项发送给客户端。选项包括依赖方、用户账户、接受的算法、认证器偏好、认证偏好以及相关时排除的现有凭证标识符。
挑战应该是一次性的、短期有效的、绑定到正确的会话和用户,并且由服务器存储或可验证。仅在浏览器中生成的挑战无法保护服务器过程。
2. 客户端调用 WebAuthn
应用程序使用公钥选项调用 navigator.credentials.create()。浏览器检查来源和安全上下文,然后请求可用的认证器创建凭证。
3. 认证器获取用户同意
认证器需要用户在场,如果请求并支持,还需要用户验证。用户在场可以是触摸或明确操作。用户验证意味着认证器通过 PIN、设备秘密、生物识别或其他支持的方法在本地验证用户。
本地生物识别通常用于解锁凭证的使用;生物识别模板不会作为认证秘密发送到网站。
4. 认证器创建密钥对
认证器创建范围限定到依赖方的凭证密钥对。私钥由认证器或其同步结构保护。生成的凭证包含公钥、凭证标识符、认证器数据、客户端数据以及根据所选格式的认证信息。
5. 服务器验证并存储凭证
依赖方在存储任何内容之前验证过程。检查包括:
- 预期挑战;
- 预期来源;
- 正确的依赖方标识符哈希;
- 当过程嵌入时,预期的跨域状态和
topOrigin; - 根据策略的用户在场和用户验证标志;
- 接受的算法和密钥参数;
- 如果请求认证,认证结构和信任策略;
- 唯一性以及与正确用户账户的关联。
服务器存储凭证标识符、公钥、账户绑定、签名计数器或适用状态、有用的传输或元数据以及凭证生命周期信息。它从不需要私钥。
FIDO2 认证工作原理
认证证明对之前注册的凭证的控制。
1. 服务器创建请求选项
依赖方生成一个新的挑战并发送断言选项。它可能包含凭证标识符的允许列表,或使用可发现凭证,以便认证器可以识别账户。
2. 客户端请求断言
应用程序调用 navigator.credentials.get()。浏览器和认证器选择合适的凭证,并获取所需的用户在场或本地用户验证。
3. 认证器签署过程数据
认证器使用凭证私钥对新的挑战上下文和认证器数据进行签名。因为凭证是范围限定到依赖方的,所以不相关的网络钓鱼来源无法要求认证器为真实服务生成有效的断言。
4. 服务器验证断言
依赖方验证预期挑战、来源、依赖方哈希、使用存储的公钥进行的签名、所需标志、允许的凭证、用户绑定以及相关的计数器或备份状态。只有这样,它才应该创建或提升应用程序会话。
每个断言都在某个时刻证明了控制。会话创建、令牌保护、重新认证、交易授权、注销和撤销仍然是独立的应用程序职责。
为什么 FIDO2 具有防网络钓鱼能力
密码和一次性代码可以输入到冒充网站中,该网站可以将其转发给真实服务。FIDO2 使用范围限定到依赖方的凭证,并通过加密将断言绑定到预期的验证器上下文。
NIST SP 800-63B-4 认证器要求通过验证器名称绑定将 WebAuthn 描述为防网络钓鱼。认证器输出绑定到经过验证的域名,而不是依赖用户注意到欺骗性页面。
防网络钓鱼有其局限性:
- 它不能阻止恶意软件或已经控制已认证会话的攻击者。
- 它不能阻止用户在真实服务中批准恶意交易。
- 它不能保护可以替换凭证的账户恢复路径。
- 它不能证明控制认证器的人是组织打算注册的真实世界的人。
重放抵抗和挑战处理
记录的断言不应该在后续过程中起作用,因为每个请求都使用新的挑战。NIST 将包含随机数或挑战的加密认证器描述为具有重放抵抗性。
实施错误可能会消除该属性。常见的故障包括可预测的挑战、重复使用挑战、接受错误账户的挑战、不强制执行过期、或仅验证签名而忽略来源和依赖方上下文。
服务器应该原子地标记已使用的挑战。如果并行请求竞争,只有一个成功的流程能够使用该挑战。
用户在场和用户验证
WebAuthn 区分:
- 用户在场 (UP):用户执行了表示参与的交互。
- 用户验证 (UV):认证器通过激活因子(如 PIN 或生物识别)在本地验证了用户。
仅在场不是多因子认证。保护高风险操作的服务可能需要 UV 标志,并拒绝仅显示在场的断言。要求应说明预期的标志值,而不是依赖于“使用面容 ID”等界面标签。
本地验证质量也因认证器而异。依赖方可能对用户提供的认证器的确切生物识别或 PIN 实施了解有限,因此策略应与交易和部署人群相称。
平台、漫游和跨设备认证器
平台认证器
这些认证器与手机、笔记本电脑或操作系统集成。它们可以使用设备的本地解锁方法提供简短的旅程。权衡是依赖平台账户恢复、设备安全和同步行为。
漫游认证器
外部安全密钥可以在设备之间携带,并通过支持的传输方式连接。它们对于劳动力、管理或高保障用例非常有用,尤其是在凭证不可导出和受管理发行很重要的情况下。
跨设备认证
混合流可以使用附近的手机在另一台设备上认证会话。切换和接近机制提高了可用性,但增加了用户界面和威胁模型细节,应进行测试,而不是将其视为与同设备认证相同。
支持每个账户的多个凭证。用户会更换手机、丢失安全密钥、使用工作和个人设备,并且需要一种安全的方式来命名、检查和删除凭证。
设备绑定和同步的通行密钥
通行密钥是专为无密码登录设计的 FIDO 凭证。通行密钥可以是:
- 设备绑定:凭证私钥始终绑定到一个认证器或受管设备。
- 同步:凭证材料经过加密并通过提供商的结构同步,以在符合条件的设备上使用。
同步通行密钥提高了可用性和恢复能力,而设备绑定凭证可以提供更强的不可导出性。NIST SP 800-63B-4 可同步认证器指南允许在满足其要求的情况下,在最高认证保障级别 2 的上下文中使用可同步认证器,但同步与级别 3 所需的不可导出性冲突。
不要从“通行密钥”这个词推断出保障。根据依赖方的策略,评估凭证是否已备份、是否符合备份条件、是否共享、是否受管理、是否设备绑定、是否经过证明以及是否通过用户验证激活。
认证与认证器信任
认证可以在注册时提供有关认证器来源或属性的证据。它与认证签名不同,也无法识别人类用户。
消费者服务通常为了隐私和生态系统兼容性而尽量减少认证信息收集。受管理的劳动力部署可能需要特定的认证器型号或认证。该决定应回答一个威胁模型问题,而不是默认收集设备识别证据。
如果使用认证:
- 定义接受的格式和信任锚点;
- 正确验证证书路径和声明;
- 指定元数据更新和撤销处理;
- 计划没有可信认证的认证器;
- 记录隐私和保留后果;
- 当接受的模型状态发生变化时测试替换。
FIDO2 不会取代身份验证
FIDO2 证明对注册到依赖方的凭证的控制。它不建立注册人员的法定姓名、年龄、地址、监管状态或真实世界的唯一性。
这种区别产生了三种常见模式:
- 假名注册:服务需要一个安全账户,但不需要经过验证的真实世界身份。
- 身份绑定注册:首先进行身份验证,然后将 FIDO 凭证绑定到经过验证的账户。
- 升级或恢复:服务在允许替换丢失的认证器之前,重新验证身份或使用其他强有力证据。
绑定应是明确的。记录添加凭证时存在的账户和验证状态,授权该凭证的会话,以及后续风险是否应触发重新认证或身份刷新。
账户恢复和凭证生命周期
恢复是许多防网络钓鱼部署降级的地方。如果用户可以通过电子邮件链接或弱支持问题替换所有 FIDO 凭证,攻击者将转而攻击该路径。
完整的生命周期包括:
- 添加第二个认证器;
- 命名和查看已注册凭证;
- 设备丢失和怀疑被盗;
- 撤销单个凭证而不销毁账户;
- 通过代码、另一个认证器、托管支持或身份验证进行恢复;
- 通过独立渠道通知用户;
- 恢复后延迟或限制高风险操作;
- 记录谁以及为何更改了凭证集;
- 关闭在报告泄露之前创建的会话。
恢复保障应与替换认证器的后果相匹配。低风险社区账户和可以转移资金的管理员不需要相同的路径。
如何评估 FIDO2 部署
协议验证
测试挑战生成和过期、精确的来源验证、依赖方标识符规则、签名验证、支持的算法、UP 和 UV 策略、凭证关联、计数器、备份标志和错误处理。优先使用维护良好的服务器库而不是手动编写二进制解析,同时仍然了解其验证内容。
认证器覆盖范围
测试跨支持的浏览器、操作系统、设备、传输、企业策略和辅助功能设置的平台和漫游认证器。包括凭证创建、登录、条件用户界面、跨设备使用和设备更换。
账户和会话安全
审查谁可以添加凭证、是否需要近期认证、会话如何提升、何时进行重新认证以及凭证更改如何影响现有会话。
恢复和支持
对丢失、被盗设备、受损电子邮件、SIM 卡更换、支持冒充以及恶意家庭或工作场所访问进行红队演练。衡量攻击者抵抗力和真实用户完成度。
隐私和可观察性
将认证和设备数据最小化到策略所需。避免在依赖方之间使用稳定的凭证标识符;WebAuthn 的范围设计旨在防止这种情况。记录原因和过程结果,而不泄露敏感的客户端数据。
常见的 FIDO2 实施错误
检查签名但不检查上下文
如果服务器未能精确验证挑战、来源、依赖方标识符、标志和账户绑定,则有效的签名是不够的。
将每个通行密钥都称为多因子
服务器必须验证是否发生了用户验证以及凭证特性是否符合策略。仅用户在场与本地用户验证不同。
允许静默添加凭证
添加新的认证器会改变账户安全。要求适当的近期认证或恢复过程,通知用户,并记录事件。
只支持一个凭证
单一凭证账户会导致脆弱的恢复并鼓励使用较弱的备用方案。允许多个认证器,并进行清晰的管理和撤销。
将密码作为平等的备用方案
如果密码总是可以绕过 FIDO 路径,那么防网络钓鱼可能只存在于首选按钮上。根据风险和迁移阶段限制或删除较弱的路径。
忽略服务器会话
FIDO2 认证登录过程。保护 cookie 和令牌,认证后轮换会话,对敏感操作要求升级,并撤销受损会话。
部署清单
发布前,确认:
- 挑战是不可预测的、一次性的、短期有效的,并绑定到正确的会话;
- 来源、依赖方标识符、签名、算法、标志和凭证所有权已验证;
- UP 和 UV 要求对每个受保护操作都是明确的;
- 平台、漫游、同步、设备绑定和跨设备用例已按支持情况进行测试;
- 用户可以注册多个凭证并安全地命名、检查和撤销它们;
- 凭证添加和恢复需要适当的保障并生成通知;
- 认证收集具有明确的信任、隐私和元数据策略;
- 密码、一次性代码、支持和身份恢复备用方案已进行威胁建模;
- 已认证会话和交易授权已单独保护;
- 协议库、浏览器支持、弃用和安全事件有负责人。
Didit 如何与 FIDO2 协同工作
FIDO2 在凭证注册后处理认证。Didit 可以通过身份验证、活体检测和生物识别认证支持邻近的身份决策。已公布的生物识别认证价格为每次检查 0.10 美元。
团队可以在定价页面查看当前的模块费率。不应假设这些产品从该描述中实现 FIDO2:架构要点是身份验证、生物识别检查、FIDO 凭证认证、账户恢复和应用程序授权是不同的信任决策。
常见问题
FIDO2 代表什么?
FIDO 指的是 Fast Identity Online(快速在线身份)。FIDO2 是结合了 W3C WebAuthn 和 FIDO Alliance CTAP 用于公钥认证的标准家族。
FIDO2 和 WebAuthn 是一回事吗?
不是。WebAuthn 定义了依赖方和客户端 API 及数据模型。FIDO2 包含 WebAuthn 加上 CTAP,后者连接客户端平台与漫游认证器。
通行密钥是 FIDO2 凭证吗?
是的。通行密钥是专为无密码登录设计的可发现 FIDO 凭证。它们可以在符合条件的设备之间同步,或保持设备绑定。
FIDO2 具有防网络钓鱼能力吗?
经过正确验证的 FIDO2 认证具有防网络钓鱼能力,因为凭证范围限定到依赖方,并且断言绑定到该验证器上下文。弱恢复或已受损的会话仍然可以绕过预期的保护。
FIDO2 使用生物识别吗?
它可以使用本地生物识别来激活认证器并设置用户验证。依赖方通常接收结果和加密断言,而不是生物识别模板。
FIDO2 会验证一个人的身份吗?
不会。它验证对已注册凭证的控制。当服务需要时,真实世界的身份验证是一个单独的注册或恢复决策。
当用户丢失所有认证器时会发生什么?
服务需要一个与账户风险相称的恢复策略。选项可以包括另一个已注册的认证器、恢复代码、托管管理恢复或重新进行的身份验证,并附带通知和恢复后限制。
主要参考资料
- FIDO 联盟用户认证规范
- W3C Web 认证 Level 3 候选推荐快照
- FIDO 联盟 CTAP 2.3 提案标准
- NIST SP 800-63B-4:认证和认证器管理
- NIST SP 800-63B-4 认证器要求
FIDO2 用范围限定的公钥凭证和新鲜的加密过程取代了可重用的验证器秘密。其价值只有在依赖方验证整个上下文、管理凭证生命周期、保护会话和敏感操作,并像对待登录一样重视恢复安全时才能体现。