You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成Passkeys时signCount始终为0:ASAuthorizationPublicKeyCredentialAssertion是否支持该字段?

关于ASAuthorizationPublicKeyCredentialAssertion.rawAuthenticatorData的signCount字段问题

ASAuthorizationPublicKeyCredentialAssertion的rawAuthenticatorData确实支持signCount字段,但它的取值并非始终递增,核心取决于认证器类型和你的配置逻辑,以下是具体说明:

  • 认证器类型影响

    • 对于Touch ID/Face ID这类苹果平台认证器,默认不会主动递增signCount。只有当你在注册凭证时明确要求用户验证(userVerification),且每次认证都触发了生物识别验证,才有可能更新该字段。即便如此,苹果更依赖系统级安全机制,部分场景下仍可能保持signCount为0。
    • 对于YubiKey这类跨平台硬件认证器,只要设备本身支持signCount,且注册阶段未禁用相关设置,每次认证都会正确递增signCount值。
  • 注册阶段的关键配置
    要让认证器启用signCount追踪,注册凭证时必须正确设置userVerificationPreference:

    let creationRequest = ASAuthorizationPublicKeyCredentialCreationRequest(relyingPartyIdentifier: yourRPID, userID: userID)
    creationRequest.userVerificationPreference = .required // 或.preferred,不能是.discouraged
    

    如果设置为.discouraged,认证器会跳过用户验证流程,大概率不会生成或更新signCount。

  • 正确解析signCount的方式
    不要直接读取固定位置的数据,需遵循WebAuthn规范解析rawAuthenticatorData结构:

    func extractSignCount(from rawAuthData: Data) -> UInt32? {
        guard rawAuthData.count >= 37 else { return nil }
        // 跳过前33字节(32字节RP ID哈希 + 1字节标志位)
        let signCountBytes = rawAuthData.subdata(in: 33..<37)
        return signCountBytes.withUnsafeBytes { buffer in
            buffer.load(as: UInt32.self).byteSwapped // 转换为大端字节序
        }
    }
    
  • signCount始终为0的常见原因

    1. 使用苹果平台认证器,且未配置用户验证要求;
    2. 注册阶段userVerificationPreference设置为.discouraged;
    3. 所使用的跨平台认证器本身不支持signCount字段。

内容的提问来源于stack exchange,提问作者Yuval Sharon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:16:15