JPEG 图片篡改检测

1 天前
 voidshine

我写一个简单的 JPEG 图片防篡改工具. 希望大家帮我看看有没有漏洞可以钻.

主要思路是对 JPEG 图片进行签名并将签名信息写入 EOI 文件尾, 若签名后的图片内容有任何的改动(不包括修改文件名), 则无法通过验证, 以此来检测该图片相较于签名前的图片是否有改动过.

项目已上传至GitHub

$ pixelguard sign -i official.jpg  -o output_official.jpg		# 将签名信息写入图片尾部
JPEG file signature successful!

$ pixelguard verify output_official.jpg			# 图片未被修改
This JPEG file has not been tampered with.

$ exiftool -Artist="happy-shine" output_official.jpg	# 修改 EXIF 信息(或修改像素点之类的操作)
    1 image files updated

$ pixelguard verify output_official.jpg		# 再次验证, 检测到图片内容被修改
Warning: This JPEG file has been tampered with!
1123 次点击
所在节点    分享创造
24 条回复
vus520
1 天前
截屏缩放裁剪呢?
voidshine
1 天前
@vus520 测试过缩放, 也能检测到图片被修改. 原理上只要动过 JPEG 文件的文件头至文件尾的任何内容, 都会与签名信息对不上.
hatw
1 天前
比较 MD5 啥的不也一样?
voidshine
1 天前
@hatw 这种方法是自举的, 不依赖外部存储, 能自己证明我是我; md5 比较也就意味着要 原始图片的 md5 与 要验证的图片 md5 进行对比.
hatw
1 天前
@voidshine #4 了解,谢谢
alexsz
1 天前
一时想不出有哪些应用场景
voidshine
1 天前
@alexsz 确保监控摄像头捕获的图像未被篡改......之类的?
NoOneNoBody
1 天前
EOI 就是 ffd9 之后吧,这些截了也不影响图片显示,不少图片存储的服务器是直接截了的,避免借传图片之名传不当信息
如果截了之后,如何自举?
voidshine
1 天前
@NoOneNoBody 这个确实是一个问题, 还不知道咋解决, 现在的做法是直接当成被修改过了, 不接受识别不了签名的图片:

$ pixelguard sign -i official.jpg -o output_official.jpg
JPEG file signature successful!

$ pixelguard verify official.jpg # 原图, 没有签名信息
Warning: This JPEG file has been tampered with!
iqoo
1 天前
还以为利用水印信息存储签名呢
voidshine
1 天前
@NoOneNoBody 其实好像就是自举不了, 仅针对已经签过名的图片的篡改识别, 未签名 或 签名信息被破坏 或 签名信息与图片信息对不上 的都算被篡改过了
ltyj2003
1 天前
人家篡改完重新生成个签名信息替换,阁下当如何应对?
voidshine
1 天前
@ltyj2003 用的本机的 gpg 指纹生成的签名, 别人机器生成的签名本机应该是检测为已被修改过, 因为属于 签名信息与图片信息对不上
yhnbgfd
1 天前
一直在想有什么场景,
比如, 以后手机截图自带签名功能, 以后各种屏幕截图拿去验签一下就知道是真截的还是 p 的? 额, 如果我直接截屏 P 的图片阁下..额
Afcar
23 小时 57 分钟前
@ltyj2003 你说到点子上了
Yukineko
23 小时 46 分钟前
@voidshine #13 意识是只有在特定机器上校验才能通过?换一个机器就校验不了了?
TimG
23 小时 38 分钟前
@voidshine 13# 这种情况也能自举?不用存储旧信息就能实现吗?如果旧验证信息同样存在于文件内那就存在被一起篡改的可能,否则理论上就没法自举,如果能同时实现,确实是有巧思,佩服。
kera0a
23 小时 34 分钟前
下一步是不是要引入 ca 了😄
voidshine
23 小时 33 分钟前
@Yukineko 是的,但是可以将一台机器上的 gpg 公钥私钥导出为文件,然后 scp 到目标服务器再导入,就能识别了。做这个的初衷就是上传到本服务器的 jpeg 要被打上签名,用户下载的图片是带签名的图片
cavan
23 小时 27 分钟前
可以考虑图像数字水印技术,这种技术可以保证图片肉眼看不出内容变化的情况下,隐写版权信息进去。比如对图像矩阵进行离散余弦变换后,把版权信息写入到矩阵的左上角,然后再离散余弦反变换回 jpeg 图像,这样截图、缩放、旋转后,版权信息一般都还在。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1081246

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX