V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
manami

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

  •  1
     
  •   manami · Jan 1, 2020 · 12828 views
    This topic created in 2309 days ago, the information mentioned may be changed or developed.

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

    For xxx use only
    md5: xxx
    

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

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

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

    Supplement 1  ·  Jan 2, 2020
    找到一个国外 2011 年讨论的问题:Can a file contain its md5sum inside it?
    https://security.stackexchange.com/questions/3851/can-a-file-contain-its-md5sum-inside-it
    Supplement 2  ·  Jan 2, 2020

    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)

    Supplement 3  ·  Jan 2, 2020
    @hst001 个人觉得这位老哥的比喻很贴切
    69 replies    2020-01-03 16:46:43 +08:00
    also24
        1
    also24  
       Jan 1, 2020   ❤️ 3
    楼主你下载一下这张图片,然后 md5 一下试试看?

    https://shells.aachen.ccc.de/~spq/md5.gif
    also24
        2
    also24  
       Jan 1, 2020
    unifier
        3
    unifier  
       Jan 1, 2020
    哈哈哈,直接被楼上打脸
    我记得 md5 已经有碰撞生成器了
    manami
        4
    manami  
    OP
       Jan 1, 2020 via Android
    @also24 我回去试试😂
    manami
        5
    manami  
    OP
       Jan 1, 2020 via Android
    sha256 等其他加密类似的呢
    manami
        6
    manami  
    OP
       Jan 1, 2020 via Android   ❤️ 1
    @zacharyjia 老哥你怕是理解错了,我知道 md5 已经有碰撞器,但这跟用它来校验文件完整性无关
    Osk
        7
    Osk  
       Jan 1, 2020 via Android
    图片格式中应该有不少区域和看到的图像无关,说不定以后随着技术的发展真的能做到 /doge/
    secondwtq
        8
    secondwtq  
       Jan 1, 2020   ❤️ 1
    碰撞这个理论上倒是可行,问题是发到网络上(尤其是国内网络)基本都会有一道压图,格式也可能会转。我觉得不行
    delectate
        9
    delectate  
       Jan 1, 2020   ❤️ 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  
       Jan 1, 2020   ❤️ 2
    还有个办法是用隐写术保证版权,压缩了也很难被破除;
    就像阿里前几年抢月饼被开除的事情,有人把内部论坛的截图发出来,通过隐写术破译出来泄密者是谁了。
    那么怎么解决隐写术呢?不追求画质的前提下,手机拍一下,问题全解决了。如果追求画质,那么很复杂,知道原理的可以逆向操作,不知道就只能类似于重绘一个很相似的图。
    also24
        11
    also24  
       Jan 1, 2020
    @zacharyjia #3
    也不算打脸,只是觉得这个图片很应景就发了一下~

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

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

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

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

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