V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
voidshine
V2EX  ›  分享创造

JPEG 图片篡改检测

  •  
  •   voidshine · 22 天前 · 1709 次点击

    我写一个简单的 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!
    
    24 条回复    2024-10-18 15:37:31 +08:00
    vus520
        1
    vus520  
       22 天前
    截屏缩放裁剪呢?
    voidshine
        2
    voidshine  
    OP
       22 天前
    @vus520 测试过缩放, 也能检测到图片被修改. 原理上只要动过 JPEG 文件的文件头至文件尾的任何内容, 都会与签名信息对不上.
    hatw
        3
    hatw  
       22 天前
    比较 MD5 啥的不也一样?
    voidshine
        4
    voidshine  
    OP
       22 天前
    @hatw 这种方法是自举的, 不依赖外部存储, 能自己证明我是我; md5 比较也就意味着要 原始图片的 md5 与 要验证的图片 md5 进行对比.
    hatw
        5
    hatw  
       22 天前
    @voidshine #4 了解,谢谢
    alexsz
        6
    alexsz  
       22 天前
    一时想不出有哪些应用场景
    voidshine
        7
    voidshine  
    OP
       22 天前
    @alexsz 确保监控摄像头捕获的图像未被篡改......之类的?
    NoOneNoBody
        8
    NoOneNoBody  
       22 天前   ❤️ 1
    EOI 就是 ffd9 之后吧,这些截了也不影响图片显示,不少图片存储的服务器是直接截了的,避免借传图片之名传不当信息
    如果截了之后,如何自举?
    voidshine
        9
    voidshine  
    OP
       22 天前
    @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
        10
    iqoo  
       22 天前
    还以为利用水印信息存储签名呢
    voidshine
        11
    voidshine  
    OP
       22 天前
    @NoOneNoBody 其实好像就是自举不了, 仅针对已经签过名的图片的篡改识别, 未签名 或 签名信息被破坏 或 签名信息与图片信息对不上 的都算被篡改过了
    ltyj2003
        12
    ltyj2003  
       22 天前 via Android   ❤️ 1
    人家篡改完重新生成个签名信息替换,阁下当如何应对?
    voidshine
        13
    voidshine  
    OP
       22 天前
    @ltyj2003 用的本机的 gpg 指纹生成的签名, 别人机器生成的签名本机应该是检测为已被修改过, 因为属于 签名信息与图片信息对不上
    yhnbgfd
        14
    yhnbgfd  
       22 天前
    一直在想有什么场景,
    比如, 以后手机截图自带签名功能, 以后各种屏幕截图拿去验签一下就知道是真截的还是 p 的? 额, 如果我直接截屏 P 的图片阁下..额
    Afcar
        15
    Afcar  
       22 天前
    @ltyj2003 你说到点子上了
    Yukineko
        16
    Yukineko  
       22 天前
    @voidshine #13 意识是只有在特定机器上校验才能通过?换一个机器就校验不了了?
    TimG
        17
    TimG  
       22 天前 via Android
    @voidshine 13# 这种情况也能自举?不用存储旧信息就能实现吗?如果旧验证信息同样存在于文件内那就存在被一起篡改的可能,否则理论上就没法自举,如果能同时实现,确实是有巧思,佩服。
    kera0a
        18
    kera0a  
       22 天前 via iPhone
    下一步是不是要引入 ca 了😄
    voidshine
        19
    voidshine  
    OP
       22 天前 via iPhone
    @Yukineko 是的,但是可以将一台机器上的 gpg 公钥私钥导出为文件,然后 scp 到目标服务器再导入,就能识别了。做这个的初衷就是上传到本服务器的 jpeg 要被打上签名,用户下载的图片是带签名的图片
    cavan
        20
    cavan  
       22 天前
    可以考虑图像数字水印技术,这种技术可以保证图片肉眼看不出内容变化的情况下,隐写版权信息进去。比如对图像矩阵进行离散余弦变换后,把版权信息写入到矩阵的左上角,然后再离散余弦反变换回 jpeg 图像,这样截图、缩放、旋转后,版权信息一般都还在。
    voidshine
        21
    voidshine  
    OP
       22 天前 via iPhone
    @cavan 之前参考过这个 ,挺厉害的. https://github.com/guofei9987/blind_watermark
    qdwang
        22
    qdwang  
       22 天前
    我目前只想到一种适用情况。就是怕云服务器把我图片改了。。。其他好像没什么用?
    cat
        23
    cat  
       21 天前
    @voidshine 所以在哪台机器生成的 只能在哪台机器验证吗,这个局限性 感觉比截掉 ffd9 的问题更大啊
    Greatshu
        24
    Greatshu  
       21 天前
    一个场景是监控录像机给下载的图片签名,保证是图片没有修改
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2413 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:43 · PVG 23:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.