FIDO2 url 包含哪些信息以及我们如何在 Swift 中对其进行解码?

let*_*way 3 authentication ios swift webauthn fido

在 WWDC 2022 上,Apple 推出了 Passkeys GA,它将在 FIDO2 身份验证中启用,这是取代密码的下一代基于开放标准的身份验证机制。

在支持 FIDO2 的依赖方 (RP) 服务器上,当发起用户注册时,浏览器会生成二维码以将手机注册为平台身份验证器。

我正在尝试构建一个打开 QR 扫描仪视图的应用程序,并且我想通过扫描浏览器生成的 QR 码来注册 FIDO 凭证。解析后的字符串格式为 - FIDO:/090409094349049349.......

这个 FIDO:/090409094349049349....... url 协议包含哪些与 RP 相关的信息?另外,有没有办法在 Swift 中对其进行解码,以获取 json 或字符串格式的信息?

由于 iPhone 上的相机应用程序能够扫描 QR 并生成 RP 域名和注册用户等信息,我相信也应该有一种方法可以通过应用程序内的 QR 扫描仪来执行此操作。或者这些 API 本质上是私有的,仅供相机应用程序使用吗?

Yas*_*mez 7

这是客户端验证器协议 (CTAP) v2.2 混合流链接,旨在引导读取 QR 码的设备和显示 QR 码的主机之间的蓝牙连接。这以前被称为“云辅助蓝牙低功耗”绑定,或cable简称为“云辅助蓝牙低功耗”绑定。

要解码其中一个,我们举一个我在单击 时从 webauthn 演示页面 [DEMO] 创建的示例Register

FIDO:/13086400838107303667332719012595115747821895775708323189557153075146383351399743589971313508078026948312026786722471666005727649643501784024544726574771401798171307406596245
Run Code Online (Sandbox Code Playgroud)

FIDO:/已在 [IANA] 上向 IANA 注册。

接下来是一个 base10 编码的字符串,这意味着 7 个字节被编码为 17 个数字。它可以被解码,例如

FIDO:/13086400838107303667332719012595115747821895775708323189557153075146383351399743589971313508078026948312026786722471666005727649643501784024544726574771401798171307406596245
Run Code Online (Sandbox Code Playgroud)

这会产生字节字符串

a7 00 58 21 03 7e 2e f7 c6 5f a6 8e 15 ed 9b 9a 4c b7 22 34 cc ca 8f 9b 84 c7 62 52 d5 27 96 50 9b 31 88 ab 07 01 50 49 aa 2e f2 de 61 7e 4c
ba 2a e2 68 3d 3c ed 08 02 02 03 1a 64 05 fb 8e 04 f5 05 62 6d 63 06 f5
Run Code Online (Sandbox Code Playgroud)

这实际上是一个 CBOR [CBOR, CBOR2] 值,看起来像

{
  0: h'037E2EF7C65FA68E15ED9B9A4CB72234CCCA8F9B84C76252D52796509B3188AB07', # compressed public key
  1: h'49AA2EF2DE617E4CBA2AE2683D3CED08',                                   # qr secret
  2: 2,                                                                     # num_known_domains
  3: 1678113678,                                                            # Timestamp: Mon Mar 06 2023 14:41:18 GMT+0000
  4: true,                                                                  # supports_linking 
  5: "mc",                                                                  # request_type -> CableRequestType::kMakeCredential
  6: true                                                                   # kWebAuthnNonDiscoverableMakeCredentialQRFlag enabled
}
Run Code Online (Sandbox Code Playgroud)

为了理解这张地图,我们需要知道地图键的重要性,对此我无法获得规范来源。因此,真相就在代码 [CHROME] 中。

在我们的例子中,密钥0包含依赖方的压缩公钥 [BTC]https://webauthn.io

钥匙1包含设备将证明其读取了二维码的共享秘密。

钥匙2包含注册的隧道服务器域的数量。

钥匙3是创建请求时的主机 unix 时间,在我们的例子中为 Mon Mar 06 2023 14:41:18 GMT+0000

钥匙4告诉我们显示二维码的主机是否支持设备链接。

5是操作的请求类型,在本例中mc代表 Make Credential,即我们要执行设备注册。请注意,此参数只是对移动设备的提示,并非绝对必要,因为二维码本身不执行任何 Webauthn/CTAP 操作,它仅有助于避免两个设备的蓝牙配对。

钥匙6声明该调用应该是不可发现的。

进一步阅读 WebAuthn [WEBAUTHN] 和客户端到身份验证器协议 [CTAP]。

--

[IANA] https://www.iana.org/assignments/uri-schemes/prov/fido

[演示] https://webauthn.io/

[铬] https://github.com/chromium/chromium/blob/50479218fc94681552b7ba2c526069141182a143/device/fido/cable/v2_handshake.cc#L441-L469https://github.com/chromium/chromium/blob/50479218fc94681552b7ba2 c526069141182a143 /设备/fido/cable/v2_handshake.h#L107-L127

[CBOR] https://www.rfc-editor.org/rfc/rfc8949.txt

[CBOR2] https://cbor.me/

[CTAP] https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html请注意,这只是版本2.1. 我们的二维码仅在 2.2 版本中指定,遗憾的是尚未公开。

[WEBAUTHN] https://www.w3.org/TR/webauthn-2/

[BTC] https://btcinformation.org/en/developer-guide#public-key-formats