用 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 示意图:上传时记录原始文件的指纹;以文件形式发送的同一文件哈希值相同,通过聊天应用重新发送的副本则不一致

这意味着,在照片上传时保存 64 个字符,就足以在之后检查任何文件是否正是那张照片,而不必保存或重新发送图像本身。

一致能证明什么,不一致说明什么

结果 能证明 不能证明
一致 你手中的文件与存储了指纹的那个文件逐字节相同 场景是真实的,或拍摄前没有摆拍
不一致 文件与原始文件在某处有所不同 有人故意篡改了内容

第二行是人们最容易出错的地方。文件与原始文件不同,有很多无害的原因:

  • 聊天应用会重新压缩图片。 WhatsApp、Messenger 和许多其他应用会缩小并重新压缩以“照片”形式发送的图片。
  • 社交网络在你发帖时会重新压缩并删除元数据。
  • 发的是截图而不是文件。
  • 在相册应用中旋转、裁剪或调整亮度,哪怕只是一点点。
  • 转换格式,例如 HEIC 转 JPEG,或在看图软件中“另存为”。

所以看到不一致时,正确的问题不是“这是假的吗?”,而是“这个文件经过了哪些渠道?”

为什么通过 WhatsApp 或 Messenger 发送的照片永远对不上

为了节省存储和带宽,即时通讯应用通常会重新编码 JPEG 图片:降低分辨率、加大压缩、减少元数据。肉眼看起来一样,但内部字节完全不同,SHA-256 自然也不同。

发送方式 通常保留原始文件吗? SHA-256 比对
在聊天应用中以“照片”发送 不,会被重新压缩 几乎肯定不一致
在聊天应用中以“文件”或文档发送 通常会 通常一致
电子邮件附件 通常会 通常一致
从 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,因此照片不会被上传,然后与存储的值进行比对。页面还会解释聊天应用重新压缩的情况,以免收件人妄下结论。

SnapID 代码的公开验证页面:有效的 SnapID、拍摄日期和时间、取整到约 1 km 的区域及地图链接、工作区、账号和工作内容

三者结合形成三层保障:可信时间说明何时拍摄(请参阅可信时间与手机时间),SnapID 代码和 QR 码指向一份独立的记录,SHA-256 说明文件是否仍然完好。在安全部分了解更多,或试试验证演示。

请记住,这是一种技术核查工具,不是电子签名,也不是经认证的时间戳。越南带时间水印照片的证据效力一文更深入地探讨了这方面的问题。

如果你需要发送收件人能自行核查完整性的照片,下载 SnapID Mark,试着把原图与通过聊天发送的副本比对一下。

常见问题

SHA-256 指纹会泄露照片内容吗?

不会。无法从 64 个字符还原出图像,所以公开指纹不会暴露图片。

通过聊天应用发送的照片对不上,是假的吗?

不是。聊天应用会重新压缩以“照片”形式发送的图片,即使看起来一样,文件也已改变。请对方以文件形式或通过电子邮件发送原图,再进行比对。

在验证页面比对时,我的照片会被上传吗?

不会。你的浏览器在你的设备上计算指纹,图片文件不会离开设备。

一致就说明照片一定是真的吗?

一致只能证明该文件与上传时存储的文件相同。它不能证明场景没有摆拍。还要同时查看时间、区域和完整性标记。

能用从照片导出的 PDF 进行比对吗?

不要用 PDF 比对,因为其中的图像是另一个文件。请用原始 JPEG 进行比对。