关注了就能看到更多这么棒的文章哦~

Passwordless authentication with FIDO2—beyond just the web

February 21, 2023
This article was contributed by Koen Vervloesem
FOSDEM
ChatGPT assisted translation
https://lwn.net/Articles/923656/

FIDO2 是一种无需密码就可以对用户进行认证的标准。虽然该技术主要用于保护网站上的账户,但它也适用于其他用途,例如登录 Linux 系统。同样的技术甚至可以用于身份验证以外的领域,例如对文件或者 Git commit 进行签名。布鲁塞尔 2023 年自由和开源软件开发者欧洲会议(FOSDEM)上的几次演讲就介绍了 Linux 用户的可能用法。

FIDO2 标准是 FIDO 联盟(FIDO 代表 Fast Identity Online)和万维网联盟(W3C, World Wide Web Consortium)之间的合作成果,旨在开发强认证(strong authentication)的标准。用户可以使用 FIDO2 安全密钥(硬件令牌)安全地进行身份验证,这比传统的基于密码的身份验证更方便、更快速、更安全。安全密钥可以要求用户触摸按钮或输入 PIN 进行身份验证;也可以使用指纹读取器或其他生物识别身份验证手段。FIDO2 可以作为传统密码的额外验证选项,作为多重身份验证的一部分,也可以作为唯一的身份验证手段。在后一种情况下,这被称为无需密码的身份验证(passwordless authentication)。请注意,先前的 FIDO 标准 FIDO U2F 主要是为两步(two-factor)验证而设计的。

FIDO2 标准由两部分组成。Web 身份验证(WebAuthn)是一项 W3C 建议,在众多浏览器中都有支持,描述了允许网站在其登录页面中添加 FIDO2 身份验证的 API。FIDO 的客户端到认证器协议(CTAP, Client to Authenticator Protocol)通过启用外部认证器(如安全密钥或手机)来配合浏览器一起使用,这是对 WebAuthn 的补充。简而言之:浏览器向服务器发出 WebAuthn 请求,向认证器设备发送 CTAP 请求。

这两个标准都是开放的标准,任何人都可以制造 FIDO2 安全密钥。各种制造商已经建造了这样的硬件令牌(token)。Yubico 有一些支持 FIDO2 的 YubiKey 产品,以及专用的 FIDO2 安全密钥。Feitian、Nitrokey、SoloKeys 和 OnlyKey 也提供 FIDO2 令牌。

How FIDO2 works

FIDO2 是一种使用非对称加密的挑战-响应(challenge-response)身份验证系统。当用户在网站上注册时,WebAuthn 和 CTAP 配合来让认证器(通常是安全密钥)创建一对新的密钥。这只有在用户证明他拥有认证器的情况下才会完成,例如通过在设备上按下一个按钮、扫描指纹或输入 PIN 码。私钥永远不会离开设备本身,而公钥会被发送到网站,并与用户在该网站的账户关联起来。

在登录网站时,该网站会使用 WebAuthn API 向 Web 浏览器发送 challenge 及其来源(例如其域名)。然后,Web 浏览器使用 CTAP 将 challenge 发送到认证器。用户要再次证明一下他拥有认证器,并且设备使用其私钥对这个 challenge 进行签名生成 response。这个 response 会被返回到 Web 浏览器(使用 CTAP),然后返回到网站(使用 WebAuthn)。网站会用之前注册账户的公钥来验证 response 与原始 challenge 是否相符。

FIDO2 令牌可以存储多个凭据(credentials),每个凭据由凭据 ID、私钥、用户 ID 和对应于网站域名的依赖方 ID 组成。网站存储了同样的用户 ID 和凭据 ID,以及公钥。FIDO2 的工作方式可以保护用户免受网络钓鱼攻击。Web 浏览器只接受来自网站域名允许的依赖方 ID 的 WebAuthn 调用,且只允许 HTTPS 连接。因此,当认证器对 challenge 进行签名时,浏览器已知它是在与正确的网站交流,因为它已经使用了该网站的 TLS 证书进行验证。因此,用户不必手动检查域名。

Using FIDO2 beyond the web

大多数有关 FIDO2 的文档都是关于其在网站上的使用场景的,看起来好像是唯一可能的用途一样。例如,Duo Security 制作的非官方但有帮助的 WebAuthn 指南就是一个例子。但是,其实这个规范是可以在 Web 之外场景使用的。这是 Yubico 的开发者倡导者 Joost van Dijk 在一次演讲中的主题。

Yubico 开发了 libfido2,这是一个用于与 FIDO 设备(不仅仅是 Yubico 制造的设备)进行 USB 或 NFC 通信的 C 库以及相应的命令行工具。它支持 FIDO U2F 和 FIDO2 协议。该项目采用 BSD 2-clause 许可证,并支持 Linux、macOS、Windows、OpenBSD 和 FreeBSD。有一些外部项目基于 libfido2 创建了.NET、Go、Perl 和 Rust 的 binding 版本。Yubico 还维护了一个 Python 库 python-fido2,可在 Linux、macOS 和 Windows 上进行测试。

使用 libfido2 的项目之一就是 pam-u2f,也由 Yubico 开发,并包含在许多 Linux 发行版的软件库中。它将 FIDO2 安全密钥集成到可插拔认证模块(PAM, Pluggable Authentication Modules)中,PAM 是 Linux 系统的一个灵活且可扩展的认证框架,允许使用很多种认证方法。针对某个特定目的在 FIDO2 设备上来请求凭据很简单,直接注册一个新凭据,将其保存在配置文件中,然后在 PAM 配置中添加对 pam_u2f.so 的引用,来指向保存凭据的文件。例如,Van Dijk 就展示了如何使用 FIDO2 令牌作为第二认证步骤来给 sudo 启用双因素认证。pam-u2f 文档中还列出了一些其他示例。

New types of SSH keys

Van Dijk 描述的另一个用例是由 FIDO2 验证器支持的 SSH 密钥。OpenSSH 8.2(于 2020 年 2 月发布)引入了对 FIDO2 安全密钥的支持,底层使用 libfido2 库。challenge-response 的工作方式与 Web 上的工作方式类似,但这次认证器使用 CTAP 与 ssh 客户端通信,ssh 客户端使用普通的 SSH 协议与 sshd 服务器通信。

为了能让这一切正常工作,OpenSSH 引入了新的公钥类型“ecdsa-sk”和“ed25519-sk”,以及相应的证书类型。如果用户使用 ssh-keygen 生成其中一种类型的新 SSH 密钥对,则私钥与依赖方 ID“ssh:”以及可选的密钥句柄一起被生成并存储在硬件令牌内。认证器将公钥和密钥句柄返回给 ssh-keygen。程序像往常一样将公钥保存在文件中,而通常存储私钥的文件现在就包含了密钥句柄。

使用这种类型的密钥来向 SSH 服务器进行身份验证,就需要 challenge-response 机制。SSH 服务器向客户端发送一个 challenge,客户端将其发送到 FIDO2 认证器。后者使用私钥签署服务器的 challenge 以创建数字签名,该数字签名发送到客户端,然后发送到服务器。SSH 服务器能够通过已知与 FIDO2 认证器关联的公钥验证此签名。在此过程中,私钥从未离开认证器,即使 SSH 客户端也无法访问它。只要在使用密钥时附加硬件令牌,硬件支持的 SSH 密钥就可以像 OpenSSH 支持的任何其他密钥类型一样使用。

Van Dijk 展示了使用硬件支持的 SSH 密钥可以实现的一些示例:在通过 SSH 克隆 Git 存储库时进行 GitHub 身份验证,签署 Git 提交和标签并验证其签名,以及签署和验证文件。

Unlocking LUKS2 volumes with a hardware token

CTAP 还提供了 hmac-secret 扩展,大多数 FIDO2 令牌都支持此扩展。这用于从认证器中检索密钥以加密或解密数据。用来阻止 offline 攻击,密钥的一部分(salt)是由客户端保存,而另一部分存储在认证器中。客户端将其 salt 交给认证器,认证器使用基于哈希的消息认证(hash-based message authentication)HMAC-SHA-256 将其自己的密钥部分与 salt 组合,然后返回最终密钥。Van Dijk 展示了如何使用此密钥来加密数据,之后就可以安全地删除该密钥了。要在以后解密数据的话,客户端将 salt 交还给认证器,后者从 salt 和自己的密钥部分来重新生成密钥。

Van Dijk 演示了 hmac-secret 扩展的一个应用,用于 Linux 统一密钥设置(LUKS, Linux Unified Key Setup)磁盘加密。Systemd 248 引入了对使用 FIDO2 安全密钥来解锁 LUKS2 存储卷的支持。在将 FIDO2 认证器注册到 LUKS2 加密卷后,systemd-cryptsetup 组件会在启动时等待插入 FIDO2 令牌,将其提供的 salt 传递给它,获取密钥并使用密钥解锁存储卷。

FIDO2 security keys instead of smart cards

看了 FIDO2 安全密钥具有的所有这些功能之后,人们不禁要问,传统智能卡或实现 OpenPGP 的硬件密钥是否就已经足够了。长期以来,这些技术已被用于离线存储用于加密、认证、签名和验证的私钥。Van Dijk 认为,FIDO2 安全密钥的最大优势是它们更便宜、对用户更加友好。

在许多领域中,开源支持也得到了很大改善。例如,在 FOSDEM 上,Red Hat 的 Alexander Bokovoy 就他在 FreeIPA 中集成 FIDO2 以进行中央管理用户的无密码身份验证(passwordless authentication for centrally managed users)方面的工作做了两次演讲。其中其实也使用了 libfido2 库。他的同事 Iker Pedrosa 在他的博客上提供了一些说明。

随着微软、苹果和谷歌在过去几年中加入 FIDO2 阵营,无疑会有越来越多价格合理的 FIDO2 设备面世。随着软件支持的不断改善,用户很快就会开始用便宜的 FIDO2 安全密钥来替换密码了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

LWN:在网页应用之外使用FIDO2 无密码认证!相关推荐

  1. 雅虎日本的无密码认证

    了解雅虎日本如何建立一个无密码身份认证系统. 雅虎日本的无密码认证减少了25%的咨询,将登录时间加快了2.6倍 雅虎日本是日本最大的媒体公司之一,提供搜索.新闻.电子商务和电子邮件等服务.每月有超过5 ...

  2. Fido无密码认证示例部署运行

    文章目录 什么是FIDO webauthn 部署运行 访问测试 本文对fido基本概念进行总结说明,并部署运行一个实际的例子,可以直观的体验fido无密码认证.晚上的例子方便后续实现相关功能. 什么是 ...

  3. FIDO2.0 认证注册流程

    最近再JAVACARD上实现了FIDO2的认证和注册, 难点主要在于CBOR数据在JAVACARD中的解析和打包,其他没啥. 已经再FIDO官网测试通过. FIDO2注册加解密主要流程 1,设备个人化 ...

  4. FIDO2身份认证应用案例

    作为连接全球数百万买家和卖家的全球商业领导者,eBay为各种规模的个人.企业家.企业和组织提供经济机会.因为用户是其成功的核心,eBay 强调为买家和卖家提供积极和安全的体验. 与大多数网站一样,每个 ...

  5. oracle wallet无密码认证,Oracle Wallet 无密码登录

    --1.查看oracle home系统变量 c:\>echo %ORACLE_HOME% C:\Oracle\product\11.2.0\dbhome_1 --2.找到合适的位置创建walle ...

  6. LWN:RIAA, GitHub以及youtube-dl!

    关注了就能看到更多这么棒的文章哦- The RIAA, GitHub, and youtube-dl By Jake Edge November 11, 2020 DeepL assisted tra ...

  7. 密码可见_无密码身份认证即将来临

    密码一直以来存在很多问题,依赖它们进行用户身份认证也是有缺陷的.一段时间以来,这一直是信息安全社区公认的事实,但是密码认证方式仍然无处不在. 一项针对200名安全专业人员身份管理计划的研究表明,在设计 ...

  8. Nodejs搭建前后端分离开发模式下的微信网页项目

    原文链接:<Nodejs搭建前后端分离开发模式下的微信网页项目>- 陈帅华 本文涉及对前后端分离及微信网页项目中的前端如何在本地环境中开发与调试的思考. 主要问题 1.如何配置微信公众平台 ...

  9. 微信公众平台-服务号:网页授权域名 设置

    微信公众平台-服务号的网页授权域名 设置 设置与开发->公众号设置->功能设置->网页授权域名 一:下载认证文件,放置服务器中 二:设置服务器中的 Https中的nginx服务 ng ...

最新文章

  1. 第四届社交机器人论坛第一期开幕:李航、刘群、姜大昕主讲
  2. 开源大数据周刊-第44期
  3. 阿里巴巴成立云原生技术委员会,云原生升级为阿里技术新战略
  4. 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contai
  5. Vue + Spring Boot 项目实战(八):导航栏与图书页面设计
  6. oracle数据库dblink创建语句_3场直播丨达梦DM8数据库安装部署初体验、新基建下的国产数据库应用和发展趋势、Oracle外部表创建与使用...
  7. 复旦大学提出《Meta-FDMixup》解决跨域小样本学习中的域偏移问题
  8. 架构之重构的12条军规
  9. DotNetBar.Bar作为容器使用的方法及Text更新原理
  10. TypeScript:运算符
  11. qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)...
  12. linux没有无线wifi密码忘记,新版tplink无线密码(wifi密码)忘记了怎么办?
  13. java自学-常见的API(String、ArryList)
  14. ArcGis 加载tif,tpk,shp格式文件
  15. python 处理pandas的panel数据
  16. Unity3D引擎入门搭建一个FPS游戏Demo
  17. 计算机辅助cad3dmax,对Auto CAD3DMAXOpen GL在计算机辅助机械设计中应用分析.doc
  18. PC-DMIS 2019示值误差程序MPEE
  19. 速算24 c语言,C语言源程序代码-速算24
  20. java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

热门文章

  1. 西南财经大学天府学院计算机科学与技术考研,西南财经大学天府学院关于成立学校专业认证工作领导小组和计算机科学与技术专业认证工作小组的通知...
  2. apache配置指令速查
  3. 使用NumPy获取MNIST图片
  4. Stave——让Fiddler拥有路径映射功能。
  5. 管易云与管易云对接集成其它入库查询连通其他入库单新增完结接口v2(管易其他入库-金蝶其他入库test)
  6. 软件架构治理 之 架构混沌之谜
  7. 用计算机控制ph,计算机控制实用技术
  8. Mac 系统安装 robot framework (Python3.9)
  9. 自动获取网页的icon地址,个人博客,个人导航,java
  10. matlab计算统计直方图的偏度,每天一点数据分析——描述统计与直方图