FIDO 2

FIDO 2 是我很早就想搞得一个事情,但是相关的东西生态太少了,所以优先级不高,但最近折腾了几个东西,让我觉得 还是有搞头的。

安全性和便利性都兼得的一种办法。这个就是未来。

概念

FIDO2

Fast IDentity Online(线上快速身份验证)的缩写,或称 FIDO 联盟。该联盟主要致力于构建安全、开放、防网络钓鱼的无密码身份验证标准。

包括通用认证框架 UAF(Universal Authentication Framework)、通用第二因素认证标准 U2F(Universal 2nd Factor) 以及 FIDO2

当说到使用 “FIDO” 时,通常是指使用这三种协议中的任何一种,因为从概念的角度来看,这三者基本一致,只是结构有所区别(UAF——TLV,U2F——RAW,FIDO2——CBOR)。

Passkey

passkey 只做了一件微小的事情,允许凭证漫游,并且将这种漫游的凭证称呼为 “passkey”。除此以外没有别的功能改动了。

对于 cross-platform 类型来说,密钥是无法离开硬件密钥存在的,无论是编码进 ID,还是储存在内部,没有设备就没有访问权限,凭证是无法进行漫游的,因为如果允许硬件内部的凭证漫游,那么这个硬件就毫无意义。

因此能够漫游的只能是 platform 类型的凭证,通过更改 platform 验证器的行为,我们将使用 platform 生成的凭证,通过一些方案,同步到其他设备中,从而能够在其他电脑或者手机上进行登录。

对于苹果的产品来说,凭证则是储存在 iCloud keychain中的,同步也是 keychain 来做。微软同样有他的方案,凭证使用 Windows Hello 进行储存和同步。

passkey 的另一个亮点,那就是可以跨平台调用凭证,也就是说,你可以在一个设备上注册一个凭证,然后在另一个设备上使用这个凭证进行登录。

WebAuthn

有了这些具体的协议和框架,那么作为一个开发者来说,我到底应该怎么写代码呢?这就是 WebAuthn 标准规定的。

WebAuthn 是一个 W3C 的标准,它定义了关于凭证相关的 API 接口,并且不光限于公钥体系的 FIDO U2F 和 FIDO2。可以说它是一个高层接口,屏蔽了底层交互信息,开发者只需要按照规定调用 API,就可以完成注册和登录。

在这个标准中,主要就是两个接口,当然了,说的是在浏览器中的 JavaScript 接口。

TPM

TPM 就是一种硬件密钥管理方案。TPM 使用 Windows 的用户应该不陌生,在升级 Windows 11 的时候有一项需求就是要求支持 TPM。

TPM 从物理上来说,是一个附着在主板上,或者通过接口插在主板上的芯片,用途就是管理密钥,和安全验证。

它是和主板严格绑定的,你从这个主板上拆下来 TPM 芯片移植到另一个主板上,那他里面的密钥就无法再使用了。

苹果的产品也都有加密芯片,起到的作用和 TPM 是类似的。Android 手机如果是最近几年比较新的,那么也是会有类似的功能,例如指纹模块,配合锁屏它同样的可以作为 WebAuthn 中储存密钥的验证器。

实际应用

这点很尴尬,网页端,自然不用说 大家或许都用上很多了,但是在操作系统下的应用还是很难。

比如存储 SSH Key

macOS下有个 secretive, 但是它没有用任何上述的接口,只是用了 mac 上的物理安全区。

Windows 下 Windows hello 虽然可以做得到,但是 需要beta版的open ssh,而且 密钥存储位置一定要在外部硬件上,无法被存储到 TPM 上,这点就很疑惑,或许几年后微软才能把这个推动完成吧,目前看来 不行.

所以这也是我一直在推迟的原因,就是没有干货,所有的资料都是解释,但是摸不到。

也许再过两年我会重新谈一谈 FIDO 2 或者 下一代 FIDO。

参考

非常感谢各路大神整理的资料,我这里只是做一个简单的整理,方便自己查阅。 因为有了这些资料,才能把这个复杂庞大的安全体系变得简单和清晰。

FIDO 相关定义

YubiKey CN: 分享发现 CTAP、FIDO2、WebAuthn?FIDO 相关术语一览
snowstar: Passkey 和 WebAuthn (推荐:Passkey讲的非常清晰)
CORI LIN: FIDO2 | WebAuth | Passkey ? 傻傻分不清楚推荐:三个重要的概念对比
fidoalliance.org: About Passkeys

在线 webauthn 调试

Windows Hello 和 SSH Key
Secure Windows SSH Key with Windows Hello / TPM
The complete guide to SSH with FIDO2 security keys

Windows 其他方式 和 SSH Key
智能卡 Secure SSH Access with TPM2-Backed Key
tpm2-pkcs11

Linux
ssh-tpm-agent