- 已编辑
- 1楼
やる気,元気,パスキー!
——题记
是什么
Passkey(中文翻译为通行密钥)是一种技术,旨在替代密码进行身份验证。它由 Fido 联盟提出,并联合了 Apple、Google 和 Microsoft 三大巨头共同制定此技术。
通过此技术,你将不必再费脑记住一大堆密码,只需使用你的脸、指纹、PIN、另一台设备或者安全密钥(一种设备,一般为 USB/NFC 设备)即可快速安全地登录。
为什么
在开始之前,首先先让我们了解一下身份验证的概念。
早在计算机及网络出现前的时代,人们就意识到在需要经过好多个驿站的传播途径下,需要一个有效的方法来证明传送的文书有效性。
对于文件内容的真实可信度,大家通过令牌(或者徽章一类的东西)来确保传送文书的人是可信的。
对于撰写人是否有权发布此命令,他们会盖一个印章来进行标记。
现代基本沿袭了这个概念,即使用加密、校验等技术保证内容的完整性,并通过(新概念的)令牌来确定信息发送者的身份。不过无论在古代还是现代,令牌都是需要获取的,而且不像古代人们可以当面碰面拿令牌,那么我们如何可以拿到表明自己身份的令牌,同时还能保证别人不能拿到呢?
(注:本文专门讨论身份验证方面,不会讨论传送内容本身的技术。)
这就是互联网对于所谓“登录”这一过程技术不断改进的过程了。
每次登录时,我们都需要发送能够证明自己的身份信息到目的地,以便目的地能够向我们发送令牌。两地之间的路线非常多,而传输可以走任意一条路(包括一次往返都可以走不同的路线!)。而黑客可以守株待兔(他们不会对令牌感兴趣,因为拿到几乎不会改变的身份信息的价值远大于总是改变的令牌,传输路线那么多,他们捕捉到有价值的信息的机会并不多)在某个路线上,为了防止被觉察到,他们只能选择复制信息并继续发送信息,而不能拦截。黑客的目的是拿到身份信息,以后便可以此冒充他人——盗刷信用卡、发送诈骗信息,等等。
来看看人们做了什么。
1. 用户名+密码+加密
这是最原始的方法了。人们第一次约定一个可以加密和解密的密码本来加/解密用户名+密码,保证中途无人能够阅读,以后每次“登录”都发送加密的用户名+密码来验证身份。但是——既然可以加解密,那么黑客就可以动用巨量资源来暴力破解你的信息,反正密码本从来不会变,而且凭人类的大脑,很难做到对每一个网站都使用唯一且复杂的密码。总有一天暴力破解之后,你就惨了。
另外依靠你的设备来记住它们也不是最优解。Chrome 最近在密码管理器上出了些意外,导致用户无法访问已保存的密码。另外再考虑一下设备丢失的可能性……
此外需要顺便提一下由 cookie 实现的“记住我”免登录,本质上是用 cookie 信息代替了你输入用户名+密码。但是无论你用什么方式访问同一个站点,总是会发送同样的 cookie,即保持登录状态,即使你是从其它网站点击了链接也是如此(如从必应进入咱论坛也可以通过 cookie 保持登录状态)。坏处是如果你在钓鱼网站上点击了一个链接,恰好是信用卡网站的自动转账链接而且你还登录了,那么你就会立刻破产。
现代一般使用额外的 CSRF Token(只能由相同网站添加)在关键链接上进行防护,因此这个是大可放心的。
此处不多赘述,感兴趣可自行了解更多。
2. 短信/邮件验证码
那么咱在第一种方式的基础上再发个短信给你吧——手机总肯定是你的吧?而且验证码总是会变,轻易是猜不出来的(6 位数存在 106 种组合)。因此,即使黑客拿到了你的信息,难道还能做到每次都正好看到你的验证码?
理论上是这样的,但如果有一天你手机丢了呢?更糟糕的是,通过你的手机号码往往还能直接重置密码,那可比暴力破解省事多了。
邮件验证也是如此。
3. TOTP(二次验证)
那既然这样,咱的验证码就不发给你了,自己弄去吧——第一次给你一个随机内容,让你以后对这个内容进行一系列的操作之后仅发送它的一部分给目的地,然后目的地再自己操作一遍看看是不是一样的,就能确定是你。
这一系列内容标准化后就是二次验证,二次验证应用程序将随机内容和当前时间进行一系列操作之后转成十位数,再把末尾的六个数字显示出来让你填给目的地就是了。举个简化的例子:我把一串随机数字乘以20240731125633(2024 年 7 月 31 日 12:56:33)后得出的末尾六位数是 002489,请问那个随机数字是什么?
显然是不知道的吧~同时随机内容只传送一次,被截取到并破解的概率也很小。即使你的手机丢失,但内容都保存在你的手机上(要破解手机访问数据比破解你发送的数据远远困难的多)因此这个方法的安全性已经具有了一定提升,但仍然不方便。
4. Passkey
请出本文主角!
Passkey 试图解决一直以来身份验证上的一些问题:
- 安全性低;
- 麻烦(需要记住密码,如果再加上二步验证会更繁琐)。
你可以把它看作更高级的密码,但目的地和发送点都在做计算:
- 注册的时候,你的设备生成一对公私钥对,将公钥发送给服务器,私钥保存在设备上;
- 登录的时候,你的设备使用私钥加密某些无关紧要的内容(这个过程也被称为私钥签名),然后发送给服务器,如果服务器使用正确的公钥解密了它,服务器就会知道是你,从而完成身份验证。
(关于非对称加密,这个是我能找到的最容易理解的内容了)
非对称加密的暴力破解所需的算力水平目前任何一台计算机都无法提供,而且公私钥对的复杂度远高于人类日常密码,更不可能靠猜测得出。此外,由于私钥保存在设备上,因此也难以窃取。Passkey 在安全性方面大大胜过密码。
上文中提到过的利用 cookie 漏洞来完成恶意身份验证也已经被 Passkey 考虑在内。每一个 Passkey 都仅针对一个网站,其它网站无权使用,即使在正确的网站上,使用 Passkey 也需要经过你的确认,让恶意身份攻击无从下手。
至于便捷程度,Passkey 由你的设备帮你输入,只需要确认是你在执行身份验证操作即可,而确认是否是你的方式也是多样的。如果你使用脸、指纹或安全密钥作为解锁因素,那么你根本无需动脑子,解锁速度在十秒以内(保守,实际往往更快),即使你使用 PIN,也已经可以使用更加简单的密码(就是你平日里根本不敢在网上设置的那种低安全度密码),熟练之后在键盘上噼里啪啦两秒钟就可以通过。
由此可见,Passkey 相对密码+验证码在便捷性和安全性上均占有优势,因此它是我们登录时的一个更好选择。
怎么做
作为一个用户,你所需要做的事情非常简单。Passkey 在各个平台上行为一致,你只需要在它提供的选项中选择一个,让它用一种方法记住你的独特特征,以后它就可以“确认你是你”,并帮你登录了。
特别提醒:Microsoft 在某个时间点后缩小了 Windows Hello 的限制,如果你既不想用另一台设备电脑也不支持 Windows Hello 生物验证更没有所谓安全密钥,那么你可以设置 Windows Hello PIN 作为验证选项,即使你在本地账户上,也不必再费心设置一个 Microsoft 账户。
(不过 Apple 还要求在本机存储 Passkey 时需要 iCloud 钥匙串,否则需要另一台设备或安全密钥,这个就看各位的了)
你可以在 WebAuthn.io 练练手,体验 Passkey 的实际效果。
对于开发者,也不必感到退缩。许多库已经推出来加快适配 Passkey 的过程,加入 Passkey 的速度会更快,而用户会对此功能的加入感到满意。
对于论坛和使用 Flarum 的网站来说,这更加容易:只需安装此扩展即可。
常见问题解答
- 我已经可以使用 Passkey 了吗?
Microsoft 在 Windows 11 22H2 上推出了对 Passkey 的支持。Apple 向 macOS Ventura、iOS & iPad OS 16 提供 Passkey 的完全支持。旧版操作系统可能也支持此功能,但功能一定是不完全的。此外,此功能也取决于软件(如浏览器)的支持程度,因此建议使用最新版本的软件。 - 在设备上输入 PIN 和使用密码有什么区别?
区别很大!密码被传送给服务器作为直接登录的凭据,但也意味着被拿到或猜测出来的可能性大。但设备上的 PIN 是为了让设备访问 Passkey,PIN 本身是不会对外发送的。把 Passkey(处理的用于验证的信息)传送给服务器更安全也更难被破解。就算有人有心想猜你的 PIN 来获取对 Passkey 的访问权限,那也要先拿到你的设备再说。 - Passkey 可以跨设备使用吗?
各平台正在努力推进 Passkey 的跨设备同步,目前 Apple 已经通过 iCloud 支持此功能,而 Microsoft 正在 Windows 11 24H2 上开发此功能。因此只需等待同步功能可用。 - 对 Passkey 可能会有什么误解?
一个常见的误解是 Passkey 与你的信息息息相关。实际上,Passkey 生成的公私钥对并不取决于你的信息,即使拿到它们也无法反推出你的信息。这也意味着不是只要使用你的脸、指纹或是别的什么就可以在任何设备上使用相同的 Passkey 来登录同一个网站,因为生成的公私钥对永远是唯一的。因此,跨设备使用 Passkey 的唯一方式就是同步这些生成的公私钥对,你的信息仅用于确定你有权使用它们登录。
在同一个地方也可以拥有多个 Passkey。它们来自你的不同设备。在同一个设备上,你也可以通过多种方式获得 Passkey 的访问权限。
此外也有人可能认为 Passkey 是一种网络技术。实际上我在选择本文主题时有些犹豫,因为 Passkey 实际上并不与网络高度绑定。正如密码可以打开保险箱等具有登录以外的用途一样,Passkey 也可以通过使用正确的 API 在浏览器之外的地方(包括原生应用程序上)使用。
最后,Passkey 也不会完全取代其它的登录方式。Passkey 依赖于设备,若你正在一台陌生的设备上登录网站时,你可能无法访问你的 Passkey,因此你仍然需要密码。不过,你确实需要把密码们变得更复杂、更难以猜测。 - 为什么本篇文章中不使用 Passkey 的中文名称?
呃,主要是因为我觉得既然 Password 被翻译为“密码”,那么 Passkey 就该叫“密钥”(微软使用此翻译),但其更广泛的翻译是“通行密钥”。在翻译不统一的情况下,使用 Passkey 最没有歧义。
虽然说微软正在慢慢把翻译从“密钥”调整为“通行密钥”,但我要坚持己见 - 为什么我还没看到过一个使用 Passkey 的网站/应用?
不幸的是,在国内你可能并没有多少机会能够用到 Passkey。虽然短信验证码有一些缺点,但通过手机号获得的用户数据及其带来的利益对于国内厂商实在是太过于诱人了,因此他们不太可能会放弃现有技术改用 Passkey。
快跑!
外部链接
Windows 中对密钥的支持(Microsoft Learn):https://learn.microsoft.com/zh-cn/windows/security/identity-protection/passkeys
通行密钥概览(Apple Developer):https://developer.apple.com/cn/passkeys/
建议在互联网上搜索以查询针对你的平台提供的 Passkey 官方使用指南。
本文由于撰写仓促,行文及内容上肯定存在不足之处。如有发现纰漏或改进建议,欢迎提出,不甚感激。