Proof of Capture 是什麼?它不是再找一個 AI detector 猜圖片真偽,而是嘗試在按下快門時留下可驗證證據。2026 年 9 月 15 日 07:12(台北)擷取的 Hacker News 討論有 137 points、85 則留言;大家真正爭論的不是簽章能不能算,而是裁切、局部修改、螢幕重拍與追蹤風險會在哪裡擊穿它。
這篇把問題變成一座可重跑的小實驗室:先用軟體金鑰完成 sign/verify,再對同一張簽章圖做四組變形。你會親眼看到「驗證通過」和「事件為真」為什麼是兩回事,也會知道 Proof of Capture、Apple Reference Image 與 C2PA 各自保存哪一層證據。
先說結論
- 簽過,不等於畫面裡的事件是真的:它最多證明某把金鑰對某個內容指紋簽過名。
- 本文的軟體基線可重現:在固定 commit 上,未修改圖、JPEG 品質 60、縮到 70% 再壓縮都通過;約 1% 裁切讓浮水印消失。
- 小範圍編修可能漏掉:覆蓋影格寬 15%、高 20% 的黑色 patch,pHash 距離只有 4,仍低於原型的 10-bit 門檻。
- 硬體版目前不能照宣傳語直接相信:靜態程式審查發現 ATECC608 呼叫的輸入長度與軟體驗證路徑疑似不相容;沒有實機已知答案測試前,不算完成。
- 本文記憶錨點:
可驗證來源 = 內容綁定 × 數位簽章 × 信任根;不等於事件為真。
Proof of Capture 是什麼?先把四個零件拆開
本文測的是 María Benavente 與 Alex Hornstein 公開的 Proof of Capture v0.1.0 原型(commit aeec158)。它先把照片正規化到寬 2048 px,再算 64-bit DCT pHash,使用 ECDSA P-256 簽署,最後把 32-bit magic、64-bit pHash 與 512-bit 的 r||s 簽章,共 608 bits,藏回圖片亮度通道。
這個成熟度標籤很重要:截至 2026 年 9 月 15 日檢查的 repo tree、refs 與 Actions 頁面,沒有 tag、release、CI 或自動化測試;現行 DWT/DCT 版本也在 9 月 10 日才合併。它適合當透明教材與攻擊面地圖,還不是經多裝置、多照片、多編碼器驗證的正式標準或取證產品。
- Exact hash 像檔案指紋:輸入只差一個 bit,輸出就應完全不同;適合驗完整位元,但 JPEG 重壓、resize 或 crop 都會改值。雜湊應稱 collision-resistant,不是數學上保證唯一。
- pHash 像把畫面縮成輪廓速記:它把亮度縮到 32×32、做 DCT、取 8×8 低頻區並以中位數切成 64 bits,再用 Hamming distance(有幾個 bit 不同)比較。耐日常轉檔的代價,是局部細節可能被平均掉。
- DWT+DCT watermark 像把收據分散塞進頻率格:原型在二層 Haar DWT 的 LL 頻帶切 4×4 區塊,用 DCT 係數與 QIM 重複寫入 payload。它只是載具;沒有簽章與公鑰,浮水印本身不會產生身分或信任。
- 公開金鑰像驗章樣本:驗證器先取出 pHash 與簽章、查簽章,再重算現圖 pHash;距離
< 10才顯示原型定義的 authentic。公鑰須從圖片外另行取得,原型沒有共同憑證鏈。
這四層不能混成一句「照片是真的」。Exact hash 回答位元有沒有變;pHash 回答看起來夠不夠像;watermark 幫 payload 跟著圖片走;signature 回答某把私鑰有沒有簽。至於那把金鑰屬於誰、相機是否被攻破、鏡頭前是不是另一台螢幕,還要另外證明。這也解釋了為什麼AI 影片偵測器的誤判問題與 provenance 應視為互補訊號,不是二選一。
Proof of Capture 怎麼跑?先建立 software key 基線
以下流程在 macOS、Python 3.12、repo commit aeec158 實際跑通。它只建立開發用 software key,不碰 GPIO、相機或不可逆的晶片 provisioning。先安裝 git 與 uv,再執行:
git clone https://github.com/merybenavente/proof_of_capture.git
cd proof_of_capture
git checkout aeec158fe5affdda2a6ae6eb7eeabb5002794f50
uv sync --frozen --python 3.12
uv run --frozen python -m proof_of_capture generate
uv run --frozen python -m proof_of_capture sign samples/capture_20260625_222028.png
uv run --frozen python -m proof_of_capture verify signedPhotos/capture_20260625_222028.jpg
最後一行應先看到 verification successful、perceptual distance 0。這只是你的 untouched control:如果基線本身失敗,後面的攻擊結果全部不能解讀。keys/private_key.pem 是未加密的開發私鑰,別把它 commit、上傳或當正式相機身分。
動手做 4 組攻擊:JPEG、resize、crop、local patch
把下列內容存成 make_attacks.py。它從同一張簽章圖產生四個檔案,因此只改一個變因;如果換照片,請把結果當成新實驗,不要外推本文數字。
from pathlib import Path
from PIL import Image, ImageDraw
src = Image.open("signedPhotos/capture_20260625_222028.jpg").convert("RGB")
out = Path("attack-matrix")
out.mkdir(exist_ok=True)
src.save(out / "00-untouched.jpg", quality=95)
src.save(out / "01-jpeg-q60.jpg", quality=60)
w, h = src.size
small = src.resize((round(w * .70), round(h * .70)))
small.save(out / "02-resize70-jpeg-q60.jpg", quality=60)
crop = src.crop((round(w * .005), round(h * .005),
round(w * .995), round(h * .995)))
crop.save(out / "03-center-crop-1pct.jpg", quality=95)
patch = src.copy()
ImageDraw.Draw(patch).rectangle(
(round(w*.425), round(h*.40), round(w*.575), round(h*.60)),
fill="black")
patch.save(out / "04-black-patch-15x20pct.jpg", quality=95)
執行 uv run --frozen python make_attacks.py,再逐張跑 uv run --frozen python -m proof_of_capture verify attack-matrix/檔名.jpg。本文同一環境的輸出如下;patch 的 15%×20% 是影格寬高,覆蓋面積約 3%,不是 15%~20% 面積。

最值得看的不是 JPEG 成功,而是兩種不同失敗。Crop 讓 watermark 無法還原,驗證器只能說「沒找到」;它分不出從未簽過和簽過後被裁切。Local patch 則保留有效簽章與 watermark,整體低頻 pHash 只移動 4 bits,所以仍通過。USENIX Security 2022 的研究已對相近的 classic 64-bit pHash 展示實用對抗風險;但那是把相似圖推過門檻的 evasion,不等於已對這個完整 pipeline 完成「竄改後仍被接受」的簽章移植攻擊,兩者要分開說。
別只看 exit code:記錄四欄才算完成一次測試
目前 CLI 不論驗證成功、找不到 watermark 或判定 altered,程序都會回傳 exit code 0;自動化腳本若只看 $?,可能把失敗當成功。每一列至少保存 watermark_found、signature_valid、distance、authentic 四個狀態,再附輸入檔 SHA-256、尺寸、編碼器版本與完整指令。到這裡再回答一次 Proof of Capture 是什麼?它是一條可檢查的證據 pipeline,不是一個看到綠字就停止思考的真假按鈕。
下一輪也不要只換更多照片;先建立明確的 oracle(預期輸出)。例如:metadata strip 應保留內容、crop 應回 unknown、局部換臉或改文字應被判 altered、錯公鑰應讓 signature invalid。再用不同照片、JPEG encoder、resize kernel 與多代重壓跑 corpus,報告四種 verdict 的比例,而不是挑一張漂亮 sample。這樣才能從 demo 走向 benchmark。
第五種更根本的攻擊:拍螢幕,簽章也可能完全正確
本文沒有把螢幕重拍包裝成實機結果;原因是它根本不是檔案 robustness 測試,而是語意層攻擊。把 AI 合成的火災畫面顯示在螢幕上,再用可信相機拍它,相機確實看見那些光子,簽章也可能完全有效;錯的是觀眾推論「現場真的發生火災」。專案作者主動承認這個邊界,C2PA 2.4 security considerations也用拍攝電視畫面的例子說明相同問題。
再往硬體內看,即使私鑰不能匯出,host 仍可把自己選的 digest 送進安全晶片要求簽名。真正的 capture assurance 還需要可信的 sensor→firmware→signer 路徑、secure boot/attestation,以及外部能辨識的 trust anchor。保護金鑰不被偷,只解掉其中一格。
Proof of Capture、Apple Reference Image、C2PA 差在哪?
- Proof of Capture 原型:保存「簽過的 64-bit pHash+簽章」,以 DWT+DCT watermark 跟圖片一起走;驗證者另拿 photographer public key。它沒有編輯歷程、共同 PKI 或身分保證,優點是程式小、能拆開研究。
- Apple Reference Image:Apple 在 2026 年 9 月 9 日宣布 iPhone 18 Pro 的 Reference mode 讓 sensor 對它看見的每個 pixel 簽署,將 signed sensor data 交給 Private Cloud Compute,生成可在 Photos 並排比較的 unalterable reference image。截至 9 月 15 日硬體尚未於 9 月 18 日開賣;公開 launch/API 文件也沒有交代簽章演算法、憑證信任樹、檔案格式或是否採 C2PA,因此不能替空白補答案。
- C2PA 2.4/Content Credentials:它是跨廠商 provenance 規格。Manifest 內有 assertions、claim 與 signature;hard binding 用密碼雜湊綁定指定資產,soft binding 可用 fingerprint/watermark 找回不同轉碼版本或外部 manifest,X.509 trust list 則回答 signer chain 是否受信。C2PA-aware 編輯器能建立新的 derivative manifest,以 ingredient 與 actions 串起歷程;這不代表每個動作都一定完整記錄。
所以三者不是同一條產品排行榜。Proof of Capture 適合拿來解剖 primitive;Apple Reference Image 是剛宣布、平台整合較深但公開協定細節有限的體驗;C2PA 解的是可互通的 manifest、binding 與 trust。若想先建立 Content Credentials 背景,可讀 AlphaLab 的隱形標記與 C2PA 教學,再搭配文字浮水印原理看不同媒體的取捨。
低於 US$100 的 Raspberry Pi 版:先過 4 道硬閘門
作者列出的 Pi Zero 2W、Camera Module 3、ATECC608 breakout、按鈕與顯示器約 US$70,連外殼、電源、運費與缺貨替代料才可能接近「低於 US$100」;這是專案當時的 BOM 快照,不是即時報價。更重要的是,Microchip 目前把通用 ATECC608B 標成不建議用於新設計,採購前要先確認可用變體與支援生命週期。
- 先停在 software key:完成上面的 known-good sign/verify,留下輸出與 commit。
- 不要直接跑
pi/provision.py:程式會鎖 config/data zone,repo 也明寫 irreversible、只適用 virgin chip。先逐 byte readback、保存設定與公鑰,再準備一顆可替換 spare。 - 先修並測硬體簽章相容性:目前 code 把 8-byte pHash 直接送入
atcab_sign,但 pinned CryptoAuthLib API 要求 32-byte digest;software verifier 又會再做 SHA-256。沒有實機 known-answer test,就不能聲稱兩條路相同。 - 把失敗回復寫在燒錄前:設定錯或鎖錯的回復不是「unlock」,而是更換晶片、回到 software key、重新建立並發布新公鑰。舊照片如何辨識 key rotation,也要先設計。
常見坑:來源證明還會付出哪些代價?
- Key misuse:合法裝置或服務若允許惡意程式送資料簽名,產出的 signature 仍可能有效。
- Linkability:長期重用少見公鑰或憑證,可能把不同照片連成同一裝置/創作者;不必公開姓名也可能形成追蹤線索。
- Metadata disclosure:位置、時間、裝置或舊版本若放進 provenance,完整性變好,隱私暴露也可能增加。C2PA 的 harms model 特別提醒敏感 metadata 與可回復舊版本。
- Missing credentials:Manifest 或 watermark 被移除,只能說 provenance 不可用,不能反推內容一定是假。相反地,valid signature 也不等於 trusted signer,更不等於 truthful scene。
治理規則也會影響平台怎麼揭露 AI 內容;需要把技術證據和政策責任接起來,可延伸讀EU AI Act 透明度規則。而要比較 detector,先定義資料分布、false positive 與攻擊者模型;可用AI Evals 七步入門建立測試框架。
常見問題 FAQ
1. Proof of Capture 能證明照片不是 AI 生成嗎?
不能直接證明。它能驗證某把金鑰是否簽過可恢復的內容指紋;用相機拍 AI 畫面的螢幕,仍可能得到有效簽章。
2. 有簽章就代表圖片完全沒改過嗎?
不代表。這個原型故意用近似 pHash 容忍重壓與縮圖;本文局部 patch 距離 4 仍通過,正是代價。
3. 為什麼不用 exact SHA-256 就好?
因為它太精確。日常 JPEG 重壓就會得到不同 digest。Exact hash 適合驗同一份 bytes;要追 derivative,需額外 manifest/edit chain,或接受 soft binding 的不確定性。
4. Crop 驗證失敗代表抓到竄改嗎?
只能說證據讀不到。原型訊息同時涵蓋「從未簽過、裁切過、劣化過頭」,不能單靠這個 verdict 判定是哪一種。
5. C2PA 會自動判斷新聞是真的嗎?
不會。C2PA 驗的是 association、integrity 與 signer trust;它不替 assertion 的價值或畫面事件真實性背書。
6. Apple Reference Image 已經等於 C2PA 嗎?
目前不能這樣下結論。截至 2026 年 9 月 15 日,Apple 公開 launch 與 viewer API 文件沒有說明是否使用 C2PA,不能用猜測填補。
7. 我現在該買 ATECC608 動手做嗎?
先不要 provision。先跑 software key;等硬體簽章輸入、software verifier、key publication 與 recovery plan 都用實機測通,再決定零件。
8. AI detector 和 provenance 該選哪一個?
高風險情境要組合使用。Detector 是分布相依的機率訊號;provenance 是可驗歷程訊號。再加原始報導、交叉來源與情境查核,才是完整判斷。
給新手的 7 個重點
- 先問系統綁定的是 exact bytes、近似畫面,還是完整編輯歷程。
- Signature 只證明 key 的動作;身分與信任要靠外部 trust root。
- pHash 的 robustness 與局部竄改靈敏度互相拉扯。
- 「找不到 watermark」是 unknown,不是自動判假。
- 有效 capture 仍可能只是拍到螢幕或搭景。
- 安全晶片保護私鑰,不會自動保護 sensor 到簽章的整條路。
- 先跑正對照與負對照,再談真實部署;本文四組變形就是最小起點。
接著閱讀
左右滑動查看更多推薦
結語:先驗證證據,再判斷故事
Proof of Capture 最有價值的地方,不是已經造出「真假照片機」,而是把抽象的 provenance 拆成你能攻擊的零件。本文基線與四組變形讓界線很具體:重壓與 resize 能過,crop 讓證據消失,局部修改甚至可能帶著有效簽章過關。
下一步就從 software key 開始,保留 commit、輸出與失敗案例;每次看到綠色勾勾,都再問三次:內容綁了什麼、我信任哪把 key、這能不能證明事件本身。記住那句公式:可驗證來源 = 內容綁定 × 數位簽章 × 信任根;不等於事件為真。想繼續系統化學習,可從 AlphaLab 的 AI 專區與完整課程接著走。






