我写一个简单的 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!
![]() | 1 vus520 2024-10-17 17:30:10 +08:00 截屏缩放裁剪呢? |
2 voidshine OP @vus520 测试过缩放, 也能检测到图片被修改. 原理上只要动过 JPEG 文件的文件头至文件尾的任何内容, 都会与签名信息对不上. |
![]() | 3 hatw 2024-10-17 17:36:39 +08:00 比较 MD5 啥的不也一样? |
4 voidshine OP @hatw 这种方法是自举的, 不依赖外部存储, 能自己证明我是我; md5 比较也就意味着要 原始图片的 md5 与 要验证的图片 md5 进行对比. |
6 alexsz 2024-10-17 17:46:47 +08:00 一时想不出有哪些应用场景 |
8 NoOneNoBody 2024-10-17 17:55:23 +08:00 ![]() EOI 就是 ffd9 之后吧,这些截了也不影响图片显示,不少图片存储的服务器是直接截了的,避免借传图片之名传不当信息 如果截了之后,如何自举? |
9 voidshine OP @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! |
![]() | 10 iqoo 2024-10-17 18:04:04 +08:00 还以为利用水印信息存储签名呢 |
11 voidshine OP @NoOneNoBody 其实好像就是自举不了, 仅针对已经签过名的图片的篡改识别, 未签名 或 签名信息被破坏 或 签名信息与图片信息对不上 的都算被篡改过了 |
12 ltyj2003 2024-10-17 18:06:08 +08:00 via Android ![]() 人家篡改完重新生成个签名信息替换,阁下当如何应对? |
13 voidshine OP @ltyj2003 用的本机的 gpg 指纹生成的签名, 别人机器生成的签名本机应该是检测为已被修改过, 因为属于 签名信息与图片信息对不上 |
![]() | 14 yhnbgfd 2024-10-17 18:11:00 +08:00 一直在想有什么场景, 比如, 以后手机截图自带签名功能, 以后各种屏幕截图拿去验签一下就知道是真截的还是 p 的? 额, 如果我直接截屏 P 的图片阁下..额 |
17 TimG 2024-10-17 18:39:27 +08:00 via Android @voidshine 13# 这种情况也能自举?不用存储旧信息就能实现吗?如果旧验证信息同样存在于文件内那就存在被一起篡改的可能,否则理论上就没法自举,如果能同时实现,确实是有巧思,佩服。 |
![]() | 18 kera0a 2024-10-17 18:43:04 +08:00 via iPhone 下一步是不是要引入 ca 了 |
19 voidshine OP @Yukineko 是的,但是可以将一台机器上的 gpg 公钥私钥导出为文件,然后 scp 到目标服务器再导入,就能识别了。做这个的初衷就是上传到本服务器的 jpeg 要被打上签名,用户下载的图片是带签名的图片 |
20 cavan 2024-10-17 18:50:17 +08:00 可以考虑图像数字水印技术,这种技术可以保证图片肉眼看不出内容变化的情况下,隐写版权信息进去。比如对图像矩阵进行离散余弦变换后,把版权信息写入到矩阵的左上角,然后再离散余弦反变换回 jpeg 图像,这样截图、缩放、旋转后,版权信息一般都还在。 |
21 voidshine OP @cavan 之前参考过这个 ,挺厉害的. https://github.com/guofei9987/blind_watermark |
![]() | 22 qdwang 2024-10-17 19:54:53 +08:00 我目前只想到一种适用情况。就是怕云服务器把我图片改了。。。其他好像没什么用? |
![]() | 24 Greatshu 2024-10-18 15:37:31 +08:00 一个场景是监控录像机给下载的图片签名,保证是图片没有修改 |