3. 图片证据格式:JPEG / PNG / TIFF / BMP
图片证据,在电子取证里是最常见也最容易被忽视的一类。很多人觉得「不就是一张图嘛」,但真到了法庭上,格式不对、元数据丢了、哈希对不上——那可就麻烦了。
我个人习惯把图片证据的处理分成四个步骤:提取元数据 → 计算哈希 → 格式转换 → 隐写检测。每一步都有坑,咱们一个一个说。
3.1 EXIF 元数据提取
EXIF 是什么?说白了就是照片的「身份证」。相机型号、拍摄时间、GPS 坐标、镜头参数……全都嵌在文件里。我遇到过一起案子,嫌疑人说照片是网上下载的,结果 EXIF 里清清楚楚写着拍摄设备序列号和 GPS 坐标,直接打脸。
常用提取工具
| 工具 | 适用场景 | 备注 |
|---|---|---|
| exiftool | 批量提取、深度分析 | 支持几乎所有格式,命令行神器 |
| Exif Pilot | Windows GUI 操作 | 适合非技术人员查看 |
| Python Pillow | 自动化脚本集成 | 取证平台二次开发首选 |
关键点:提取 EXIF 时不要修改原文件。我建议先用 dd 或 fciv 做位对位备份,再对副本操作。
用 exiftool 提取 GPS 坐标的示例:
exiftool -GPSPosition -n evidence.jpg
输出类似 40.7128° N, 74.0060° W。嗯,这里要注意——有些手机厂商会把 GPS 信息放在 MakerNote 私有区,exiftool 默认不读,得加 -u 参数。
3.2 图片哈希校验
哈希校验是证据完整性的底线。MD5 和 SHA256 是取证界的两大标准。我个人更推荐 SHA256,虽然计算慢一点,但抗碰撞能力更强。法院现在也越来越认可 SHA256。
MD5 vs SHA256
| 算法 | 输出长度 | 安全性 | 取证推荐度 |
|---|---|---|---|
| MD5 | 128 bit | 已发现碰撞攻击 | 仅用于快速校验 |
| SHA256 | 256 bit | 目前无实际碰撞 | 首选 |
避坑指南:我曾经遇到过一张图片,肉眼看着一样,MD5 也相同,但 SHA256 不同。后来发现是文件末尾有多余的填充字节。所以,永远不要只依赖 MD5。
计算哈希的 Python 代码:
import hashlib
def calc_hashes(filepath):
md5 = hashlib.md5()
sha256 = hashlib.sha256()
with open(filepath, 'rb') as f:
while chunk := f.read(8192):
md5.update(chunk)
sha256.update(chunk)
return md5.hexdigest(), sha256.hexdigest()
print(calc_hashes('evidence.jpg'))
3.3 格式转换与无损压缩
格式转换在取证里很常见——比如你拿到的是 BMP,但鉴定系统只认 JPEG。但转换有风险,搞不好证据就「变质」了。
各格式特点
| 格式 | 压缩方式 | 是否无损 | 取证适用场景 |
|---|---|---|---|
| JPEG | 有损压缩 | 否 | 网络传播、快速查看 |
| PNG | 无损压缩 | 是 | 截图、图表证据 |
| TIFF | 无损/有损可选 | 通常无损 | 原始证据存档 |
| BMP | 无压缩 | 是 | 极少使用,体积巨大 |
你想想看,JPEG 每次保存都会重新压缩,质量参数设成 100 也不是真正的无损。所以我的原则是:原始证据永远保留原始格式,转换只对副本做。
用 Python 做格式转换:
from PIL import Image
img = Image.open('evidence.bmp')
img.save('evidence_converted.png', format='PNG')
# 注意:转换后要重新计算哈希
小技巧:如果必须用 JPEG,把质量参数设到 95 以上,能最大程度减少信息损失。我一般用 98。
3.4 隐写术初步检测
隐写术,就是把秘密信息藏在图片里。肉眼看不出来,但哈希会变。我处理过一起商业间谍案,嫌疑人把机密文件藏在风景照的像素低位里,用 LSB 隐写——要不是我们做了隐写检测,根本发现不了。
常见隐写手法
- LSB(最低有效位):修改每个像素的最低 1-2 bit,人眼无法察觉
- DCT 系数修改:在 JPEG 的频域里嵌入数据
- 调色板隐写:修改 GIF/PNG 的调色板顺序
- 文件附加:在图片文件末尾追加其他数据
初步检测可以用 zsteg 或 steghide 的检测模式。我个人习惯先用 binwalk 扫一遍,看看文件末尾有没有附加数据:
binwalk -Me evidence.jpg
如果输出里出现了 ZIP 或 PDF 的签名,那基本可以确定有隐写。
注意:隐写检测不是 100% 可靠的。有些高级隐写会加密嵌入数据,或者用自适应算法避开统计异常。初步检测只能发现「可疑」,不能作为定案依据。
3.5 知识体系总览
下面这张图把本章的核心流程串起来了。你可以把它当作操作 checklist:
这张图里每一步都环环相扣。跳过任何一步,都可能让证据在法庭上被质疑。我个人建议,每次处理图片证据都按这个流程走一遍,形成肌肉记忆。
3.6 实战避坑清单
- 不要用手机看图软件打开证据图片——它们可能会自动旋转、压缩、甚至修改 EXIF
- 哈希值要记录在案——我习惯把哈希值打印出来,签字封存
- TIFF 转 JPEG 要小心——16 bit 的 TIFF 转成 8 bit JPEG 会丢失色深信息
- 隐写检测不是一次性的——同一个文件可能用了多种隐写手法,多工具交叉验证更稳妥
最后说一句:图片证据处理,慢就是快。每一步都做扎实了,后面出问题的概率就小很多。我见过太多因为「赶时间」跳过哈希校验,结果证据链断裂的案例了。