介绍

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/