# 介绍

# U2F

通用第二因素 (U2F) 是一种开放标准,它使用基于智能卡中类似安全技术的专用通用串行总线 (USB) 或近场通信 (NFC) 设备来增强和简化双因素身份验证 (2FA)。它被 FIDO2 项目所取代,该项目包括 W3C Web 认证(WebAuthn)标准和 FIDO 联盟的客户端到认证器协议 2(CTAP2)。

虽然该标准最初由 Google 和 Yubico 开发,并得到了 NXP Semiconductors 的贡献,但现在由 FIDO 联盟托管。

以上来自 Universal 2nd Factor

所以 U2F 也有 FIDO1 或者 FIDO U2F 之称。

# FIDO2

FIDO2 项目是 FIDO 联盟和万维网联盟 (W3C) 之间的共同努力,其目标是为 Web 创建强大的身份验证。FIDO2 的核心由 W3C Web 身份验证 (WebAuthn) 标准和 FIDO 客户端到身份验证器协议 2 (CTAP2) 组成。FIDO2 基于 FIDO 联盟之前所做的工作,特别是通用第二因素 (U2F) 身份验证标准。

以上来自 FIDO Alliance

# WebAuthn

WebAuthn (Web Authentication) 由万维网联盟 (W3C) 发布的 Web 标准。 WebAuthn 是 FIDO2 项目的核心组成部分。

以上来自 WebAuthn

WebAuthn (Web Authentication) 是一种基于公钥的身份验证标准,旨在为 Web 提供更安全和更隐私的身份验证方法。WebAuthn 主要通过使用用户设备上的硬件安全密钥(如指纹、面部识别或物理安全密钥)来验证用户身份。

Tips:Windows hello 也支持。

# 为什么我们需要 WebAuthn

与传统的基于密码的身份验证相比的优势
WebAuthn 解决了传统基于密码的身份验证中的许多固有问题:

安全凭据生成和存储: WebAuthn 使用强大的算法为每个网站生成唯一的凭据,并将它们安全地存储在受信任的身份验证器中。这消除了常见的漏洞,例如:

  • 由于长度不足,很容易被暴力破解的弱密码。
  • 容易受到字典攻击的可预测密码(例如,“password”、“12345678”)。
  • 基于个人信息(例如出生日期、地址)的可猜测密码。
  • 客户端密码存储不佳(例如,记下、存储在电话联系人中)。
  • 在多个网站之间重复使用密码(因为 WebAuthn 凭据在设计上特定于各个网站)。
  • 服务器规定的密码要求不足(例如,过于宽松或限制性标准、任意的最大长度限制、有限的字符集)。
  • 阻止密码管理器自动填充功能的限制。

无服务器端凭证存储: 凭证的私有部分永远不会存储在服务器上,从而消除了风险和漏洞,例如:

  • 数据库中不安全的密码存储(例如,明文或依赖于基于弱哈希的算法 / 结构)。
  • 数据库泄漏暴露了密码。
  • 强制性的、无效的定期密码更改。

每个网站的唯一凭据: WebAuthn 确保每个网站的凭据是唯一的,从而消除了以下风险和漏洞:

  • 撞库攻击,攻击者在多个站点上使用来自一个数据泄露的凭据。
  • 网络钓鱼攻击,因为凭据不能重复使用或误应用于不同的网站。

# WebAuthn 具体实现流程与无密码登录

这篇文章已经讲解的非常详细:谈谈 WebAuthn

# Passkey

详细可以参考这篇文章:Passkey 和 WebAuthn

与 WebAuthn 略微不同的是,Passkey 允许凭证漫游(虽然非常驻密钥也是存储在服务器端)。同时受益于常驻密钥(Passkey 始终保存密钥),因此 Passkey 支持无用户名登录。

在具体实践中,Android 上 Google 通过锁屏和指纹对密钥进行加密后同步,Apple 则使用 iCloud。

通过牺牲一定的安全性来达到避免硬件损坏后丢失访问权限的情况。

另外,虽然 Passkey 不支持跨平台同步,但支持跨平台注册和调用凭证。

一般的,网站会根据安全性要求设置 WebAuthn 使用 cross-platform 类型(不与平台绑定,例如 Yubikey)或者 platform 类型(与平台绑定,例如 Windows Hello)的凭据,不同类型将采用不同的注册和验证方式,当然也可以选择 all supported 。因此如果是限制为 platform 类型,那么将无法跨平台注册凭证。

在选择设备时选择 iPhone、iPad或Android设备 ,使用设备扫描显示的二维码即可完成注册和认证。

iPhone、iPad或Android设备

FIDO二维码

并且因为不受限于物理密钥的空间,理论上使用 iPhone,Android 等手机设备可以存储无限的 Paaskey 密钥(常驻密钥)

需要注意的是,Android 上如果使用 Google 的 Passkey 服务,需要连接 Google 的服务器,如果你在中国大陆境内可能无法正常使用该服务。

另外,不同手机可能内置 Passkey 服务,在使用时可能会调用手机厂商的 Passkey 服务,如果需要使用 Google 的 Passkey 服务可能需要额外设置。默认情况下 Chrome 浏览器会调用 Google 的 Passkey 服务。

# 硬件密钥

硬件密钥一般拥有更高的安全性,密钥一旦导入将无法导出,也无法进行同步。

如果选择完全无密码(取消密码认证),请务必绑定两个以上的认证器或者绑定一个支持同步的 Passkey 设备,否则一旦硬件损坏将会导致失去账户访问权限!

市面上常用的有 Yubikey 和谷歌的 Titan Key,国产也有相应的 Canokey 进行平替。

优点:无需联网,离线保存,安全性极高。

缺点:空间有限,(yubikey 5 支持 25 个常驻密钥),价格昂贵(yubikey 5C NFC 55 美元)

需要注意的是,受限于物理密钥的存储空间,一些认证器(物理密钥)对于一般普通的密钥采用 Key Warp 这种算法将私钥加密后打包到服务端,当需要认证时将加密后的私钥返回至认证器(物理密钥),由认证器进行解密后获得私钥再进行剩余操作,因此实际上私钥是离开了物理密钥,yubikey 则使用基于 HMAC 的算法来实现私钥 “不离开” 物理密钥。

只有常驻密钥才真正存储在认证器(物理密钥)内部,因此一般物理密钥的常驻密钥存储数量有限制。

# 使用场景

无密码快捷登录: 使用人脸,指纹等认证方式(具体看设备支持)进行快捷登录,无需输入密码。

避免暴力破解: 使用公钥与私钥代替传统密码,暴力破解难度极大。

防止密码泄露: 避免某些网站泄露密码而又因使用重复密码造成的巨大风险。

防止窃取密码: 防止在陌生环境或者公用计算机上进行登录操作时被窃取密码。

tips:WebAuthn 不保护使用 Cookie 等保留的登录状态,因此在公用电脑上登录后请务必完成登出账户操作!

# 测试

使用 https://webauthn.io/ 这个网站可以测试 WebAuthn 的验证。

webauthn.io

advanced settings 中可以根据自己的需求进行测试。

  • User Verification: 设定认证器是否需要输入 PIN 码等进行验证(Android Passkey 情形下均会验证指纹)
  • Attachment: 凭据类型
  • Discoverable Credential: 可用于控制是否使用常驻密钥。
  • Attestation: 验证认证器的真实性
  • Public Key Algorithms: 公钥算法
  • Registration Hints (most to least preferred): 认证器类型限制

# 后记

我自己受益的是免密码登录。每次去学校机房上机,需要从我云盘同步资料到机房电脑,因为自己使用密码库的随机密码,所以如果要我输入 20 位 + 的大小写 + 字符的密码我觉得会是一种灾难。。。

使用 WebAuthn 后只需要把物理密钥插在机房电脑上,输入密钥的 PIN 即可完成登录,方便快捷。(其实更想用 Passkey,但是 Android 国内访问不了 Google 服务,挂梯也没用,用不了)

# 参考

https://en.wikipedia.org/wiki/Universal_2nd_Factor

https://wiki.archlinux.org/title/Universal_2nd_Factor

https://snowstar.org/2022/12/11/passkey-and-webauthn/

https://en.wikipedia.org/wiki/WebAuthn

https://jia.je/hardware/2020/05/18/fido-u2f-fido2-ctap/

https://flyhigher.top/develop/2160.html

https://w3c.github.io/webauthn/