Technical Details of Passkey Authentication

Table of Contents

1. Passkey 简介

Passkey 是一种新的认证方式,用于替代传统的密码认证。 Passkey 的主要思路是生成一个公私钥密钥对,私钥保存在本地设备中,而公钥保存到服务器。认证时,使用设备中的私钥进行签名,而服务器使用公钥对签名进行校验。

1.1. WebAuthn VS FIDO2

WebAuthn(Web Authentication API)是 W3C 发布的一个 Web 认证规范。

FIDO(Fast Identity Online)联盟之前发布过 U2F,它需要一个专门的硬件来配合认证,没有被广泛应用;后来 FIDO 联盟和 W3C 一起发布了 FIDO2

WebAuthn 是 FIDO2 中的一个核心规范。FIDO2 中还包含了 WebAuthn 中没有包含的标准:CTAP2(Client to Authenticator Protocol)。 简单地说:FIDO2 = WebAuthn + CTAP2。

而术语 Passkey 则可以认为是这种技术面向用户的一个通俗叫法,Passkey 有时也专指 WebAuthn credential。

2. Passkey 流程

下面将介绍 Passkey 相关流程,主要摘自:https://www.passkeys.io/technical-details

2.1. 创建 Passkey

下面介绍创建 Passkey 的流程,如图 123 所示。

create_passkey_step1.gif

Figure 1: Creating a passkey, step 1

create_passkey_step2.gif

Figure 2: Creating a passkey, step 2

create_passkey_step3.gif

Figure 3: Creating a passkey, step 3

  1. Client(a web app running in the browser or a native app)向后端请求一个随机 challenge 值。
  2. Client 调用 WebAuthn API credentials.create(challenge) 在设备上创建密钥对。其中私钥用于对 challenge 进行签名,且 私钥保存在 Authenticator 的安全硬件中(如 TPM 或 Secure Enclave); 而对 challenge 进行签名后的数据、credential ID、相应公钥会返回给 Client。在这个过程,会提示用户进行指纹或人脸或 PIN 码认证,以确保用户有访问设备的权限。
  3. Client 把对 challenge 进行签名后的数据、credential ID、 相应公钥发送给服务器。 服务器校验签名是否正确,如果签名正确则把公钥和 credential ID 和用户进行关联。

2.2. 使用 Passkey 认证

下面介绍使用 Passkey 进行认证的流程,如图 456 所示。

passkey_auth_step1.gif

Figure 4: Authenticating with a passkey, step 1

passkey_auth_step2.gif

Figure 5: Authenticating with a passkey, step 2

passkey_auth_step3.gif

Figure 6: Authenticating with a passkey, step 3

  1. Client(a web app running in the browser or a native app)向后端请求一个随机 challenge 值。
  2. Client 调用 WebAuthn API credentials.get(challenge),这个 API 会要求用户通过指纹或人脸或 PIN 码认证,认证通过后,Authenticator 会返回使用之前保存的私钥对 challenge 进行签名后的数据、credential ID、用户名。
  3. Client 把对 challenge 进行签名后的数据、credential ID、用户名发送给服务器。服务器检查前端传入的 credential ID、用户名是否存在,如果存在,则找出之前关联的公钥对签名数据进行签名校验。如果签名也是正确的,则服务器可以创建 session 或者颁发认证 token 给前端。

3. Passkey 优缺点

Passkey 认证相对于传统的密码认证来说,有下面优点:

  1. 更加简单方便:用户不需要输入冗长的密码了,只需要通过设备的指纹认证、人脸认证、或者设备 PIN 认证即可。
  2. 更加安全:对于传统的密码,有一些安全问题,比如网站没有特别防护时,密码容易遭受暴力破解;用户可能在多个网站中使用相同密码;用户容易遭受社会工程学攻击而泄露密码;用户可能遭受钓鱼攻击被骗走密码。这些安全问题在 Passkey 认证中都不存在。

Passkey 认证也有不足:

  1. Passkey 并没有完全取代传统的密码。往往需要通过传统的密码认证后,才可以创建 Passkey。
  2. 进退两难的 Passkey 跨设备同步功能(这里不考虑 FIDO U2F 或其它硬件密钥的情况,毕竟对普通用户来说独立的硬件密钥较难推广)。如果 Passkey 不支持跨设备同步,则用户设备丢失后 Passkey 不再可用,需要在新设备上重新创建 Passkey。如果 Passkey 支持跨设备同步,则私钥离开了当前设备,从原理上说安全性不如私钥只保存在当前设备中的情况。目前 Passkey 跨设备同步功能的现状是:只支持同一种类型的设备之间的同步,如基于 iCloud Keychain 的 Passkey 不能同步到 Android 设备中。

4. 参考

Author: cig01

Created: <2024-02-01 Thu>

Last updated: <2024-02-18 Sun>

Creator: Emacs 27.1 (Org mode 9.4)