WWDC Quick Look 💓 By SwiftGGTeam
Move beyond passwords

Move beyond passwords

观看原视频

Highlight

iOS 15 和 macOS Monterey 推出 WebAuthn 技术预览,将基于公钥的 passkeys 存储在 iCloud Keychain 中,实现一键登录、跨设备同步、防钓鱼,且服务端不再存储任何认证密钥。

核心内容

密码的根本问题

密码已经存在了几十年,人人都会用。但整个行业逐渐认识到,密码的便利性是以安全性为代价的。

根据 Verizon 2020 年数据泄露调查报告,超过 80% 的与黑客相关的数据泄露涉及凭证的暴力破解或丢失/被盗凭证的使用。

密码的核心问题在于它是”共享密钥”——用户和服务端都持有同一个秘密。每次传输这个秘密,都有被截获的风险。钓鱼攻击、密码重用、弱密码等问题都源于此。

现有的改进方案各有局限:

  • 密码管理器:可以生成强密码,但安全性取决于主密码
  • SMS/OTP 验证码:仍然是可输入、可钓鱼的共享密钥
  • 联邦认证(如 Sign in with Apple):将信任集中在少数账户,但并非所有场景都适用

WebAuthn:公钥替代共享密钥

WebAuthn(Web Authentication)标准使用公钥/私钥对替代密码。它的工作方式完全不同:

  1. 注册时,设备生成一对密钥:公钥和私钥
  2. 公钥发送给服务端存储(公钥可以公开,没有保密要求)
  3. 私钥留在设备上,永远不会分享给任何人
  4. 登录时,服务端发送一个 challenge,设备用私钥签名后返回
  5. 服务端用公钥验证签名,确认身份

整个过程中私钥从未离开设备。即使服务端被攻破,攻击者也只能拿到公钥,而公钥本身没有价值。

安全密钥 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 参数,不需要 nameuserID
  • 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
    }
}

关键点:

  • 注册时获取 rawAttestationObjectrawClientDataJSON,发送到服务端验证
  • 登录时获取 signaturerawClientDataJSON,服务端用公钥验证签名
  • 凭证数据格式与 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 的请求。系统会自动展示所有可用选项,让用户选择最方便的方式。

  • 跨平台凭证共享:通过 webcredentials associated domain 关联 App 和网站,用户在一个平台上创建的 passkey 可以在另一个平台上使用。这消除了传统密码管理中”App 密码”和”网站密码”分离的问题。

  • 高安全场景用硬件密钥:对于金融、医疗等高安全需求的应用,集成安全密钥 API。iOS 15 支持 USB、NFC 和 Lightning 安全密钥,为用户提供硬件级别的保护。

关联 Session

评论

GitHub Issues · utterances