Device Integrity 是一套用于验证设备合法性与应用完整性的 iOS 开发技能,核心是让服务端能够确认请求来自真实的 Apple 设备上运行的、未经修改的应用。它基于 Apple 的两个框架:DeviceCheck 与 App Attest。
用途 该技能解决两类问题:一是用 DeviceCheck 的每设备布尔位做简单标记(例如“是否已领取促销”“是否被标记为欺诈”);二是用 App Attest 以 Secure Enclave 密钥和 Apple 认证,对每次请求进行密码学层面的应用合法性证明。
主要能力
- DCDevice(DeviceCheck 令牌):生成唯一、临时的设备令牌,发送到服务端后由服务端与 Apple 服务器通信,读取或设置每设备两个位。适用于 iOS 11+。
- DCAppAttestService(App Attest):验证特定设备上特定应用实例的合法性,使用 Secure Enclave 中的硬件支持密钥创建认证与断言。适用于 iOS 14+。流程分三阶段:密钥生成、认证(attestation)、断言(assertion)。
使用方式
- DeviceCheck:客户端调用 DCDevice.current.generateToken() 生成令牌,以 base64 编码后 POST 到服务端;服务端使用 Apple Developer 门户的 DeviceCheck 私钥创建签名 JWT,调用 Apple 的 query_two_bits、update_two_bits、validate_device_token 等端点。两个位的含义由开发者自定义,且跨应用重装持久保存,重置由服务端 API 控制。
- App Attest:先检查 DCAppAttestService.shared.isSupported;生成密钥对并持久化 keyId(如 Keychain),注意密钥只生成一次,重新生成会使之前的认证失效;认证时从服务端获取一次性 challenge,做 SHA-256 哈希后调用 attestKey,将认证对象发送到服务端验证;之后对每个敏感请求用 generateAssertion 生成断言,通过请求头(如 X-App-Assertion)发送,服务端解码 CBOR、验证认证器数据与计数器、校验签名与 clientDataHash。
- 环境 entitlement:在 entitlements 文件中设置 com.apple.developer.devicecheck.appattest-environment,测试用 development,App Store 构建用 production;缺失时调试构建默认 development,App Store 与 TestFlight 默认 production。
适用场景 适用于需要防欺诈、防重放、验证请求来源真实性的 iOS 应用,例如促销领取、敏感操作、服务端风控等。
限制与注意事项
- 并非所有设备都支持 App Attest,模拟器也不支持,需回退到 DCDevice 令牌或其他风险评估。
- 所有验证必须在服务端完成,不能信任客户端的认证结果。
- 必须实现重放保护,服务端需跟踪并递增断言计数器。
- 需处理 DCError:.serverUnavailable 用指数退避重试;.invalidKey 表示密钥失效(系统更新、Secure Enclave 重置),需重新生成并重新认证;.featureUnsupported 回退到 DCDevice;.invalidInput 表示 clientDataHash 或 keyId 格式错误。
- 常见错误包括:每次启动都生成新密钥、跳过不支持设备的回退、客户端信任认证、未实现重放保护、缺少环境 entitlement、未处理 invalidKey。
技能还提供审查清单,涵盖支持检查、密钥持久化、认证与断言流程、服务端验证、错误处理、环境配置与灰度发布等要点。更完整的服务端架构、认证与断言对比、端点设计与风险评估,参见 references/device-integrity-patterns.md。