質問とシナリオ
画像、動画、音声向けのC2PA Content Credentialsを検証するサービスを設計してください。大容量メディアを受け入れ、署名済みマニフェストを保存し、編集履歴を表示し、無効、欠落、または信頼できない認証情報について説明できる必要があります。
面接官が見ているポイント
- C2PA Manifest、Claim、署名、およびアセットバインディングを正しく分離できているか。
- 大容量ファイル、非同期検証、キャッシング、バージョニング、および証明書の信頼性を適切に処理できるか。
- 認証情報が意味論的な真実を証明するものではないことを明示し、その上で誠実なフォールバックとプライバシー制御を設計できるか。
回答前の確認質問
メディアの種類と最大サイズ、アップロード検証と読み取り専用検証の違い、レイテンシ目標、監査ログの保持期間、トラストルートの所有者、サードパーティがマニフェストを取得できるかどうかを確認します。また、サービスが暗号学的な整合性のみを検証するのか、それとも発行者や編集に関するビジネスレベルの主張まで行うのかを確認します。
30秒の回答フレームワーク
システムをアップロードとオブジェクトストレージ、マニフェスト抽出、暗号学的検証、トラストディレクトリ、結果API、監査インデックスに分割します。メディアはオブジェクトストレージに保持され、検証はコンテンツハッシュに基づいて非同期かつ冪等に実行されます。結果は、署名の有効性、チェーンの整合性、発行者の信頼性、未知の状態に分けて管理します。バージョニングされたキャッシュは、失効やトラストディレクトリの変更時に無効化されます。プロダクトでは、C2PAが宣言された来歴と編集を検証するものであり、意味論的な真実を検証するものではないことを明記する必要があります。
ステップごとの詳細な回答
- アップロードURLを発行し、アセットのハッシュ、サイズ、メディアタイプ、テナントポリシーを記録します。オブジェクトのバージョニングとチェックサムを有効にします。
- アップロード完了後に検証をキューイングします。ワーカーが埋め込みまたはリモートのマニフェストを抽出し、Claimとアセットのバインディング、署名、タイムスタンプ、親編集チェーン、重複を検証します。
- バージョニングされたトラストディレクトリを通じて発行者証明書、失効情報、使用目的を解決します。結果ごとにそのディレクトリバージョンを保存します。
- 不変イベントとクエリインデックスを書き込みます。状態には valid、invalid、untrusted、missing、indeterminate を含め、すべてのメディアを複製するのではなく証拠の参照を保持します。
- サマリー、編集履歴、発行者、検証時刻、失敗理由を返します。プレビューやマニフェストのダウンロードは有効期限付きURLで保護します。
- ホットなアセットをキャッシュしますが、キャッシュキーにはアセットのバージョン、仕様のバージョン、トラストディレクトリのバージョンを含めます。失効やベリファイアの更新時にはバッチで無効化します。
- レートリミット、マルウェアスキャン、リトライ、デッドレターキュー、テナント分離を採用します。マルチパートアップロードにより、APIプロセスが巨大なファイルを保持するのを防ぎます。
POST /v1/assets/uploads
POST /v1/assets/{assetId}/verify
GET /v1/assets/{assetId}/provenance
GET /v1/trust-roots/{version}高品質な模範解答
まず信頼境界を定義します。C2PA Manifestは来歴と編集のアサーションに対する検証可能な署名であり、真実判定分類器ではありません。アップロードサービスはオブジェクトのバージョンとハッシュを保存し、非同期ワーカーがアセットバインディング、署名、編集チェーン、タイムスタンプ、証明書の状態を検証します。結果APIは整合性、発行者の信頼性、欠落している認証情報、未確定な結果を分離し、仕様バージョンとトラストディレクトリのバージョンを記録します。バージョニングされたキャッシュは失効後に無効化でき、不変の監査イベントと有効期限付きメディアURLにより調査を保護します。これにより、「署名が有効」を「事実として真実」と混同することなくスケールさせることができます。
よくある間違い
- C2PAをAI検出器や真実のオラクルとして扱うこと。
- 現在のアセットのバイト列とのバインディングを確認せずに署名のみを検証すること。
- 有効な証明書チェーンを信頼できる発行者と同等とみなすこと。
- オブジェクトストレージやキューを使用せず、巨大なメディアを同期APIハンドラー経由で送信すること。
- 仕様、ベリファイア、トラストディレクトリのバージョンを省略し、結果を再現不能にすること。
フォローアップ質問と回答
なぜ編集時に古い署名をそのまま保持できないのですか?
編集によってアセットのバイト列が変更されるためです。エディタは新しいManifestを追加し、親子チェーンを作成して、現在のバージョンを再度バインドする必要があります。古いアサーションは履歴として残すことができますが、現在のバイト列に署名することはできません。
認証情報が欠落している場合、コンテンツは偽物であることを意味しますか?
いいえ。検証可能な来歴アサーションが存在しないことを意味するだけです。カバー率の制限とともに未知または欠落として表示し、エコシステム外のコンテンツを偽物としてラベル付けしてはなりません。
トラストディレクトリの変更はどのように処理しますか?
ディレクトリバージョンと検証時刻を保存し、元の証拠を保持して、更新後に非同期で再検証します。状態が変更された理由とともに、新しい結果バージョンを発行します。
Manifestのプライバシー漏洩をどのように防ぎますか?
テナントおよびフィールドレベルの可視性制御を使用し、デフォルトでは必要なサマリーのみを返し、機密フィールドを暗号化し、有効期限付きダウンロードURLを使用し、アクターと目的を含めてすべてのアクセスを監査します。