本文首发在我的博客,有兴趣可以去看看:https://nahida.im/blog/why-have-not-passkeys-taken-over-the-world-yet/
纯人工,无添加,请放心食用
Passkey 的宣传语一直很美好,没有密码、不怕钓鱼、不用记复杂字符串、点一下摸一下一键认领主人,听起来简直像密码终于能退休了... 吗?
如果你平时用的是 Android、iPhone、macOS 或 Windows,并且顺手把 Passkey 存进默认的密码管理器,那么确实是这样:
网站:Create a passkey
系统:保存到 Google Password Manager?
你:OK OK 木有问题整个过程像宣传片一样纵享丝滑
然后我去买了一把 YubiKey,当它配合 Linux 使用时......
第一关:你说的 Passkey,和我理解的是同一个东西吗?
理论上,Passkey 是建立在 WebAuthn / FIDO2 上的一套认证机制。
简单来说,和你 ssh 差不多,网站保存公钥,私钥留在用户的 Key 里。登录的时候网站要凭证,Key 说我给你画一个,网站表示 OK 老铁没毛病,给我飞起来
听起来,Amazing 啊!
但你们都起的 TM 啥外号啊
- Passkey
- Security Key
- Hardware Key
- Device Key
- Master Key
- FIDO2
- WebAuthn
- Passwordless Login
- Two-Step Verification
而且这些名字之间并没有稳定映射。
有的网站所谓的 “Passkey”,是输入账号密码之后,再摸一下 YubiKey,然后飞起来
有的网站所谓的 “Security Key”,反而是可以直接点一下按钮,输入 Yubikey 密码 & 摸一下,直接飞起来还有的网站会一本正经地给你两个按钮:
- Create a Passkey
- Create a Device Key
然后你发现两者都存到了同一把 YubiKey。
接下来登录时:
- 点 Login with Passkey
- 输密码,摸一次
- 二步验证
- 输密码,摸一次
两次认证,来自同一块塑料
安全性不能说没有增加,只能说增加安全性有点不可能
第二关:Login with Passkey,但是 Passkey 不知道你是谁
网站创建了一个非驻留凭证,顾名思义这玩意不存你这里
这种凭证本身并不能在没有用户名的情况下告诉网站
我属于哪个账户。正常用法应该是:
- 用户先输入邮箱或用户名;
- 服务端找到这个账户;
- 服务端把对应 credential ID 发给浏览器;
- YubiKey 完成 WebAuthn 验证。
但问题是,登录页下面赫然写着
Login with Passkey这是人能写出来的东西吗?!
来,我不输入用户名,直接点。
浏览器:你有这个网站的账号吗?
YubiKey:亲,我让你飞起来你信不信
然后什么都读不到
或者直接报未知错误第三关:我有 YubiKey,网站:你没有
那么就有人说了:在 Linux 上水土不服,你用安卓呢
现在 Android 有 Credential Manager,理论上各种密码管理器、Passkey Provider、硬件认证器都可以参与凭证选择
Yubico 甚至专门做了 YubiKey Passkey Enabler,让 YubiKey 可以出现在 Passkey 流程里
- 听起来很先进,来,打开某个网站,创建 Passkey
- 网站:Google Password Manager
不是哥们我更多选项呢?
不是哥们我 Yubikey 呢?
不是哥们我第三方密码管理器呢?
- 我:已安装
- 系统:我看的到
- 网站:今天你只配用 Google Password Manager。
最经典的参数之一是:
authenticatorAttachment: "platform"也就是说,网站只接受官方的认证器,安全密钥与外置密码管理器
和狗不得入内你支持 Passkey 支持了个寂寞!
第四关:每个网站都有自己的 Passkey 哲学
累了,毁灭吧
- Pixiv 型:高冷御姐,直接告诉你不支持
- X / OKX 型:土豆做的,使用 Passkey 登录非常成功的触发了未知错误
- WhatsApp 型:
TM 非死不可滚出去,只能添加一个通行密钥 - GitHub 型:老实人,会告诉你
This browser or device is reporting partial passkey support.,并且一次添加即可搞定一键登录和二验登录 - Discord 型:精神分裂患者,输入密码以后什么也不发生,但换一种 “不需要密码” 的登录路径,Passkey 又能正常使用
- Kraken 型:今天是 Passkey,明天是 Security Key,后天晋升 Master Key,十分甚至九分的折磨人
- Spaceship 型:纯馋 Yubikey 身子,Passkey 验证一次,Device Key 再验证一次,F*** 了两次 Yubikey
Linux 是 Passkey 最残酷的父亲
在 Android、iOS、Windows、macOS 上,一个写得不够通用的 Passkey 实现,仍然有可能因为系统自动密码管理器而显得一切正常。
但出了这个社会来到 Linux,没人会惯着你
请看 VCR:
- 网站发起 WebAuthn
- 浏览器环顾四周
- 平台认证器没有
- 只有一把 YubiKey
- 小小的网站哪见过这阵仗,直接吓得触发了未知错误
真正的问题不是 Passkey
WebAuthn 本身其实没有这么混乱,它区分得很清楚:
- 如果你已经知道用户是谁,可以通过
allowCredentials指定其凭证 - 如果你希望真正无用户名登录,就使用
discoverable credential - 如果你想允许平台认证器和外置认证器,就不要没事把
authenticatorAttachment锁死 - 如果用户有多把密钥,就允许注册多个
credential - 如果要高风险操作二次确认,就做
step-up authentication
标准从来没有要求产品把这些东西揉成一团
真正的问题在人这边,某公司:
- 规划时:我们要支持 Passkey,这样我们才能抢用户
- 测试时:Chrome + Android + Google Password Manager 可以创建并登录
OK 兄弟们我们已经是前沿科技企业了,We now support Passkeys!
至于:
- Linux
- Firefox
- YubiKey
- 两把硬件密钥
- non-discoverable credential
- resident credential
- 无痕模式
- 第三方密码管理器
- Android Credential Manager
- 无 Google 账户环境
- 跨平台认证器
阿巴巴,你不是我们的主要用户,滚
Passkey 本来应该更简单
对于用户来说,整个产品模型本来只需要两种东西。
安全密钥
用途:已输入账号密码,用 YubiKey 二步验证
可以创建 non-discoverable credential,界面就叫:添加安全密钥
通行密钥
用途:不输入用户名,不输入密码,直接认证登录
那你必须创建 discoverable credential,界面就叫:添加通行密钥
然后允许用户自己决定私钥放在哪里:
- Google Password Manager
- iCloud Keychain
- 1Password
- Bitwarden
- YubiKey
- 其他兼容认证器
你作为一个网站,不应该操心用户把这玩意放哪里,就算放鞋盒里也是用户的选择!
为什么 Passkey 还没统治世界
因为它现在面临的最大问题,已经不是密码学,而是用户无法建立稳定预期。
密码虽然烂,但用户知道密码是什么!密码框就是密码框!输错了就是输错了!
反观 Passkey,用这玩意就像开盲盒!
一种本来应该把身份认证变简单的技术,最后要求用户理解
resident credential、credential Manager、platform authenticator、cross-platform authenticator和各种产品私货。你普及你 mua 呢
Passkey 真正成功的那一天,应该是用户再也不需要知道这些词,他们只需要知道:
- 我有一把钥匙
- 点登录
- 摸一下
- 进去了
在那之前,每一个 Linux + YubiKey 用户,大概都还得继续兼职 WebAuthn QA
而且还是没有工资的那种
- 收藏支持反对打赏

太长了
windows 上太垃圾了

本论坛支持 Passkey 登录

给你个入口完成下 KPI 就行了,还真想要它有多好用啊
两边同时水十八
@Showfom #3
知道,这个功能确实很好用发这篇文章只是想吐槽下那堆做的层次不齐的 Passkey 接口,越用越气人


@纳西妲 #6 点名 Microsoft 365
passkey 最 sb 的设计就是,跨设备认证的时候明明用蓝牙了,却还是要走供应商的网络来传输信息

@CodeHz #8 这个才是精辟,不能再赞同了

你好,YubiKey 用户的体验就是这样的,自适应一下。
TOTP 这么多年都没普及全,指望普及 WebAuthn 还是太早了。
各种奇怪的系统、浏览器兼容问题,舒服的时候能让你舒服,不舒服的时候:- 给 FIDO 不给 FIDO2,你 YubiKey 只配当两步验证器。
甚至还要求userVerification,必须输入 PIN,而不是摸一下 YubiKey 就完事,你一个两步验证搞这么严?没错,说的就是你,Cloudflare。 - 给 FIDO2 不给 FIDO,也行,占我一个存储位,属于我不够富裕,选择不买新版换掉只有 25 个存储位的 Cloudflare 批发货 5.4.3 的问题。
- 只给你注册一把硬件密钥,就指望着你搞丢了后蹲墙角哭。没错,说的就是你,PayPal。
- 明摆着只考虑存到系统的密码管理器的场景,硬件密钥是没听说过的。想正常保存到 YubiKey 并能用还得配合第三方软件,比如 Authnkey。没错说的就是你,Discord。
- 不给你 Passkey 登录按钮,Chromium 没事,Firefox 用户吃瘪吧,说的就是你搬瓦工的 KiwiVM。
系统支持拉一点,浏览器支持拉一点,网站支持拉一点,你体验到的就是拉中拉中拉。
- 给 FIDO 不给 FIDO2,你 YubiKey 只配当两步验证器。

不过用 1password 好像还没遇到不能储存和使用 Passkey 的情况