Passkey(通行密钥)全面介绍 - 无密码的未来

互联网已经高速发展数十年,但是登录方式却没有太大的进步,许多网站依然在使用传统的密码登录,而密码登录面临的最大挑战之一是需要为每个站点选择 强大、唯一的密码,然后记住它们 , 否则你就不得不重复使用你的密码。为了能够记住多个强密码,用户往往借助像 Google Password Manager, iCloud + KeyChain 钥匙串, 1Password, bitwarden, LastPass 这样的密码管理器,它使用一个主密码或密钥从数据库中提取正确的密码,下次访问时可以自动根据网站域名填充对应密码。但是它们大多数需要付费 ,而且对于非技术人员来说使用起来可能很麻烦,最关键的隐私和安全问题依然存在风险, 如果你想多设备多平台使用,你的密码存在哪里是一件值得探究的事情,即便使用密码管理器也是存在风险的,如果您的密码管理器搞砸了,您的所有密码都可能被泄露。比如 LassPas就出现过多次安全事故并造成用户数据泄露 : Security Incident December 2022 Update - LastPass

基于 Oauth2.0 提供的第三方授权登录很大程度上缓解了登录和注册帐号的糟糕体验, 但由于密码登录安全性十分脆弱,很多网站会强制要求一段时间内用户重置密码,且密码必须符合一定强度,或者强制要求开启 2FA,MFA 多因素身份验证, 比如 Github 从 2023 年 3 月开始, 要求在 GitHub上贡献代码的所有用户启用一种或多种形式的双因素身份验证 (2FA), 还有更常见的 Apple ID,也是默认即开启 2FA 。尽管能提高安全性,但同时也增加了额外的步骤,给用户带来更重的负担。用户往往需要在设备安装相应的身份验证器(Authenticator),如 Google Authenticator , Microsoft Authenticator, Authy, Okta verify, 腾讯身份验证器 等。

毫无疑问, 行业需要一种标准的方式,让人们无需密码即可安全登录。在2022年6月份,Apple 通过 WWDC 上正式宣布 Passkey 的亮相,带进了公众的视野。随后,来自世界各地的数百家技术公司和服务提供商在 FIDO联盟 和 万维网联盟(W3C) 合作, 领头的则是 Apple, Google 和 Microsoft ,确保以跨多个平台的方式实施 通行密钥(Passkey),来作为密码的更简单,更安全的替代方案。这几家科技巨头在行业内的号召力有多强,无需多言,「无密码的未来」或许已经到来。

Passkey 介绍

Passkey 是 Web Authentication(或叫WebAuthn)的一部分,它是一个新的网络标准 ,是 FIDO 联盟开发的最新技术。WebAuthn不使用用户名和密码,而是使用公钥加密原理来验证您的身份。

基于 FIDO 标准,Passkey 可以替代密码,让用户可以更快、更轻松、更安全地跨设备登录网站和应用程序。与密码不同,Passkey 始终很强大且能够抵御网络钓鱼, 通行密钥 这个翻译挺贴切。

Passkey 特点

  • 安全
  • 用户体验良好,无需记住任何事情
    • 当要求用户登录应用或网站时,用户会使用与用户解锁设备(手机、计算机或安全密钥)相同的生物识别或 PIN 或设备端密码来批准登录。应用或网站可以使用此机制来代替传统的用户名和密码。跨设备,跨平台 (目前还未完全实现)
  • 无感丝滑,自动发现,自动填充
    • 就像现在的密码管理器一样,帮助您使用现有的Passkey,即使您不记得以前为该网站或应用程序注册过密钥

Passkey 和 Oauth2.0

现在基于 Oauth2.0OIDC 不是已经可以实现通过 OTP(邮箱一次性代码),SMS(手机验证码) 无密码(Passwordless)了吗? 为什么还要搞个 Passkey ?

关于这点,可以参考 Oauth官方对Passkey的解释: 简单来说就是, Oauth(2.0) 是一种授权框架,而不是身份验证协议,OAuth 协议支持多种不同类型的身份验证和授权(准确地说是 4 种),而 Passkey 是对用户进行身份验证,Passkey 不会因此而取代 Oauth, Passkey 取代的是在 Oauth 中用户输入密码的步骤。也就是说 Passkey 和 Oauth 是协同工作的关系,而非相互取代的关系


如果是关于授权(authorization)和验证(authentication)有疑惑,可以自行参考其他文章,我就随手放一篇了 认证和授权有什么区别?- freecodecamp

Passkey 工作原理

说白了, Passkey 就是用密钥对验证代替传统的密码作为登录凭证,原理和 HTTPS中的SSL/TLS 验证是类似的。Passkey 就是一对密钥,是公钥(Public key)私钥(Private key)

使用 Passkey 登录时,网站存储了用户的公钥,而用户的私钥存放在本地设备(电脑或手机)中,通过给服务器发送私钥签名,服务器验证签名无误,即登录成功。

创建 Passkey

  1. 检测当前设备是否支持 Passkey,是则继续
  2. 点击给账号添加 Passkey,浏览器向网站服务器发送请求,获取创建 Passkey 所需要的 options (网站信息, 用户名,网站地址等)
  3. 浏览器调用 Web Authentication API 也就是 navigator.credentials.create() 方法并传入上一步的 options 参数来要求用户进行身份验证以创建密钥,通过设备验证(比如FaceID)后生成一对私钥和公钥,随后会将 私钥,用户名以及网站地址作为 Passkey 存储在设备中 (可以是手机芯片,U盘),并将公钥发送到对应网站。网站服务端收到公钥和用户名,存入数据库中,Passkey 凭据创建成功。

使用 Passkey

  1. 当下次您使用 Passkey 登录该服务时,浏览器向服务器发起请求,获取凭据认证所需的 options 信息,浏览器调用 navigator.credentials.get() 方法,传入上一步获取的 options ,并将使用与您的帐户绑定的公钥 为您的设备创建随机质询(challenge)
  2. 此时,浏览器调用操作系统接口弹出对话框要求用户选择进行身份验证的密钥并进行身份验证,随后利用存储在您设备上的私钥解决该 challenge,验证身份成功。

Passkey 应用

需要注意的是,Passkey 需要设备或者系统软件等相关方面的支持。

以苹果设备为例,iPhone 需要 ios16 以上,IpadOS 16, MacOS 需要 13以上(ventura), 并且需要开启 iCloud 钥匙串(iCloud Keychain) 和 2FA(two-factor authentication) 双重身份认证。

Apple

Google

Microsoft

Passkey 展望

用户不会被迫使用Passkey技术,但更多的网站和应用程序将开始提供密钥作为选项。

Passkeys.directory 可以用来了解已经支持 Passkey 的网站, 可以看到许多网站已经陆续跟进支持 Passkey, 其中不乏 Adobe, Amazon, Github, Microsoft, Nvidia, 任天堂, Paypal, shopify, Tiktok, Uber 这样的行业巨头。 同时由于Apple,Google,Microsoft 三巨头的联手合作,可见的未来可以预想这会变得更加标准化,得到更广泛的支持。相比之下,国内支持Passkey的网站还不多,也许是因为国内互联网要求实名制,必须通过手机号验证 😢。无意中发现 廖雪峰的博客 已经支持使用Passkey了,国内的小伙伴可以抽空体验体验,国外的可以体验 Passkeys.io

其实在写这篇文章的时候,我就已经把常用且支持 Passkey 到网站服务都添加到 1password 里了,每次登录只需要点击一下就登录进去了, 整个流程完全无感,能够切实地感受到无密码的未来正在到来,但目前各平台各设备的协同能力依然需要得到更广泛的支持, 否则就得掏出手机扫二维码, 因为这种登录体验和和每次在电脑登录微信都得掏出手机一番操作一样非常割裂, 好在Apple,Google,Microsoft 等厂商已经开展合作且取得相当程度进展,相信未来的无密码登录体验将会非常无感丝滑~

Q & A

Passkey 支持哪些方式?

Passkey 支持解锁设备的方式来验证用户身份, 比如面部识别 (例:FaceID), 指纹识别 (例:TouchID), 二维码 (QR Code), Pin (个人身份码) 等方式。

如果设备丢失,找到它的人可以使用您的密码吗?

非法获得你设备的人需要访问设备以及指纹、面部 ID 或 PIN 才能解锁它。如果有人丢失了设备,他将无法在没有生物识别身份验证的情况下访问信息。

你可以设备丢失后通过其他设备或者密码来在服务端管理你的密钥,删除丢失设备对应的通行密钥。(如果你只有一台设备,)

SSl/TLS 在70年代就出现了,为什么一直用密码登录,直到 Passkey 才使用密钥?

非对称加密是目前加密强度最高的加密技术,原因在于若无私钥,以目前计算机的算力想要在有限的时间内完成极大整数的因数分解是几乎不可能的 ,如果能被解密,说明对方拥有私钥, 这是我们信任非对称加密的前提。 可以说 通过 Passkey 登录,是百分百安全的。 既然这么安全?为什么不早点用呢? 因为公钥加密需要计算能力,而直到近年来移动设备变得普及以及硬件性能的提升才使得这成为可能。

使用Passkey,用户的生物识别信息会不会泄露给网站或应用程序?

Passkey 和 用户设备(手机、计算机、安全密钥)所做的本地生物识别处理没有任何不同。生物识别信息和处理继续保留在设备上,永远不会发送到任何远程服务器 - 服务器只能看到生物识别检查成功的保证。

Passkeys 为什么还需要密码注册?更换设备呢?

从安全角度来看,在启用密钥的情况下删除密码是正确的。

实际上,Microsoft 允许您删除密码,感兴趣可以点击这篇文章参考 how-to-go-passwordless-with-your-microsoft-account(慎重考虑!)

使用 Passkey 的第一步登记公钥就是在服务器上登记用户对应的公钥,这个步骤只需要做一次。然而服务器如何知道当前用户的身份呢?

通过传统的密码方式注册一个账号,然后再创建并绑定 Passkey 到该账号中,账户设置里面会有选项添加 Passkey,Passkey 由用户终端生成、需要经过终端的生物认证,然后公钥上传到服务端,私钥保存在用户设备里(如手机芯片)。这样就完成了用户名和通行密钥信息的绑定。

Passkey 使注册帐户和从已知设备登录变得更加容易,但目前想把它迁移到不同的操作系统或新设备是一件有挑战性的事情,只能等待厂商后续动作。

添加新设备时,用户必须将其同步才能使用 Passkey 技术。公钥从生成开始便储存在目标网站的服务器上,只需要把私钥迁移到新设备即可,在 iOS 上使用 iPhone 创建的密钥只会通过 iCloud 钥匙串在其他 Apple 设备之间同步; Google 服务可以在 Android 设备上同步, Microsoft 也是如此。问题是,不同平台呢?目前同步工作依然和对应的平台帐号相绑定,如果不能解决这个问题,无异于把用户绑架于各自的生态当中,同步和备份受平台限制, 尽管目前三巨头已经开展合作,但目前这项工作仍在进行中。

国内普及程度如何,后续会跟进吗?

这不好说,毕竟国内APP没有手机号几乎寸步难行,连 2FA 通用验证器也不支持。很大程度上取决于国内各家厂商的产品策略以及对用户的调教。目前来看,并没有太多国内知名厂商跟进,但毫无疑问这是一个非常可能的趋势。

参考链接

相关推荐
Nan_Shu_6142 分钟前
学习: Threejs (2)
前端·javascript·学习
G_G#10 分钟前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
@大迁世界26 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
GIS之路35 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
勇哥java实战分享36 分钟前
短信平台 Pro 版本 ,比开源版本更强大
后端
是一个Bug38 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213840 分钟前
React面向组件编程
开发语言·前端·javascript
学历真的很重要40 分钟前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn089543 分钟前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪1 小时前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端