通行密钥是个陷阱

查看原文 HN 讨论

文章摘要

这篇文章发表在 Substack 通讯 Non-Functional 上,作者署名 The Hack,完整标题是《通行密钥是个陷阱,别用它》,副标题注明”目标读者:不懂技术的普通网民”。文章很长(有读者抱怨足有 5000 字),核心论点是:通行密钥(passkey)在技术上确实优雅,也确实比密码安全,但它的标准里藏着一个”旋钮”,能让网站逐步收走你对自己登录凭据的控制权,作者把它比作特洛伊木马。

谁在推通行密钥。 通行密钥出自 FIDO 联盟,成员包括大型科技公司、小公司、各国政府、情报机构、银行、公共机构,以及 Mozilla 等少数非营利组织。作者调侃各方动机:大公司想给生活制造点小麻烦好多卖广告,情报机构想追踪所有人,银行想摆脱赔偿责任,小公司想要便宜的方案降低责任,Mozilla 想避免在任何一座山头上战死。他说这些动机不一定坏,但值得注意的是联盟里没有任何消费者权益组织;相比之下,制定网页标准的 W3C 除了企业,还有公益团体、大学和万维网发明者 Tim Berners-Lee,”就算甘道夫加入 W3C 也不会显得格格不入”。

密码和 TOTP 的优点。 作者同意密码不安全,举了 SolarWinds 服务器用 solarwinds123、夏威夷应急管理局员工把密码便利贴拍进照片等例子。但密码直观,人人会用,你自己决定存在哪、给谁看。他特别推崇基于时间的一次性密码(TOTP,也就是”验证器应用”):它基于公开标准 RFC 6238,不依赖短信、邮件甚至网络,用什么软件硬件生成都行,手机、电脑乃至 90 年代的 Game Boy 都可以,自己用 Python 写也行;验证码几十秒就过期,泄露了风险也很小;你还可以把验证码甚至种子密钥发给朋友,让他临时登录你的 Netflix。全文反复插入一句”(Netflix 不希望你共享……)”作为点题的笑料。

“通行密钥”其实是一大堆东西。 作者用自由开源软件生成了一个通行密钥,用邮件发给朋友,两人都能登录同一个网站,没有征求任何人同意。表面看,通行密钥和 TOTP 一样有开放标准(WebAuthn),一样自由。但问题在于,FIDO 联盟把许多截然不同的东西都叫作”通行密钥”,他认为这是故意的,好让用户不去细看。WebAuthn 规范本身很少用这个词,里面有可发现凭据和不可发现凭据、硬件支持和软件支持、经过证明和未经证明的凭据等等,可选项多到”读起来不像标准,更像零件目录”。他逐一介绍了这些变体,并尽量从正面解释每一种存在的理由:

转折点:证明(attestation)。 作者指出,标准规定通行密钥软件必须通过”认证器数据标志”告诉网站这些特性开没开。于是网站可以说:我们只接受需要用户在场、经过验证、不可复制、硬件支持的通行密钥。当然,你可以自己写个软件,用文件存密钥,再对网站撒谎说自己符合所有条件。但有一种通行密钥是撒不了谎的:经过远程证明的通行密钥。它借助设备里防篡改的加密芯片,以密码学方式证明你用的是少数几款获批的通行密钥管理器,而不是你自己用 AI 写出来、会撒谎的那种。远程证明需要加密芯片、密钥管理软件、操作系统和固件全部配合;如果你的手机停止安全更新,你刷了 LineageOS 之类的第三方系统继续安全使用,网站就能察觉并拒绝你登录。

作者认为,现在大多数网站还不要求证明,但只要你用了通行密钥,就等于向网站表明你的设备支持这套标准。等某个网站确认绝大多数用户不受影响,就可以”拨动开关”,也许每次只针对一万个用户以免引起骚动,开始拒绝未经证明的通行密钥。他也承认远程证明有正当用途,比如防止误装骗子做的假密钥管理器、确认软件没被黑客篡改。但不想要它的理由同样充分:你可能想用网站不认可的软件,比如 Linux,或者一台刷了新系统的旧手机。

不只是 Netflix 的问题。 他预计行业会先几乎不设限制,再在不同网站上错开时间、逐步增加限制,几年后人们会忘记自己曾经有过选择。他让读者”戴上锡纸帽”想一想:情报机构和微软为什么要关心你是否共享 Netflix 账号?他的答案是,这些机构和公司真正的目的可能是阻止你运行未经批准的软件:远程证明可以确认你的设备不能收发加密消息、不能运行竞争对手的应用、不能不验证身份就上社交媒体、不能关闭内置的 AI 图像扫描。他举了浏览器扩展的例子:他用扩展屏蔽自动播放、过滤广告和 AI 摘要、屏蔽 YouTube 推荐,可 Google 今年已经让 Chrome 不再支持 uBlock Origin,有了远程证明,还能阻止你换用不跟进的其他浏览器。他还指出,认证器数据标志在早期版本只有 4 个,2022 年 WebAuthn 第 3 级又增加了一些,用来表明凭据是否可复制、是否有备份,另有两个标志”保留给将来使用”。他说自己不搞滑坡论证,但这项技术的普及会让”方便识别政治异见者”这类法律变得容易执行。

他的建议是:如果你在乎隐私、相信人们应当能自由选择设备上运行的软件,就拒绝这些名字都叫”通行密钥”的几十种机制,等大公司拿出同样方便安全、但定义更清晰、附加条件更少的方案;在此之前,想要比密码更安全,就用 TOTP。文末附言里他又补了一句:通行密钥还有一个最好的安全特性他没提,就是它在多数情况下与域名绑定,能抵御中间人攻击;它有很多出色的特性,可惜 FIDO 联盟塞进了远程证明,又没让用户分清不同类型。如果想要高安全又不想被绑住,可以用 YubiKey 这样的实体安全密钥,它们同属 WebAuthn 标准,但因为是独立设备,远程证明要求不会蔓延到锁死整个操作系统。

HN 评论精华

本帖 1140 分、570 多条评论。讨论高度技术化,大致分成两派:一派认为作者对远程证明的担忧是杞人忧天,并批评文章刻意回避了通行密钥最核心的防钓鱼能力;另一派认为科技公司”温水煮青蛙”的套路屡见不鲜,担忧并非多余。不少人还吐槽通行密钥在实际使用中的种种不便。署名 nonfunctional 的用户在评论区多次回应,从发言内容看应是作者本人。

证明能否”事后要求”? 最大的一串讨论由 agwa 开启。他指出证明只能在注册凭据时要求,登录时无法回溯要求;而且网站一旦请求证明,浏览器会弹出权限提示。他怀疑 Netflix 和 Twitter 根本没有在注册时请求证明,因为苹果的通行密钥实现压根不支持证明,所以作者设想的”等大多数用户都用上经过证明的密钥再拨动开关”并不现实。他承认证明是 WebAuthn 规范的一个污点。throwawayffffas 反驳:网站完全可以拒绝旧密钥,要求你重新创建一个经过证明的,”他们明天就可以开始”,而且最先这么做的会是银行。lxgr 回应:他们明天也可以要求你寄 DNA 样本;何况美国的银行连双因素认证都没普及。agwa 反问:”那他们要放弃所有苹果用户吗?”WorldMaker 和 lxgr 补充,苹果消费级设备刻意不支持证明,只有企业管理的设备才支持;苹果过去支持过、后来主动放弃,说明他们是有意转向云同步路线。jeroenhd 也说苹果是唯一不实现证明的大厂。

“温水煮青蛙”是老套路。 xg15 的回复获得大量认同:科技公司推行对用户不友好的功能,总是先说”这是全新的可选功能,跟你无关”,再变成”默认开启,但有个按钮可以关”,然后”默认开启,关闭选项藏在高级设置里”,一步步走到强制。stavros 说这条评论让他从热爱通行密钥变成”或许该小心点”,但他认为这是政策问题而非技术问题,需要用选票捍卫计算自由。aidenn0 举了 2026 年的两个亲身例子,比如网站直接说不支持 Firefox,”我以为被送回了 20 年前,只不过主角换成了 Chrome”。hn8726 担心的路径是:先劝大家都用通行密钥,再宣布不需要密码了,最后才慢慢要求证明;联想到欧盟”聊天监控”提案,他觉得并不牵强。一位业内人士 unscaled 则说,现实中大多数公司对改变用户认证方式极其保守,因为担心影响转化率和兼容性。

防钓鱼才是重点。 danpalmer 点出文章最后一条脚注的讽刺之处:作者自称”为通行密钥做了有力的辩护”,却直到附言才提到最初推动通行密钥的核心安全特性。他认为文章对 FIDO 联盟处处假设恶意,却忽视了防中间人攻击正是关键设计目标,联盟成员每天都在处理被盗账号,通行密钥基本解决了这个问题。tgma 措辞更激烈:钓鱼是头号攻击手段,密码加一次性验证码都能被钓走,通行密钥的签名与域名绑定、无法转发,单凭这一点就值得;”一篇长文讨论通行密钥,通篇没出现 phish 这个词,我没法认真对待”。kevin_nisbet 补充,TOTP 是共享密钥,服务器一旦被攻破,攻击者可以不留痕迹地冒充用户。MBCook 说通行密钥即便从网站数据库泄露也毫无用处,因为那只是公钥。反方 kccqzy 认为钓鱼没那么普遍,密码管理器也会检查域名,自动填充失效时用户就会察觉;throwawayffffas 说公钥基础设施本来就能防中间人,让密码管理器检查证书就行。

用密码管理器存通行密钥行不行? bmitch3020 至今没有主动启用通行密钥,因为他想要可移植性,想把凭据备份锁进保险柜,也不认为解锁手机的指纹和密码管理器里的长密码一样强;他曾被迫使用只能存在厂商应用里的通行密钥,结果直接注销了账户。BadBadJellyBean 说他把通行密钥存在自托管的 Vaultwarden 里,KeePass 加插件也行。crote 指出问题在于注册新密钥时必须在线,离线放进保险柜的副本很快就会过时。embedding-shape、tennysont 都吐槽 1Password 的通行密钥无法导出,tennysont 说这让 1Password 在他心中失去了”好人”地位,他发现后手动删掉了二十来个;rufo 提到 FIDO 已经有了在密码管理器之间安全交换通行密钥的规范,苹果、1Password、Bitwarden 等都已实现。david_shaw 认为文章写得好但结论不对:既然 TOTP 本来就要靠应用生成,用 Bitwarden、KeePass、1Password 这类灵活的管理器存通行密钥同样能让用户保有控制权,体验还好得多。cvadict 回应说,他已经在实际中遇到过要求必须存在电脑 TPM 里、不能放进 Bitwarden 的通行密钥。作者 nonfunctional 也回应,KeePassXC 等确实给了用户完全控制,但它们不支持远程证明和硬件支持,”我的论点不是通行密钥原则上不能给你控制权,而是标准轻易允许网站阻止你行使这种控制”。deltoidmaximus 和 coldpie 都引用了 KeePassXC 在 GitHub 上的一个议题,其中一位通行密钥开发者警告 KeePassXC 可能会被依赖方屏蔽。

一位通行密钥支持者的体验。 oefrha 在自己组织的内部系统里已经彻底废除密码、只用可发现的通行密钥,所以看到这种战斗口号式的标题本能地抵触。但他承认文章有真实之处:1Password 最近开始强制要求用户验证,他在没有 Touch ID 的台式机上,登录不少网站时都得输入登录密码才能用通行密钥,”我 15 年前注册 1Password,可不是为了既输复杂的主密码又输复杂的登录密码,’一个密码’的契约 15 年后突然被打破了”。

标题与受众。 Grombobulous 说标题让人反感,他喜爱的通行密钥给他省了大量时间和麻烦。作者回应说,目标读者是还没开始用、或者被网站催着刚用上却不了解它的人,他为标题的挑衅道歉,并说考虑过在标题里用”特洛伊木马”。MBCook 则说:想让我不读一篇文章,最好的办法就是一上来就把它骂一顿。dewey 转了苹果一位长期负责通行密钥、对外非常坦诚的工程师在 Mastodon 上的回应,认为作者”把复杂的东西故意描绘成可疑的”;kccqzy 则逐条反驳了这位工程师的观点。

其他声音。 raphting 说他公司的产品只用通行密钥,因为通行密钥通常会同步备份,连找回密码流程都不需要,所以用户不想留邮箱也可以。gumby271 担心哪天母亲遇到只支持通行密钥的网站:她懂密码,密码写在小本子上,在任何电脑上都能登录,要解释通行密钥如何在设备间同步太难了。Diggsey 和 donmcronald 吐槽,通行密钥请求出现时,密码管理器、浏览器和操作系统抢着接管,选错了就没法撤回。小型 SaaS 从业者 Gigachad 说,用户一个密码用在上百个服务上导致账号被盗的事情天天发生,他不得不强制开启双因素认证,而通行密钥更安全也更省事;作者回复建议同时支持 TOTP 和实体安全密钥,并且永远不要求远程证明。chr15m 主张”不喜欢就抵制,只要有足够多的少数人拒绝,他们就得保留其他认证方式”,cowlevel 说至少得是多数人才行。dingaling911 让大模型写了一段屏蔽通行密钥请求的用户脚本,megous 提醒这会连带禁用所有 WebAuthn 第二因素。devsda 担心 Linux 也会走向”可验证计算”,变成获批发行版与未获批发行版之分。