集成Passkeys时signCount始终为0:ASAuthorizationPublicKeyCredentialAssertion是否支持该字段?
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的常见原因
- 使用苹果平台认证器,且未配置用户验证要求;
- 注册阶段
userVerificationPreference设置为.discouraged; - 所使用的跨平台认证器本身不支持signCount字段。
内容的提问来源于stack exchange,提问作者Yuval Sharon
相关产品推荐
相关产品推荐

