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 的流程,如图 1、2、3 所示。
Figure 1: Creating a passkey, step 1
Figure 2: Creating a passkey, step 2
Figure 3: Creating a passkey, step 3
- Client(a web app running in the browser or a native app)向后端请求一个随机 challenge 值。
- Client 调用 WebAuthn API credentials.create(challenge) 在设备上创建密钥对。其中私钥用于对 challenge 进行签名,且 私钥保存在 Authenticator 的安全硬件中(如 TPM 或 Secure Enclave); 而对 challenge 进行签名后的数据、credential ID、相应公钥会返回给 Client。在这个过程,会提示用户进行指纹或人脸或 PIN 码认证,以确保用户有访问设备的权限。
- Client 把对 challenge 进行签名后的数据、credential ID、 相应公钥发送给服务器。 服务器校验签名是否正确,如果签名正确则把公钥和 credential ID 和用户进行关联。
2.2. 使用 Passkey 认证
下面介绍使用 Passkey 进行认证的流程,如图 4、5、6 所示。
Figure 4: Authenticating with a passkey, step 1
Figure 5: Authenticating with a passkey, step 2
Figure 6: Authenticating with a passkey, step 3
- Client(a web app running in the browser or a native app)向后端请求一个随机 challenge 值。
- Client 调用 WebAuthn API credentials.get(challenge),这个 API 会要求用户通过指纹或人脸或 PIN 码认证,认证通过后,Authenticator 会返回使用之前保存的私钥对 challenge 进行签名后的数据、credential ID、用户名。
- Client 把对 challenge 进行签名后的数据、credential ID、用户名发送给服务器。服务器检查前端传入的 credential ID、用户名是否存在,如果存在,则找出之前关联的公钥对签名数据进行签名校验。如果签名也是正确的,则服务器可以创建 session 或者颁发认证 token 给前端。
3. Passkey 优缺点
Passkey 认证相对于传统的密码认证来说,有下面优点:
- 更加简单方便:用户不需要输入冗长的密码了,只需要通过设备的指纹认证、人脸认证、或者设备 PIN 认证即可。
- 更加安全:对于传统的密码,有一些安全问题,比如网站没有特别防护时,密码容易遭受暴力破解;用户可能在多个网站中使用相同密码;用户容易遭受社会工程学攻击而泄露密码;用户可能遭受钓鱼攻击被骗走密码。这些安全问题在 Passkey 认证中都不存在。
Passkey 认证也有不足:
- Passkey 并没有完全取代传统的密码。往往需要通过传统的密码认证后,才可以创建 Passkey。
- 进退两难的 Passkey 跨设备同步功能(这里不考虑 FIDO U2F 或其它硬件密钥的情况,毕竟对普通用户来说独立的硬件密钥较难推广)。如果 Passkey 不支持跨设备同步,则用户设备丢失后 Passkey 不再可用,需要在新设备上重新创建 Passkey。如果 Passkey 支持跨设备同步,则私钥离开了当前设备,从原理上说安全性不如私钥只保存在当前设备中的情况。目前 Passkey 跨设备同步功能的现状是:只支持同一种类型的设备之间的同步,如基于 iCloud Keychain 的 Passkey 不能同步到 Android 设备中。
4. 参考
- https://www.passkeys.io/technical-details
- https://developer.apple.com/documentation/authenticationservices/public-private_key_authentication
- https://developers.google.com/identity/passkeys/developer-guides
- https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API
- https://www.w3.org/TR/webauthn-1/
- https://www.w3.org/TR/webauthn-2/
- https://fidoalliance.org/specifications/download/