U2F 与 FIDO2
U2F (Universal 2nd Factor) 。最早由 Yubico 和 Google 开发,后来由 FIDO 联盟管理并随着 FIDO2 发布后改名为 CTAP1。U2F 的应用领域是为账户提供第二因素验证。通常在我们生活中常见的第二因素验证主要由一次性短信 / 邮件验证码和基于 Time-based one-time password (TOTP) 算法生成的验证码构成。诸如此类的验证方式都高度依赖软件环境的安全,如果遇上含有验证码的信息被以某种方式“钓走”,那么这道最后保护账户安全的关卡将会形同虚设。U2F 通过硬件和非对称加密技术实现了比纯靠软件实现的第二因素验证更高的安全性。独一无二的私钥离线保存在硬件设备当中,并且大多数的 U2F 在硬件设计上会多一层让用户触摸以确保本人操作的保障。
现如今,FIDO 联盟发布了三个标准
- FIDO U2F
- FIDO UAF
- CTAP
最新版本的 CTAP2 支持用户的验证器完成无密码登录,第二因素验证或者多因素验证。
而 FIDO2,实际上由 CTAP 协议和 W3C 的 WebAuthn 标准构成。它们共同构建并完成了只需要使用验证器 (软件或者硬件密钥) 就可以完成无密码登录和第二因素验证的体验。
缘由
很早之前我就有购买 Yubikey 的想法,但也仅仅是一个想法,最后并没有付出实践。直到出国后偶然想给自己添置一些之前在中国想买,但是一直没买的电子物品。Yubikey 就是其中之一,于是我在二月份的时候在亚马逊下单了一个 Yubikey 5C NFC。
后来我添购了一个 Google Titan Security Key,因为颜值确实比 Yubikey 高一些
这个命名方式代表这是 Yubikey 的第五代产品,带有 C 字母说明它是 USB-C 接口,并且支持 NFC。现在的电子设备大多数都使用或兼容 USB-C 接口,特别是许多的轻薄本。我的 Mac,iPad 也不例外。并且,因为我的 iPhone 还尚未支持 USB-C 接口,这时候 Yubikey 的 NFC 兼容就派上用场了。
优势
购买一个 FIDO2 密钥的优势主要在于快速,安全的完成对你的身份证明,无论是无密码登录还是双 / 多因素验证。
除了更方便的登陆,这种验证方式还很好的杜绝了通过“钓鱼”把你的账号钓走。因为在登陆过程中你不需要输入密码,而钓鱼网站也无法得知你要以密钥的方式登陆,无法验证你的签名数据,更加,你的操作系统和浏览器也不允许一个陌生的 URL 请求其他 URL 的签名数据 。因此,攻击者就压根无法钓走你的账号。
这样以来,你可以放心的在你信任或者陌生地公共或临时设备上安全快速的登陆你想要登陆的服务。
从这样
变成这样
相比于验证码
这里说的验证码包括但不限于短信验证码,邮件验证码和基于特定算法生成出来的验证码 (例如 TOTP)。
但是这类验证码的主流问题要么是不够方便,要么就是上述提到的,相比于基于硬件和非对称密码学技术的解决方案来说不够安全。
不够方便主要体现在你可能要操作第二设备,或者其他的软件。
不过不得不承认,有些系统已经支持自动填写短信和邮件的验证码。当你把 TOTP 的密钥添加到 iOS 的 Keychain 后它甚至也能自动为你填充基于 TOTP 的验证码。
相比于使用 App 确认登陆
在 App 上确认登录是类似于微信那种,在 App 中点击按钮确认登录。更进阶的有例如微软账户登录时,会给你一个随机的数字。在 Outlook 或者 Microsoft Authenticator 中你需要选择正确的数字来确保是你在登陆。但是问题都很明显,你必须要操作一个第二设备的软件来证明你在操作。就以我的使用体验来说,iPhone Xr 在 2024 年想要快速打开 Outlook 来完成验证已经有点略显吃力。再加上我并不那么喜欢在使用电脑的时候必须要使用手机来完成一些事情,所以这种验证方式也并不是我喜欢的。
相比于 Passkey
passkey 的正确拼法为
passkey
,就像password
我想说的是,passkey 是一个很好的解决方案。但 passkey 被主流操作系统支持的还可以说在初期阶段。
例如在 Apple 设备上。需要是最新版本的 iOS,macOS 才有可能使用 passkey 来登陆你的账户。否则你只能使用 FIDO2 的硬件密钥。
Windows 也是一样,如果你还在使用 Windows 10,那么在调用 WebAuthn 时也只能使用 FIDO2 的硬件密钥。
在 Android 中,这点似乎可以被 Google Password Manager 解决。但是我没有 Android 设备,因此无法进行测试。而且如果你所在的地区无法使用 Google 那么也没法愉快地使用 :-(
在 Linux 中,似乎只有 Chromium 内核的浏览器,至少 Chrome 比较好的支持 passkey。FireFox 在这点上支持比较差劲。
不过倒也有一个统一的解决方案。现在有一些密码管理器已经支持保存 passkey 密钥,并且通过对应的浏览器插件来弥补上不同操作系统对于 passkey 支持的问题。但是在 Android 阵营上又出现了一个问题。如果你再尝试使用第三方密码管理器来保存 passkey,你至少要确保你的 AOSP 版本要在 Android 14,低于 Android 14 的版本中尚未提供对于第三方密码管理器对于 passkey 的功能支持。
那么?
所以,讲了那么多对比。我想要说的是,硬件密钥可以弥补上述我所提到的缺点。
FIDO2 配合 WebAuthn API 可以完美的完成无密码和双因素验证,这点毋庸置疑。并且对于稍老版本系统的支持上,硬件的 FIDO2 密钥是最好的。
现在越来越多的在线服务和 App 已经在快速的适配 passkey 中。无论是你的 Apple,Google 还是 Microsoft 账户。还是 Amazon,GitHub,Roblox 甚至 PlayStation 都兼容了 passkey 的无密码登陆。因为 passkey 基于 FIDO,理论上一个 FIDO2 的硬件密钥也将完美支持这些在线服务和 App 们,使你无需担心操作系统版本和环境,只需要插入密钥或者通过 NFC 感应就可以轻松并且安全地登陆。
硬件密钥有些时候还可以带来一些额外的好处。虽然理论上它们都基于同一个标准,但是 WebAuthn API 允许开发者选择他们倾向的验证方式。也就是说,是有可能出现一些服务只能使用 FIDO2 的硬件密钥来通过验证的,通常是因为安全性考虑。
还有什么?
上述提到的 Yubikey 5C NFC 除了支持 FIDO2 协议,它还支持以下协议
- FIDO U2F
- Yubico OTP
- OATH-TOTP
- OATH-HOTP
- Smart card (PIV)
- OpenPGP
而上述说到的 Google Titan Security Key 只能支持 FIDO2 包含 FIDO U2F