デバイス整合性 は何をしますか?
DeviceCheck(DCDeviceのデバイス単位ビット)とApp Attest(DCAppAttestServiceのキー生成、アテステーション、アサーションフロー)を使用して、デバイスの正当性とアプリの整合性を検証します。不正防止の実装、改ざんされたデバイスの検出、Appleのサーバーによるアプリの真正性の検証、アテステーションされたリクエストによる機密性の高いAPIエンドポイントの保護、またはバックエンドアーキテクチャへのデバイス検証の追加に使用します。
概要
AppleのDeviceCheckおよびApp Attestフレームワークは、iOSアプリとmacOSアプリの整合性を検証し、不正な改ざんや再パッケージングを検出するための強力なツールを提供します。このスキルは、これらのフレームワークを活用して、強固な不正防止システムを構築するための実践的な実装戦略を提供します。
主な機能
- デバイスごとのビット:
DCDeviceを使用して、Appleが提供するプライベートなストレージにデバイスごとのビットを設定および照会します。これは、デバイスの状態(例:デバイスが既にサインアップしたかどうか)を追跡するのに役立ちます。 - アプリアテステーション:
DCAppAttestServiceを使用して、アプリインスタンスの真正性を検証します。このプロセスには、公開鍵の生成、アテステーションの取得、リクエストを保護するためのアサーションの作成が含まれます。 - サーバー側検証: アテステーションとアサーションを検証するためのサーバー側エンドポイントを実装するためのガイダンスを提供し、信頼できるリクエストのみがバックエンドに到達することを保証します。
ワークフロー
- キー生成:
DCAppAttestServiceを呼び出して、アプリインスタンスごとに一意の公開鍵を生成します。 - アテステーション: 生成された公開鍵をAppleのサーバーに送信して、アテステーションオブジェクトを取得します。アテステーションは、デバイスとアプリが改ざんされていないことを証明します。
- アサーション: バックエンドAPIに送信する各リクエストに対して、アテステーションされた鍵を使用してアサーションを生成します。アサーションには、リクエスト固有のデータが含まれ、リプレイ攻撃を防止します。
- サーバー側検証: サーバー側エンドポイントで、
DCAppAttestServiceの検証ロジックを使用してアサーションを検証し、リクエストを処理します。
実装の詳細
DeviceCheckの使用
import DeviceCheck
let device = DCDevice.current
if device.isSupported {
// デバイスごとのビットを設定または照会
device.generateToken(completionHandler: { token, error in
// トークンをサーバーに送信して処理
})
}
App Attestの使用
import DeviceCheck
let service = DCAppAttestService.shared
if service.isSupported {
// キー生成
service.generateKey { keyId, error in
guard let keyId = keyId else { return }
// アテステーションの取得
service.attestKey(keyId, clientDataHash: hash) { attestation, error in
// アテステーションをサーバーに送信
}
// アサーションの生成
service.generateAssertion(keyId, clientDataHash: hash) { assertion, error in
// アサーションをリクエストに添付
}
}
}
サポートされるプラットフォーム
- iOS 11.0+
- macOS 10.13+
- tvOS 11.0+
- watchOS 4.0+
ベストプラクティス
- 常にデバイスが
DCDeviceおよびDCAppAttestServiceをサポートしているかどうかを確認してから、プライベートAPIを呼び出してください。 - サーバー側では、Appleの公開鍵を使用してアテステーションとアサーションの真正性を検証します。
- アサーションにリクエスト固有のチャレンジ(例:nonce、タイムスタンプ)を含めて、リプレイ攻撃を防止します。
- バックエンドでアテステーションの結果を安全にキャッシュして、ネットワークラウンドトリップを最小限に抑えます。