用途:验证发往服务端的请求来自真实 Apple 设备上运行的合法应用实例。DCDevice(DeviceCheck)提供跨应用重装持久保存的每设备两个状态位,用于促销兑换等持久状态;DCAppAttestService(App Attest,iOS 14+)用安全隔区密钥提供应用真实性的密码学证明。
安全边界:App Attest 证明客户端硬件与应用完整性,不能替代用户认证、TLS、授权或证书固定;验证通过后仍须执行用户认证。
主要能力与用法: 1)DCDevice:DCDevice.current.isSupported 检查支持性,generateToken() 生成令牌交后端向 Apple 读取或更新每设备两位状态。令牌严格一次性使用,每次服务端交互都要生成新令牌。 2)App Attest 三步流程——密钥生成:每个用户账户/设备一次,service.generateKey() 生成并持久化 keyId;认证:从服务器取一次性 challenge,clientDataHash = SHA256(challenge),调用 attestKey(keyId, clientDataHash:) 后发往服务端;断言:clientData 含一次性 challenge 与请求上下文,generateAssertion(keyId, clientDataHash:) 生成断言,经 X-App-Attest-Assertion 与 X-App-Attest-Client-Data 头发送。
服务端验证:校验 CBOR 认证对象与 Apple App Attest 根 CA,nonce 须等于 SHA256(authData || SHA256(challenge));断言时重算哈希、用已存公钥验签,并校验计数器严格递增以防重放。
错误与密钥生命周期:.serverUnavailable 用同一 keyId 与 clientDataHash 指数退避重试;.invalidKey 丢弃并重新生成密钥;.featureUnsupported 回退到 DCDevice 令牌验证或服务端风控。
限制与常见错误:每次启动都生成新密钥、复用 DCDevice 令牌、只签名原始请求体、服务端用错 nonce、混用开发与生产环境、在客户端信任认证结果均属错误。需配置 com.apple.developer.devicecheck.appattest-environment 权限,并保证受保护端点仍强制用户认证与 TLS。参考资料详见 references/device-integrity-patterns.md、DeviceCheck 与 App Attest 官方文档。