V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
manami
V2EX  ›  分享发现

不可能完成的任务:在图片上打上它的 md5 哈希值

  •  1
     
  •   manami · 2020-01-01 18:10:47 +08:00 · 12006 次点击
    这是一个创建于 1793 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就在刚才,我看到微信有个好友的头像比较好看,就点开来看。发现他给图片加了 2 行信息:

    For xxx use only
    md5: xxx
    

    可以猜测他应该是为了防止别人盗图而加的额外信息。看到这里会发现,这其中有一个他不可能完成的任务:在图片上打上它的 md5 哈希值。于是我就问了我这个朋友,他说他知道的啊,只是打算加个类似水印的东西。给图片打上正确的 md5 哈希值是不可能完成的:因为你一加 md5 哈希值这个图片文件本身就被修改了,md5 哈希值也随之发生了改变。这是多么有意思的事情啊!

    我相信我这个朋友他应该是故意的,因为他是非常聪明的人,很有意思的不可能完成的"水印"把我给惊艳到了。

    于是我打开 ps 软件,把我的微信头像图片也加了这两行信息……

    第 1 条附言  ·  2020-01-02 13:24:11 +08:00
    找到一个国外 2011 年讨论的问题:Can a file contain its md5sum inside it?
    https://security.stackexchange.com/questions/3851/can-a-file-contain-its-md5sum-inside-it
    第 2 条附言  ·  2020-01-02 13:26:43 +08:00

    But it's probably (just about) small enough to fit in a file on a ZFS filesystem, although you'd need a hard disk with a surface area around the size of land area on the planet.

    According to my calculations, assuming you could fit data onto a platter with a density of 10 TB per square inch (around the highest prototypical density around today), and assuming there was an ideal method to save MD5 sums onto a disk (without compression), such a disk would be approximately 47 million square kilometers in surface area, approximately 1/3 of the land area of the Earth. (assuming there was a flat land mass large enough)

    第 3 条附言  ·  2020-01-02 13:31:29 +08:00
    @hst001 个人觉得这位老哥的比喻很贴切
    69 条回复    2020-01-03 16:46:43 +08:00
    also24
        1
    also24  
       2020-01-01 18:16:54 +08:00   ❤️ 3
    楼主你下载一下这张图片,然后 md5 一下试试看?

    https://shells.aachen.ccc.de/~spq/md5.gif
    also24
        2
    also24  
       2020-01-01 18:19:54 +08:00
    zacharyjia
        3
    zacharyjia  
       2020-01-01 18:25:28 +08:00
    哈哈哈,直接被楼上打脸
    我记得 md5 已经有碰撞生成器了
    manami
        4
    manami  
    OP
       2020-01-01 18:25:34 +08:00 via Android
    @also24 我回去试试😂
    manami
        5
    manami  
    OP
       2020-01-01 18:26:25 +08:00 via Android
    sha256 等其他加密类似的呢
    manami
        6
    manami  
    OP
       2020-01-01 18:32:22 +08:00 via Android   ❤️ 1
    @zacharyjia 老哥你怕是理解错了,我知道 md5 已经有碰撞器,但这跟用它来校验文件完整性无关
    Osk
        7
    Osk  
       2020-01-01 18:35:37 +08:00 via Android
    图片格式中应该有不少区域和看到的图像无关,说不定以后随着技术的发展真的能做到 /doge/
    secondwtq
        8
    secondwtq  
       2020-01-01 18:39:24 +08:00   ❤️ 1
    碰撞这个理论上倒是可行,问题是发到网络上(尤其是国内网络)基本都会有一道压图,格式也可能会转。我觉得不行
    delectate
        9
    delectate  
       2020-01-01 18:41:23 +08:00   ❤️ 2
    Here is the explanation:

    1. Generate a gif for each possible digit in the first column
    2. Append collision blocks to each gif to make a 16 way collision
    3. Repeat for each digit
    4. Hash the final product
    5. Replace each digit with the correct digit
    https://news.ycombinator.com/item?id=13823704

    也就是说,只有特定的格式文件才能这么操作,而且要精心匹配,否则不太可能搞定的。
    delectate
        10
    delectate  
       2020-01-01 18:43:33 +08:00   ❤️ 2
    还有个办法是用隐写术保证版权,压缩了也很难被破除;
    就像阿里前几年抢月饼被开除的事情,有人把内部论坛的截图发出来,通过隐写术破译出来泄密者是谁了。
    那么怎么解决隐写术呢?不追求画质的前提下,手机拍一下,问题全解决了。如果追求画质,那么很复杂,知道原理的可以逆向操作,不知道就只能类似于重绘一个很相似的图。
    also24
        11
    also24  
       2020-01-01 18:46:27 +08:00
    @zacharyjia #3
    也不算打脸,只是觉得这个图片很应景就发了一下~

    毕竟还是做不到对任意图片的任意修改,就像 @delectate #9 提到的,有很多条件限制。

    @manami #5
    你看你,一整篇都写的 “哈希”,怎么回帖里翻车写个 “加密” 出来。
    codingadog
        12
    codingadog  
       2020-01-01 18:46:30 +08:00 via Android
    @delectate 拍出来也是能还原的吧。。。毕竟是在频域上做的标记
    lostpg
        13
    lostpg  
       2020-01-01 18:47:09 +08:00 via Android   ❤️ 1
    这种操作叫次原像攻击(已知 x,求 x'使二者的哈希值相同)。sha2,包括你说的 sha256 都是能抵御次原像攻击哒。
    3dwelcome
        14
    3dwelcome  
       2020-01-01 18:54:29 +08:00 via Android   ❤️ 1
    可以学习比特币原理,用循环随机方法来无限逼近特定 hash 值,是可行的。
    比如只匹配 md5 前八位,就可以。
    KunMinX
        15
    KunMinX  
       2020-01-01 19:00:33 +08:00
    加水印了 md5 就发生改动了,刻舟求剑,是这个理不 😂
    manami
        16
    manami  
    OP
       2020-01-01 19:31:34 +08:00 via Android
    @KunMinX 感觉差不多😂
    chinvo
        17
    chinvo  
       2020-01-01 19:35:22 +08:00 via iPhone
    重点在于,只要你重新保存一个压缩格式的图像,那么他的 hash 就会发生天翻地覆的变化

    把原图的 hash 放放到图的元数据里面倒是有点用,但是大部分网站和应用会对图做压缩或者丢弃元数据
    crclz
        18
    crclz  
       2020-01-01 19:39:06 +08:00
    理论上(数学)是可以的。设字母表Σ大小为 S,哈希字符串长度为 L,改变图片的其他部分,组成 S^L + 1 种组合,总会遇到相同的。
    lostpg
        19
    lostpg  
       2020-01-01 19:47:40 +08:00 via Android
    @crclz 哈希的值域都是相当大的,良好设计的哈希算法几乎不可能遇到两个相同哈希的原文。。
    winterbells
        20
    winterbells  
       2020-01-01 20:36:02 +08:00   ❤️ 2
    一直有个想法,
    一个压缩包的密码是自己的 HASH 值
    里面放着一个文件名是自己 HASH 值得文件
    文件的内容也是自己的 HASH 值
    Seanfuck
        21
    Seanfuck  
       2020-01-01 20:56:59 +08:00 via iPhone
    见过 php 混淆加密是验证自身文件 md5 的,文件被修改就跑不了,不知道怎么实现的
    EdwardSherlock
        22
    EdwardSherlock  
       2020-01-01 21:11:47 +08:00   ❤️ 3
    人类的本质是套娃?
    est
        23
    est  
       2020-01-01 21:53:49 +08:00   ❤️ 1
    能吧一个 .rar 文件解压出来得到一个 .txt 里面写的是 .rar 的 md5 不?
    hst001
        24
    hst001  
       2020-01-01 22:12:39 +08:00   ❤️ 1
    这就好像让你去预测未来,但是记得把你的预测过程也预测进去,不然就不准了
    heiheidewo
        25
    heiheidewo  
       2020-01-01 22:48:01 +08:00
    楼主是怎么做到的呢
    manami
        26
    manami  
    OP
       2020-01-01 22:53:39 +08:00 via Android
    @heiheidewo 我没做到,给图片打上的应该是错的 md5 哈希值
    mondeo
        27
    mondeo  
       2020-01-01 22:57:39 +08:00 via Android
    md5 早就被攻破了,随便编个 md5,然后在文件里拼凑些数据进去,就能获得同样的 md5
    alphatoad
        28
    alphatoad  
       2020-01-01 22:59:42 +08:00 via iPhone
    Key extension attack
    mxT52CRuqR6o5
        29
    mxT52CRuqR6o5  
       2020-01-01 23:35:23 +08:00 via Android
    @manami 可以碰撞就代表检验完整性的能力被攻破了
    Youen
        30
    Youen  
       2020-01-01 23:53:59 +08:00
    出生的时候嘴巴里含着自己的基因密码
    xifangczy
        31
    xifangczy  
       2020-01-02 00:18:48 +08:00
    那么,有没有一个 md5 字符串就是它自己的 md5 值?
    Tink
        32
    Tink  
       2020-01-02 00:47:26 +08:00 via iPhone
    @xifangczy #31 有的,你搜搜,以前看到过
    leishi1313
        33
    leishi1313  
       2020-01-02 02:58:26 +08:00 via Android   ❤️ 8
    其实人家的本意是,图像如果被盗用,原图(不带 md5 )拿出来一 hash 就能证明是自己的,因为只有原图才能 hash 出这一串 md5 (不考虑碰撞的吧,也太难了)。楼主的理解歪了
    explore365
        34
    explore365  
       2020-01-02 03:01:47 +08:00
    msg7086
        35
    msg7086  
       2020-01-02 04:44:57 +08:00   ❤️ 2
    @leishi1313 对。MD5 的用意是证明图片来源而不是保证图片文件完整性。
    就算是被重新压缩重新处理,最后的成品图上依然有原始文件的 MD5。
    只要作者能证明他是第一个发布原图的人,就可以证明这个被修改过的文件源自他之手。
    Mithril
        36
    Mithril  
       2020-01-02 07:31:39 +08:00
    @delectate 隐写进去拍照也是会看到的,唯一的办法就是重新生成一张图。或者你知道算法直接抹掉隐写进去的数据。
    areless
        37
    areless  
       2020-01-02 08:19:55 +08:00 via Android
    areless
        38
    areless  
       2020-01-02 08:26:02 +08:00 via Android
    这个技术很成熟了的,大量影片照片其实都有隐藏版权信息的。做数字水印防伪的公司一方面提供按个数量收费的水印服务(一部片子几块钱),一方面提供盗版片源的全网扫描。
    areless
        39
    areless  
       2020-01-02 08:40:37 +08:00 via Android
    不过楼主那个无法做到。逃。。。
    chendeshen
        40
    chendeshen  
       2020-01-02 08:55:51 +08:00 via Android
    这跟 磁力链接 就是 种子文件 .torrent 的 hash ( md5 )? 一样道理?
    itodouble657
        41
    itodouble657  
       2020-01-02 09:15:26 +08:00 via Android
    图片加其他东西生成指定的 md5 ?
    openbsd
        42
    openbsd  
       2020-01-02 09:28:27 +08:00
    图片的话,难道不是加数字水印 ?
    sinv
        43
    sinv  
       2020-01-02 09:29:12 +08:00
    md5($file)==md5($file+md5($file))

    如此这样么?
    imn1
        44
    imn1  
       2020-01-02 09:42:06 +08:00
    @chendeshen
    不一样,文件改名并不影响 hash 值,内容变化才影响
    nanoha
        45
    nanoha  
       2020-01-02 09:55:45 +08:00
    理论上是可行的吧 但是实际能否实现就不知道了
    一个函数加上一个常量然后求导后还是这个函数本身 就看你能否找到那个 e^x
    Rekkles
        46
    Rekkles  
       2020-01-02 09:59:37 +08:00
    我。。。。操我自己?
    iv2ex
        47
    iv2ex  
       2020-01-02 10:12:32 +08:00
    @Rekkles #46 你要是只看结果,这样做没毛病。
    iv2ex
        48
    iv2ex  
       2020-01-02 10:13:52 +08:00
    这个技术很成熟了的,大量影片照片其实都有隐藏版权信息的。做数字水印防伪的公司一方面提供按个数量收费的水印服务(一部片子几块钱),一方面提供盗版片源的全网扫描。
    --------------------------------
    @areless #38 这个方案不错啊,md5 (水印)是防伪,隐藏版权信息也行,只是不明显,外行看起来不酷
    bl5c
        49
    bl5c  
       2020-01-02 11:04:49 +08:00
    ![2020-01-02_110338.jpg]( https://i.loli.net/2020/01/02/M73ybi9FYXAVgEk.jpg)
    好几年前就有了
    ThirdFlame
        50
    ThirdFlame  
       2020-01-02 11:08:15 +08:00
    @bl5c 这是安装程序运行时 读取安装文件 计算出来的。 不是固化的。
    villivateur
        51
    villivateur  
       2020-01-02 11:23:38 +08:00
    这应该是一个数学问题吧?

    对于任意一个数 A,能否找到一个数 B,使得 A+B 的某种哈希值等于 B ?
    villivateur
        52
    villivateur  
       2020-01-02 11:23:54 +08:00
    @villivateur 求大佬解惑
    JerryZhi
        53
    JerryZhi  
       2020-01-02 11:37:32 +08:00
    他只要先对原图求 md5,再把这个 md5 写到图上,并发布。只要原图不泄露,他就能证明自己才是最初来源。
    但是求相关的数学问题确实很有意思哈哈。
    ksvany
        54
    ksvany  
       2020-01-02 12:12:40 +08:00
    禁止套娃
    tetora
        55
    tetora  
       2020-01-02 12:35:00 +08:00 via Android
    绕不过来,感觉不行,我还是可以把水印搞掉再重复一边你的动作
    BlueSky335
        56
    BlueSky335  
       2020-01-02 13:01:41 +08:00
    频域数字水印了解一下,像截图,有损压缩这种方式都无法去除干净。https://www.zhihu.com/question/50735753/answer/122593277
    mxT52CRuqR6o5
        57
    mxT52CRuqR6o5  
       2020-01-02 13:06:15 +08:00
    @manami 最简单的,jpg 文件在文件末尾 append 任意数据也不会影响 jpg 本身,可以靠这个特性去进行碰撞
    lneoi
        58
    lneoi  
       2020-01-02 13:44:41 +08:00
    我几点很久以前加壳软件有这类似的方式,加壳后能校验加壳后的文件 CRC32 是否一致,防止被修改,也是不明白怎么弄的。
    yolee
        59
    yolee  
       2020-01-02 14:09:36 +08:00
    禁止套娃
    mxT52CRuqR6o5
        60
    mxT52CRuqR6o5  
       2020-01-02 14:19:32 +08:00 via Android
    @lneoi 算的不是整个文件的 crc32,而是某一部分
    Pogbag
        61
    Pogbag  
       2020-01-02 14:41:08 +08:00
    winrarsetup.exe.rar
    ahaxzh
        62
    ahaxzh  
       2020-01-02 15:20:46 +08:00
    我吃了一顿饭体重没变
    manami
        63
    manami  
    OP
       2020-01-02 15:26:51 +08:00
    @ahaxzh 😂
    ahaxzh
        64
    ahaxzh  
       2020-01-02 15:32:36 +08:00
    @mondeo 那到底谁是真的 谁是假的呢 哈哈哈哈哈哈哈哈哈哈
    mxT52CRuqR6o5
        65
    mxT52CRuqR6o5  
       2020-01-02 15:32:38 +08:00
    看了些文章,md5 的碰撞攻击是生成两个相同 md5 值的文件,而这个 md5 值是不可控的,碰撞攻击很容易
    生成指定 md5 的攻击叫做 Preimage attack,而进行 Preimage attack 很困难
    我 57 楼的思路应该是行不通的
    qakito
        66
    qakito  
       2020-01-02 16:03:42 +08:00
    针对图片的签名,可以在不改变图片内容(例如 BMP 文件,不改变 RGB 数值; JPG 文件,不改变余弦变换值)的情况下,加入额外的信息;
    如果是一般的 binary 数据,除非该数据在生成时就已经自带了 checksum,否则无法在不改变文件的情况下,加入额外信息
    lneoi
        67
    lneoi  
       2020-01-02 16:27:11 +08:00
    @mxT52CRuqR6o5 我印象中是打开编辑器 六十进制改动头部和末尾 都会被壳拦住说校验不通过,好多年了不太确定就是,壳都不流行了
    shm7
        68
    shm7  
       2020-01-02 17:22:55 +08:00
    可能只是原图片的 hash 值,你们这些程序员就知道搞事情(逃
    ablu
        69
    ablu  
       2020-01-03 16:46:43 +08:00   ❤️ 1
    想到了特德蒋的《你一生的故事》(被改编过《降临》,电影质量嘛……)写到目前人类大部分的认知都是基于因果关系,而费尔马最少时间定律这种不好用因果关系解释的问题……
    没啥想法,感慨一下
    顺便推荐(逃
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3811 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 00:14 · PVG 08:14 · LAX 16:14 · JFK 19:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.