用 SHA-256 指紋偵測被編輯過的相片

用白話解釋 SHA-256:相符代表什麼、不相符代表什麼、為什麼透過 WhatsApp 或 Messenger 傳的相片永遠不相符,以及如何比對檔案。

要判斷一個影像檔案從最初記錄後是否被改過,最可靠的方式是比對兩個檔案的 SHA-256 指紋:相符代表兩者逐位元組完全相同,不相符則代表檔案已改變。但「改變」不等於「造假」:光是透過 WhatsApp 或 Messenger 傳送一張相片,就足以讓比對不相符。這篇指南用白話解釋 SHA-256、它能證明什麼和不能證明什麼,以及實務上站得住腳的流程。

注意: 本文為一般資訊,不構成法律意見。個案中證據如何認定,由相關機關決定。

用白話說,SHA-256 是什麼

把 SHA-256 想像成一台為 檔案產生指紋 的機器。不論丟進去的是 3 MB 的相片還是 2 GB 的影片,它都會回傳一串固定 64 個字元的字串,開頭類似 9f2c1a…。這個演算法由美國 NIST 標準 FIPS 180-4 規範,從銀行到軟體下載都在使用。

有三個重要特性:

  1. 同一個檔案,同一個指紋。 不論計算幾次、用哪台電腦,結果都是同一串字。
  2. 極小的變動,完全不同的結果。 改一個像素或刪掉一行中繼資料,新的指紋就和舊的毫無相似之處。沒有「差不多相符」這回事。
  3. 單向。 無法從指紋還原相片,實務上也沒有人能刻意製造出指紋相同的另一個檔案。

SHA-256 示意圖:上傳時記錄原始檔的指紋;以文件方式傳送的同一檔案雜湊值相同,經聊天 App 重新傳送的副本則不相符

這表示相片送達時只要存下 64 個字元,日後就能檢查任何檔案是否正是那張相片,不必保存或重新傳送影像本身。

相符能證明什麼,不相符又代表什麼

結果 能證明 不能證明
相符 你手上的檔案與記錄指紋的那個檔案逐位元組完全相同 場景是真實的,或拍攝前沒有刻意佈置
不相符 檔案和原始檔有某種不同 有人蓄意修改內容

第二列是大家最常誤解的地方。檔案與原始檔不同,有很多無害的原因:

  • 聊天 App 會重新壓縮影像。 WhatsApp、Messenger 和許多 App 會把以「相片」傳送的影像縮小並重新壓縮。
  • 社群網站 在你發文時會重新壓縮並刪除中繼資料。
  • 用 螢幕截圖 而不是傳送檔案。
  • 在圖庫 App 中 旋轉、裁切或調整亮度,即使只是一點點。
  • 轉換格式,例如 HEIC 轉 JPEG,或從檢視器「另存新檔」。

所以看到不相符時,正確的問題不是「這是假的嗎?」,而是「這個檔案經過了哪些管道?」

為什麼透過 WhatsApp 或 Messenger 傳的相片永遠不相符

為了節省儲存空間和頻寬,通訊 App 通常會 重新編碼 JPEG 影像:降低解析度、加強壓縮、減少中繼資料。肉眼看起來一樣,但內部的位元組完全不同,所以 SHA-256 也不同。

傳送方式 通常保留原始檔嗎? SHA-256 比對
在聊天 App 中以「相片」傳送 否,會重新壓縮 幾乎一定不相符
在聊天 App 中以「檔案」或文件傳送 通常會 通常相符
電子郵件附件 通常會 通常相符
從 Google Drive 或 OneDrive 下載的原始檔 會 相符
螢幕截圖 否 不相符

印在相片上的 QR 碼在壓縮後通常仍可掃描,所以即使指紋比對失敗,收件人也能查核拍攝時間和區域。請參考 QR 碼相片驗證。

實用的比對流程

如果你是傳送相片的人(承包商、技術人員、外勤人員)

  1. 日常更新用聊天快速傳相片沒問題。
  2. 重要的相片(查驗、交接、保險理賠),另外傳送原始檔,以檔案、電子郵件或共用資料夾傳送。
  3. 傳送原始檔前不要裁切、旋轉或編輯。
  4. 在訊息中附上 SnapID 代碼,方便收件人快速查詢。

任何人都能驗證:每張相片都有 SnapID 代碼和 QR 碼;收件人不需帳號即可掃描,看到時間、區域和完整性標記,並能用 SHA-256 比對檔案

如果你是收到相片的人(業主、客戶、主管、保險公司)

  1. 掃描 QR 碼,或用相片上的代碼打開驗證頁面。
  2. 檢查拍攝時間、區域和完整性標記。
  3. 點 與我的檔案比對,選擇你收到的原始檔。
  4. 相符:檔案完好。不相符:檢查它是否經過會壓縮的管道,再索取原始檔。
  5. 如果透過不壓縮的管道傳送的原始檔仍不相符,請詢問傳送者,並仔細查看驗證頁面上的縮圖。

自己計算 SHA-256

自行檢查或存檔時,內建工具就夠用:

  • Windows(命令提示字元):certutil -hashfile photo.jpg SHA256
  • macOS(終端機):shasum -a 256 photo.jpg
  • Linux:sha256sum photo.jpg

把輸出結果和傳送者給你的字串比對。只要有一個字元不同,就是兩個不同的檔案。

SnapID Mark 如何使用 SHA-256

SnapID Mark 相片上傳時,伺服器會儲存 原始相片和加上戳記的影像兩者 的 SHA-256 指紋。公開驗證頁面會顯示指紋,以及可信的拍攝時間、約略區域和完整性標記。「與我的檔案比對」按鈕會 在收件人的瀏覽器內 計算 SHA-256,所以相片不會被上傳,再與儲存的值比對。頁面也會說明聊天 App 重新壓縮的情況,讓收件人不會妄下結論。

SnapID 代碼的公開驗證頁面:有效的 SnapID、拍攝日期與時間、約略到 1 公里並附地圖連結的區域、工作區、帳號與工項

這樣就有三層:可信時間 說明何時(請參考 可信時間 vs 手機時間)、SnapID 代碼和 QR 碼 連到獨立的記錄、SHA-256 說明檔案是否仍然完好。更多資訊請見 安全性,或試試 驗證示範。

請記得,這是技術性的檢查工具,不是數位簽章,也不是經認證的時間戳記。時間戳記相片能當證據嗎 對這方面有更深入的探討。

如果你需要傳送收件人能自行查核完整性的相片,下載 SnapID Mark,試著把原始檔和透過聊天傳送的副本比對看看。

常見問題

SHA-256 指紋會洩漏相片內容嗎?

不會。無法從 64 個字元還原影像,所以公開顯示指紋不會暴露畫面。

透過聊天 App 傳送的相片不相符,是假的嗎?

不是。聊天 App 會重新壓縮以「相片」傳送的影像,即使看起來一樣,檔案也已改變。請對方以檔案或電子郵件傳送原始檔,再拿那個比對。

在驗證頁面比對時,我的相片會被上傳嗎?

不會。你的瀏覽器在你的裝置上計算指紋,影像檔案從未離開裝置。

相符就代表相片一定是真的嗎?

相符只證明檔案與上傳時儲存的檔案相同,不能證明場景沒有被佈置。也請一併查看時間、區域和完整性標記。

可以比對從相片匯出的 PDF 嗎?

不要用 PDF 比對,因為 PDF 內的影像是另一個檔案。請用原始 JPEG 比對。