2

有很多消息来源说 FIDO2/CTAP2 向后兼容 U2F:

...所有以前认证的 FIDO U2F 安全密钥和 YubiKey 将继续作为支持 WebAuthn 的 Web 浏览器和在线服务的第二因素身份验证登录体验。-尤比科

但是在查看了规范之后,我很难看到它在实践中是如何工作的。具体来说,FIDO2 的依赖方标识符和 U2F 的应用程序身份之间似乎存在不匹配。

在 U2F 中,应用程序标识是一个 URL,例如https://example.com. 应用程序标识的 SHA-256 称为应用程序参数应用程序参数是在注册和认证过程中实际发送给认证者的参数。

在 FIDO2 中,等价物似乎是依赖方标识符,它被定义为域名,例如example.com.

依赖方标识符应用程序身份在 FIDO2/CTAP2 和 U2F 中的用途相同。但是,CTAP2 身份验证器直接将依赖方标识符作为 UTF8 字符串获取,而 U2F 身份验证器仅获取应用程序身份的 SHA-256 哈希(应用程序参数)。

CTAP的FIDO 文档描述了 CTAP2 如何映射到 CTAP1/U2F。在其中,他们只是将依赖方标识符直接视为应用程序身份

令 rpIdHash 为大小为 32 的字节数组,使用 rp.id 参数的 SHA-256 哈希作为 CTAP1/U2F 应用程序参数(32 字节)初始化

CTAP 文档中的图形

这似乎不一致。假设我是example.com,并且我很早就采用了 U2F 第二因素身份验证。我的应用程序 IDhttps://example.com,所以我原来的 U2F 应用程序参数是SHA256("https://example.com")

100680ad546ce6a577f42f52df33b4cfdca756859e664b8d7de329b150d09ce9

但是,如果我随后切换到使用 Webauthn,我的依赖方标识符将只是example.com. 如fido-client-to-authenticator-protocol-v2.0 的第 7 节所述,将其转换为U2F 应用程序参数时,结果值应为:SHA256("example.com")

a379a6f6eeafb9a55e378c118034e2751e682fab9f2d30ab13d2125586ce1947

那显然是不同的。在我切换到 WebAuthn 后,以前设置了 U2F 密钥以用于我的网站的任何人都将无法再使用它们:除非他们重新注册了他们的密钥。当然,他们需要能够登录才能做到这一点。

深入挖掘,我注意到他们在文档中给出的示例有一个依赖方标识符example.com但他们在示例中给出的哈希是......

1194228DA8FDBDEEFD261BD7B6595CFD70A50D70C6407BCF013DE96D4EFB17DE

这不是上述两个选项中的任何一个。我仍然不清楚什么字符串散列到该值。

那么我在这里做错了什么?使用 U2F 部署 2FA 的服务如何在不要求用户重新注册其安全密钥的情况下切换到 FIDO2/Webauthn?我肯定错过了什么。

4

1 回答 1

1

WebAuthn 通过W3C WebAuthn 规范中记录的 AppID 扩展支持与 U2F 的向后兼容性。依赖方 (RP)通过此扩展将 U2F应用程序身份传递给浏览器。

下面是一些PythonJava中的 RP AppID 示例。

于 2020-03-12T16:07:45.410 回答