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



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

在支持FIDO2的依赖方(RP(服务器上,当用户注册启动时,浏览器会生成一个二维码,将手机注册为平台验证器。

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

此FIDO:/090409094349049349……url协议包含哪些与RP有关的信息?此外,有没有一种方法可以在Swift中解码,以json或字符串格式获得信息?

由于iPhone上的摄像头应用程序能够扫描二维码并生成RP域名和注册用户等信息,我认为应该有一种方法可以通过应用程序内的二维码扫描仪来实现这一点。还是这些API本质上是私有的,仅用于Camera应用程序?

这是一个客户端身份验证协议(CTAP(v2.2混合流链接,旨在引导设备之间的蓝牙连接读取QR码和显示它的主计算机;云辅助蓝牙低能量";简称cable

要解码其中一个,让我们举一个我在点击Register时从webauthn演示页面[demo]创建的例子。

FIDO:/13086400838107303667332719012595115747821895775708323189557153075146383351399743589971313508078026948312026786722471666005727649643501784024544726574771401798171307406596245

FIDO:/URI方案在[IANA]处向IANA注册。

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

let x = input
.chars()
.collect::<Vec<char>>()
.chunks(17)
.flat_map(|c| {
let s = c.iter().collect::<String>();
let n = match s.len() {
3 => 1,
5 => 2,
8 => 3,
10 => 4,
13 => 5,
15 => 6,
17 => 7,
_ => panic!(),
};
s.parse::<u64>().unwrap().to_le_bytes().into_iter().take(n)
})
.collect::<Vec<u8>>();

这将产生字节字符串

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

它实际上是一个看起来像的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
}

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

密钥0包含依赖方的压缩公钥[BTC],在我们的情况下为https://webauthn.io

密钥1包含共享秘密,设备将使用该秘密来证明其读取了QR码。

密钥2包含已注册的隧道服务器域的数目。

密钥3是创建请求时的主机unix时间,在我们的情况下是2023年3月6日星期一14:41:18 GMT+0000

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

密钥5是操作的请求类型,在本例中为mc,它代表Make Credential,即我们想要执行设备注册。请注意,此参数只是对移动设备的提示,并非绝对必要,因为QR码本身不执行任何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-L469和https://github.com/chromium/chromium/blob/50479218fc94681552b7ba2c526069141182a143/device/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-密钥格式

这是一个作为系统服务/功能实现的FIDO协议,对您的应用程序没有用处。

最新更新