认识 Passkey:下一代身份认证
Meet passkeys
2022年6月6日
一句话判断
Passkey 不是”更好的密码”,而是”消灭密码”——基于 WebAuthn 标准的公钥加密认证,让钓鱼、弱密码、凭证泄露这些问题从根本上不再可能。
这场 Session 讲了什么
Apple 认证体验团队的 Garrett 全面介绍了 Passkey——一种基于 FIDO Alliance 标准的下一代认证技术。Passkey 在 macOS Ventura 和 iOS 16 中正式面向所有用户推出(去年是开发者预览)。
Session 覆盖了 Passkey 的完整体验:创建、使用、跨设备同步、跨平台登录、以及通过 AirDrop 分享。然后深入技术细节:Passkey 基于 WebAuthn 标准,使用公钥加密,可以集成到现有的用户名登录流程中。
核心信息是:Passkey 比密码更安全(消除弱密码、钓鱼、凭证泄露等问题),同时比密码更易用(一次点击即可登录)。它基于开放标准,与其他主要平台兼容。
值得深挖的点
Passkey 的工作原理。 每个账户生成唯一的加密密钥对。私钥存储在设备的 iCloud Keychain 中并跨设备同步,公钥存储在服务器上。登录时,设备使用私钥对挑战进行签名,服务器用公钥验证。密码永远不会离开设备,服务器也不存储任何秘密。
AutoFill 集成。 Passkey 不需要新的 UI 界面——它直接出现在用户名输入框的 QuickType 栏中。用户只需点击一下即可完成登录。这是 Apple 推荐的主要集成方式。
跨平台登录。 即使在朋友的 PC 上没有 Passkey,也可以通过 QR 码扫码登录。设备之间通过本地密钥协商证明物理邻近性,建立端到端加密通道。这不是简单的 QR 码——背后是一次完整的加密握手。
AirDrop 分享。 可以将 Passkey 通过 AirDrop 分享给信任的人,解决共享账户的场景。
内置防钓鱼。 系统会验证当前应用或网站的身份,只在正确的上下文中提供 Passkey。即使恶意网站伪装成合法网站,系统也不会提供对应的 Passkey。
代码片段
import AuthenticationServices
// 注册 Passkey
func createPasskey() async {
let provider = ASAuthorizationAppleIDProvider()
// 创建注册请求
let request = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
).makeCredentialRegistrationRequest(
challenge: challengeData,
name: "user@example.com",
userID: userIDData
)
// 执行注册
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.performRequests()
}
// 使用 Passkey 登录
func signInWithPasskey() {
let request = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
).makeCredentialAssertionRequest(challenge: challengeData)
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.performRequests()
}
// 处理授权结果
func authorizationController(controller: ASAuthorizationController,
didCompleteWithAuthorization authorization: ASAuthorization) {
switch authorization.credential {
case let credential as ASAuthorizationPlatformPublicKeyCredentialRegistration:
// Passkey 注册成功,将凭证信息发送到服务器
let keyID = credential.credentialID
let attestationObject = credential.rawAttestationObject
case let credential as ASAuthorizationPlatformPublicKeyCredentialAssertion:
// Passkey 登录成功,验证签名
let signature = credential.signature
let rawClientData = credential.rawClientDataJSON
default:
break
}
}
最佳实践
- 将 Passkey 通过 AutoFill 集成到现有的用户名登录流程中,无需设计新界面
- 在 iOS 和 macOS 上,Passkey 自动同步到同一 iCloud 账户的所有设备
- 支持凭证降级:同时提供 Passkey 和密码选项,让用户逐步迁移
- 服务端需要实现 WebAuthn API 的注册和验证端点
- 使用 SF Symbol
person.key.badge作为 Passkey 的图标,保持系统一致性 - “Passkey” 是通用术语(非 Apple 专有),写作时小写,复数为 “passkeys”
还有什么值得关注
- Passkey 基于 FIDO Alliance 的开放标准,与 Google、Microsoft 等平台的实现兼容
- Passkey 可以与多因素认证(MFA)结合使用,但单独使用时已经提供了比密码 + MFA 更高的安全性
- 服务端存储的是公钥,即使数据泄露也无法用来冒充用户
- 配套观看 “Move beyond passwords” 了解更多 WebAuthn 实现细节