在注册期间,身份验证器响应包括一个公钥和证明数据,如https://developers.yubico.com/WebAuthn/WebAuthn_Developer_Guide/WebAuthn_Client_Registration.html所示。第attestationObject
4步中的改为AuthenticatorAttestationResponse
第5步中。为什么authenticator不直接生成AuthenticatorAttestationResponse
或者我们只是attestationObject
在第5步中发送。
2 回答
这是一个很好的问题,要回答这个问题,我们需要了解所有 FIDO 组件的角色。在 FIDO 协议中,有三个主要组件:
服务器(又名 RP) - 启动身份验证会话,因此它的职责是生成良好的质询,并正确验证响应。
客户端(又名浏览器)- 确保会话安全(又名 TLS)并提供物流以通过可用传输(NFC/USB/BLE)与设备进行通信。所有这些功能都打包到 Webauthn API 中。
Authenticator(Security Keys and Built-in Platform Authenticators) - 提供密钥管理和用户验证。
每个组件都有自己的限制:
- Server 不知道用户看到了什么,所以委托 Client/Browser 来做好 TLS 的执行。
- 浏览器不处理私钥,也不进行用户验证,因此它希望验证器足够安全。
- Authenticator 希望浏览器没有被利用,attacker.xom 无法替代 RPID。
这就是为什么当服务器生成带有质询的 MakeCredential 请求并调用 Webauthn API 时,浏览器所做的是:
- 检查 TLS 会话是否正常。没有 MITM,也不是 HTTP。
- 他们检查请求 RPID(login.example.com 想要代表 example.com 登录)是否被允许且未超出安全范围。
- 然后它调用所有可用的设备来查看它们是否知道指定的凭据,如果知道,它将等到用户执行一些操作,例如点击按钮或滑动手指。
- 当操作成功时,它会接受响应,并根据认证选项,无/直接,它会删除或保留认证信息,然后检查是否没有隐私问题字段到服务器(CTAP2.1 CredBlobKey 扩展)
- 浏览器然后对剩余的证明结构进行编码并附加会话信息(CollectedClientData)并将其发送到服务器
- 服务器对证明和 clientDataJSON 进行解码,并验证响应不是来自 ATATACKER.XOM,而是来自预期的来源 example.com。
所以总而言之:
- 身份验证者正在签署东西
- 浏览器确保您的 TLS 会话是安全的,并且没有俄罗斯黑客试图欺骗您。
有用的资源:
我的猜测是“因为关注点分离”。
FIDO2 标准由以下部分组成:
W3C WebAuthn:https ://fidoalliance.org/fido2/fido2-web-authentication-webauthn/
FIDO 联盟 CTAP2:https ://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html
前者控制浏览器应用程序如何与较低级别交互,后者控制浏览器/操作系统如何与兼容的身份验证器交互。
为了支持这种分层,必须进行一些映射和转换,就像允许 WebAuthn 数据结构序列化为 JSON 一样通过网络传输。