Highlight
iOS 15 和 macOS Monterey 推出 WebAuthn 技术预览,将基于公钥的 passkeys 存储在 iCloud Keychain 中,实现一键登录、跨设备同步、防钓鱼,且服务端不再存储任何认证密钥。
核心内容
密码的根本问题
密码已经存在了几十年,人人都会用。但整个行业逐渐认识到,密码的便利性是以安全性为代价的。
根据 Verizon 2020 年数据泄露调查报告,超过 80% 的与黑客相关的数据泄露涉及凭证的暴力破解或丢失/被盗凭证的使用。
密码的核心问题在于它是”共享密钥”——用户和服务端都持有同一个秘密。每次传输这个秘密,都有被截获的风险。钓鱼攻击、密码重用、弱密码等问题都源于此。
现有的改进方案各有局限:
- 密码管理器:可以生成强密码,但安全性取决于主密码
- SMS/OTP 验证码:仍然是可输入、可钓鱼的共享密钥
- 联邦认证(如 Sign in with Apple):将信任集中在少数账户,但并非所有场景都适用
WebAuthn:公钥替代共享密钥
WebAuthn(Web Authentication)标准使用公钥/私钥对替代密码。它的工作方式完全不同:
- 注册时,设备生成一对密钥:公钥和私钥
- 公钥发送给服务端存储(公钥可以公开,没有保密要求)
- 私钥留在设备上,永远不会分享给任何人
- 登录时,服务端发送一个 challenge,设备用私钥签名后返回
- 服务端用公钥验证签名,确认身份
整个过程中私钥从未离开设备。即使服务端被攻破,攻击者也只能拿到公钥,而公钥本身没有价值。
安全密钥 vs Passkeys
硬件安全密钥(Security Key)已经支持 WebAuthn,安全性很好,但需要额外购买和携带硬件,对普通用户不够友好。
Apple 的解决方案是 passkeys in iCloud Keychain:将 WebAuthn 凭证存储在 iCloud Keychain 中,结合了 WebAuthn 的安全性和 iCloud Keychain 的便利性。
- 一键登录:通常只需一次点击或 Face ID 验证
- 跨设备同步:在所有 Apple 设备上可用
- 安全备份:即使丢失所有设备,也能从 iCloud 恢复
- 防钓鱼:操作系统严格限制凭证只能在创建它的网站/应用上使用
- 端到端加密:Apple 也无法读取
技术预览状态
macOS Monterey 和 iOS 15 中,passkeys 作为技术预览发布,默认关闭。需要在 iOS 的”设置 > 开发者”或 macOS Safari 的”开发”菜单中手动开启。此预览仅用于测试,不建议用于生产账户。
详细内容
注册账户
(17:32)使用 ASAuthorizationPlatformPublicKeyCredentialProvider 创建注册请求:
func createAccount(with challenge: Data, name: String, userID: Data) {
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
let registrationRequest = provider.createCredentialRegistrationRequest(
challenge: challenge,
name: name,
userID: userID
)
let controller = ASAuthorizationController(
authorizationRequests: [registrationRequest]
)
controller.delegate = self
controller.presentationContextProvider = self
controller.performRequests()
}
关键点:
relyingPartyIdentifier通常是域名,用于关联应用和网站challenge是从服务端获取的一次性挑战值name是用户可见的账户名称userID是后端账户标识符ASAuthorizationController会弹出系统 sheet,用户通过 Face ID/Touch ID 确认后即可完成注册
登录
(17:39)登录与注册非常相似,只需改用 assertion request:
func signIn(with challenge: Data) {
let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(
relyingPartyIdentifier: "example.com"
)
let assertionRequest = provider.createCredentialAssertionRequest(
challenge: challenge
)
let controller = ASAuthorizationController(
authorizationRequests: [assertionRequest]
)
controller.delegate = self
controller.presentationContextProvider = self
controller.performRequests()
}
关键点:
createCredentialAssertionRequest用于登录(WebAuthn 术语中称为 “assertion”)- 只需要
challenge参数,不需要name和userID authorizationRequests参数是数组,可以同时传入密码、Sign in with Apple 等多种认证方式的请求- 系统 sheet 会显示所有可用的凭证选项
处理回调
(17:41)在 delegate 回调中处理注册或登录结果:
func authorizationController(
controller: ASAuthorizationController,
didCompleteWithAuthorization authorization: ASAuthorization
) {
switch authorization.credential {
case let registration as ASAuthorizationPlatformPublicKeyCredentialRegistration:
let attestationObject = registration.rawAttestationObject
let clientDataJSON = registration.rawClientDataJSON
// 发送到服务端验证,完成账户创建
case let assertion as ASAuthorizationPlatformPublicKeyCredentialAssertion:
let signature = assertion.signature
let clientDataJSON = assertion.rawClientDataJSON
// 发送到服务端验证,完成登录
default:
break
}
}
关键点:
- 注册时获取
rawAttestationObject和rawClientDataJSON,发送到服务端验证 - 登录时获取
signature和rawClientDataJSON,服务端用公钥验证签名 - 凭证数据格式与 WebAuthn Web API 一致,服务端逻辑可以复用
应用与网站的关联
(19:46)为了让平台提供的防钓鱼保护生效,需要在 Associated Domains 中配置 webcredentials 关联类型:
applinks:example.com
webcredentials:example.com
这建立了应用和网站之间的强关联,确保凭证只能在正确的域中使用。
安全密钥 API
(13:21)iOS 15 和 macOS Monterey 还将安全密钥 API 开放给所有 App。这是 ASAuthorization API 家族的新成员,是 WebAuthn API 的原生等价物。
安全密钥适合高安全需求的场景,比如企业应用或金融应用。用户需要购买和携带硬件密钥,但获得了最高级别的安全保障。
核心启发
-
为 App 添加 Passkey 支持:在现有登录系统中集成 WebAuthn 注册和登录流程。从服务端开始,搭建 WebAuthn 后端,然后在 iOS App 中使用
ASAuthorizationPlatformPublicKeyCredentialProvider实现前端。用户只需 Face ID 一次点击即可完成注册和登录。 -
统一认证入口:利用
ASAuthorizationController的数组参数特性,同时传入 passkey、密码和 Sign in with Apple 的请求。系统会自动展示所有可用选项,让用户选择最方便的方式。 -
跨平台凭证共享:通过
webcredentialsassociated domain 关联 App 和网站,用户在一个平台上创建的 passkey 可以在另一个平台上使用。这消除了传统密码管理中”App 密码”和”网站密码”分离的问题。 -
高安全场景用硬件密钥:对于金融、医疗等高安全需求的应用,集成安全密钥 API。iOS 15 支持 USB、NFC 和 Lightning 安全密钥,为用户提供硬件级别的保护。
关联 Session
- Secure login with iCloud Keychain verification codes — TOTP 验证码生成器,密码时代的过渡方案
- Meet Face ID and Touch ID for the web — Web 端生物识别认证
- What’s new in Sign in with Apple — 联邦认证方案
评论
GitHub Issues · utterances