系統設計面試:如何設計 C2PA 內容來源驗證服務?
題幹與適用場景
請設計一個為圖片、影片與音訊驗證 C2PA Content Credentials 的服務。它需要接收大型媒體、保存簽章清單、展示編輯歷史,並在憑證無效、缺失或簽發者不受信任時給出可解釋結果。
面試官考察點
- 能否正確區分 C2PA Manifest、Claim、簽章與資產內容綁定。
- 能否處理大檔案、非同步驗證、快取、版本化與憑證信任。
- 能否明確「有憑證」不等於「內容真實」,並設計降級與隱私邊界。
回答前需要釐清的問題
先確認媒體類型與最大大小、上傳或僅讀取驗證、延遲目標、驗證結果是否需長期稽核、信任根由誰維護,以及是否允許第三方取回 Manifest。也要確認服務要驗證簽章完整性,還是要對來源機構與編輯動作做業務級背書。
30 秒回答框架
我會把系統拆成上傳與物件儲存、Manifest 擷取、密碼學驗證、信任目錄、結果 API 與稽核索引。媒體本體走物件儲存,驗證工作非同步執行並以內容雜湊保證冪等;結果區分簽章有效性、鏈完整性、簽發者信任與未知狀態。讀取端使用版本化快取,憑證撤銷或信任目錄變化觸發失效。產品層明確 C2PA 證明的是聲明的來源與編輯鏈,不自動證明語義真實性。
分步驟深入解答
- 客戶端申請上傳 URL,服務記錄資產雜湊、大小、媒體類型與租戶策略;物件儲存啟用版本與校驗。
- 上傳完成後投入驗證佇列。Worker 擷取嵌入或遠端 Manifest,檢查 Claim 與資產雜湊綁定、簽章、時間戳、父子編輯鏈與重複憑證。
- 透過信任目錄解析簽發者憑證、撤銷狀態與用途;把驗證依賴的目錄版本寫入結果,避免目錄變化後無法解釋。
- 結果寫入不可變事件表與可查詢索引,狀態至少包括 valid、invalid、untrusted、missing 與 indeterminate,並保存證據引用而非複製全部媒體。
- API 返回摘要、編輯動作、簽發者、驗證時間與失敗原因;大圖預覽與 Manifest 下載使用短期授權 URL。
- 對熱門資產快取結果,但鍵必須包含資產版本、規範版本與信任目錄版本;撤銷、目錄更新或新驗證器發布時批次失效。
- 透過限流、病毒掃描、佇列重試、死信與租戶隔離保護資源;對超大媒體採用分片上傳,避免 API 行程持有完整檔案。
POST /v1/assets/uploads
POST /v1/assets/{assetId}/verify
GET /v1/assets/{assetId}/provenance
GET /v1/trust-roots/{version}高品質示範回答
我會先定義信任邊界:C2PA Manifest 是對來源與編輯聲明的可驗證簽章,不是內容真假分類器。上傳服務只保存物件版本與雜湊,驗證 Worker 非同步檢查 Manifest 與資產綁定、簽章、編輯鏈、時間戳與憑證狀態。結果 API 把完整性、簽發者信任、憑證缺失與暫時無法判斷分開返回,並記錄規範與信任目錄版本。熱門讀取用版本化快取,撤銷或目錄變化可失效;稽核事件不可變,媒體存取使用短期授權。這樣既能在高併發下擴展,也不會把「簽章有效」誤報為「事實真實」。
常見錯誤
- 把 C2PA 當成 AI 偵測器或事實真偽裁判。
- 只驗證簽章,不驗證 Manifest 與目前資產內容的綁定。
- 把憑證鏈有效直接等同於簽發機構值得信任。
- 將大檔案同步塞進 API 請求,忽略物件儲存、佇列與冪等。
- 不記錄規範、驗證器與信任目錄版本,導致結果無法重現。
追問及應對
編輯後為什麼不能簡單保留舊簽章?
編輯會改變資產位元組;系統應由編輯器追加新的 Manifest,形成父子鏈,並重新綁定目前資產雜湊。舊聲明可保留為歷史,但不能冒充目前版本的簽章。
憑證缺失是否代表內容是假的?
不代表。缺失只表示服務沒有可驗證的來源聲明;產品應顯示 unknown 或 missing,並說明覆蓋範圍,避免把未參與生態的內容一律判假。
如何應對信任目錄更新造成的結果變化?
結果帶目錄版本與驗證時間;保留原始證據,目錄更新後非同步重驗並產生新版本,稽核記錄說明狀態變化原因。
如何防止 Manifest 隱私洩露?
按租戶與欄位設定可見性,預設只返回必要摘要;敏感欄位加密,下載使用短期授權,稽核日誌記錄存取者與用途。