FIDO2 与 U2F/CTAP1 的兼容性

FIDO2 compatibility with U2F/CTAP1

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

...all previously certified FIDO U2F Security Keys and YubiKeys will continue to work as a second-factor authentication login experience with web browsers and online services supporting WebAuthn. - Yubico

但在查看规格后,我很难理解它在实践中的实际工作原理。具体来说,FIDO2 的 relying party identifier and U2F's application identity.

似乎不匹配

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

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

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

FIDO documentation for CTAP describes how CTAP2 maps onto CTAP1/U2F。在其中,他们只是将 依赖方标识符 直接视为 应用程序身份 :

Let rpIdHash be a byte array of size 32 initialized with SHA-256 hash of rp.id parameter as CTAP1/U2F application parameter (32 bytes)

这似乎不一致。假设我是 example.com,我很早就采用了 U2F second-factor 身份验证。我的 应用程序 ID 将是 https://example.com,所以我原来的 U2F 应用程序参数将是 SHA256("https://example.com"):

100680ad546ce6a577f42f52df33b4cfdca756859e664b8d7de329b150d09ce9

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

a379a6f6eeafb9a55e378c118034e2751e682fab9f2d30ab13d2125586ce1947

那明显不一样。在我切换到 WebAuthn 后,之前设置过 U2F 密钥以用于我的网站的任何人都将无法再使用它们:除非他们 re-registered 使用他们的密钥。而且,当然,他们需要能够 log-in 才能做到这一点。

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

1194228DA8FDBDEEFD261BD7B6595CFD70A50D70C6407BCF013DE96D4EFB17DE

以上两个选项 都不是。我仍然不清楚什么字符串散列到该值。

那么我在这里弄错了什么?使用 U2F 部署 2FA 的服务如何切换到 FIDO2/Webauthn 而无需用户 re-register 他们的安全密钥?我一定是漏掉了什么。

WebAuthn 通过 AppID Extension documented in the W3C WebAuthn spec 支持与 U2F 的向后兼容性。依赖方 (RP) 通过此扩展将 U2F 应用程序身份 传递给浏览器。

Python and Java.

中有几个 RP AppID 示例