V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kaiki
V2EX  ›  问与答

文件储存用 md5 做标识可行吗,要考虑会出现相同 md5 的文件的情况吗?

  •  2
     
  •   kaiki · 2020-12-27 05:24:56 +08:00 · 5819 次点击
    这是一个创建于 1188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为了节省资源打算验证一下 md5 如果有相同的则直接使用之前的,但是 md5 也是可以重复的,有什么好的校验办法吗?
    49 条回复    2020-12-29 10:15:37 +08:00
    3dwelcome
        1
    3dwelcome  
       2020-12-27 05:36:13 +08:00 via Android
    我是再加上文件大小,和 md5 组合在一起。
    光 md5 判断,你心里用着也不踏实。
    toaruScar
        2
    toaruScar  
       2020-12-27 05:43:44 +08:00
    MD5 不行的,Length Extension Attack 了解一下。
    geelaw
        3
    geelaw  
       2020-12-27 06:01:05 +08:00 via iPhone   ❤️ 1
    @toaruScar #2 length extension 和 collision resistance 不矛盾。

    不过 MD5 已经不是 collision-resistant hash function 了,恶意碰撞可行,所以不宜使用。
    kaiki
        4
    kaiki  
    OP
       2020-12-27 06:11:54 +08:00
    @3dwelcome 所以我记录什么和查询什么才能最效率的识别已存在内容呢?以及标识用什么方法生成
    gunpowderfans
        5
    gunpowderfans  
       2020-12-27 06:23:46 +08:00 via Android
    同时校验多种 hash 也许可以
    kaiki
        6
    kaiki  
    OP
       2020-12-27 06:34:46 +08:00
    @gunpowderfans 校验的话倒是可以多种,校验哪些数据呢?
    url 中就得有一个唯一标识了,这个怎么算呢?
    gyf304
        7
    gyf304  
       2020-12-27 06:56:40 +08:00 via iPhone
    LimeQAQ
        8
    LimeQAQ  
       2020-12-27 09:45:15 +08:00 via iPhone   ❤️ 11
    昨天刚试了两张图片 md5 相同的情况,第二张上传到百度网盘,打开变成了第一张图片。惊不惊喜,意不意外。
    imgbed
        9
    imgbed  
       2020-12-27 09:46:33 +08:00 via Android
    看你有多少文件,如果不大,不需要考虑极小概率
    cmdOptionKana
        10
    cmdOptionKana  
       2020-12-27 10:23:50 +08:00 via Android
    用 sha256
    JinTianYi456
        11
    JinTianYi456  
       2020-12-27 10:41:30 +08:00
    @3dwelcome #1 加上大小也可能一样 /t/169241

    @kaiki 月经问题 /t/733384
    crab
        12
    crab  
       2020-12-27 11:17:14 +08:00
    可以用 sha1+文件大小
    Daming
        13
    Daming  
       2020-12-27 11:22:01 +08:00 via Android
    布隆过滤器还要多个 hash 呢,还不保证一定存在。
    只用 md5 岂不是更不保险。
    riggzh
        14
    riggzh  
       2020-12-27 12:05:37 +08:00 via iPhone
    任天堂使用的是 sha256 然后截取前 16 位
    YouLMAO
        15
    YouLMAO  
       2020-12-27 12:23:27 +08:00 via Android   ❤️ 1
    md5 破解第一人应该是哈工大,活该被制裁
    dethan
        16
    dethan  
       2020-12-27 14:32:54 +08:00 via Android   ❤️ 46
    @YouLMAO 你这是什么脑残言论?我上网这么久,真的是第一次喷人,太傻逼了
    cmdOptionKana
        17
    cmdOptionKana  
       2020-12-27 15:33:43 +08:00
    看这里 https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest

    md5 早已被证明碰撞风险太大,而 sha-1 则是 is now considered vulnerable (脆弱的、易受攻击的)。

    一般来说 sha256 够用了,则在不行还可以考虑用 sha-384 甚至 sha-512
    unixeno
        18
    unixeno  
       2020-12-27 15:46:54 +08:00 via Android
    建议用 sha256
    lysS
        19
    lysS  
       2020-12-27 17:08:48 +08:00
    @LimeQAQ 所以怎么得到两张一样 md5 的照片喃?
    ThirdFlame
        20
    ThirdFlame  
       2020-12-27 17:36:28 +08:00
    sha256 + 文件大小 目前可靠的。
    就个人 /企业使用 md5 + 文件大小 实际上也是没啥问题的。
    learningman
        21
    learningman  
       2020-12-27 20:32:07 +08:00
    @LimeQAQ 百度网盘好像是取前 200k 的 md5 做秒传
    LimeQAQ
        22
    LimeQAQ  
       2020-12-27 21:15:52 +08:00 via iPhone
    @lysS 明天去公司了发链接。手机没有。
    leon0903
        23
    leon0903  
       2020-12-27 21:19:45 +08:00
    都说 md5 不可靠,但是我觉得没必要考虑这种极小概率的情况。我们公司以前就是用的 md5,我从来没见过有客户投诉说文件不对的情况。
    kaiki
        24
    kaiki  
    OP
       2020-12-27 21:20:24 +08:00
    @lysS 好像在文件信息里面不断写入数据来改变 md5 也能碰撞吧
    zhangxiaogang
        25
    zhangxiaogang  
       2020-12-27 21:29:44 +08:00 via iPhone
    不是很关紧的话,文件有修改时间属性,比较一下也可用
    okcdz
        26
    okcdz  
       2020-12-28 00:09:40 +08:00
    看你的量大不大了,如果只是做着玩玩,几百几千,甚至几万个文件,MD5 用着不会有啥问题。
    但是如果考虑拓展性,几百万,千万文件级别,要用更靠谱的方案了。
    kaiki
        27
    kaiki  
    OP
       2020-12-28 00:25:24 +08:00
    @okcdz 就算一两个还是得想点合理的办法,万一有人故意针对呢。
    打算 md5 加 size 校验,应该够用了
    Jooooooooo
        28
    Jooooooooo  
       2020-12-28 00:29:09 +08:00
    百度网盘就用 md5 ( 要是领导问你为什么 md5, 你就这么说
    clf
        29
    clf  
       2020-12-28 00:40:52 +08:00
    除了网盘、视频网站、图库等大批量存储的应用场景,感觉没必要节省这点资源?

    如果需要的话,md5 校验+文件大小判断其实就可以了,另外,相同用户(业务场景)上传的文件才判定为同一文件。这样就基本不可能出啥事情。除非用户刻意找两个 md5 相同且文件大小一样的同后缀文件。
    kaiki
        30
    kaiki  
    OP
       2020-12-28 00:44:53 +08:00
    @lychs1998 因为想删除的时候一把全删,比如有人传黄图,传很多遍,只要还是同一个文件,那删一次就可以了
    clf
        31
    clf  
       2020-12-28 00:52:02 +08:00
    @kaiki #30 那 md5 一致性校验只校验一个用户下的文件就行了,基本不会出问题,不会说一个用户恶意攻击导致其他用户文件丢失。
    如果出现同个用户下 md5 相同的情况,保留服务器上的原文件,更新一下文件的修改日期即可,这样即便发生了什么,旧的文件和新的文件各在服务器和用户本地都有。(再过分一点的省资源方法就是文件在客户端就做 md5 解析校验,然后对比服务器上有没有,没有的再上传,这样还省带宽)
    ijrou
        32
    ijrou  
       2020-12-28 01:32:09 +08:00
    如果文件上千万亿的话,那么 md5 不适合。。。
    kaiki
        33
    kaiki  
    OP
       2020-12-28 01:33:30 +08:00
    @ijrou 上那个等级我还在问这种问题的话,明天领导应该要通知我领工资了
    dusu
        34
    dusu  
       2020-12-28 01:51:38 +08:00 via iPhone
    我司三千万文件,就是用 md5,几年都没有什么问题,楼主想多了
    emeab
        35
    emeab  
       2020-12-28 02:11:01 +08:00
    概率很小~ 加上时间基本不可能
    aliceclark
        36
    aliceclark  
       2020-12-28 03:29:51 +08:00
    具体使用资源大小没有比较过
    但是 MD5 不光有几率 collision,而且很慢
    安利一波: http://cyan4973.github.io/xxHash/
    Arthur2e5
        37
    Arthur2e5  
       2020-12-28 06:25:53 +08:00
    不该,配上长度也不该,因为 md5 不行。现在都公元 202 年了,图速度也可以用 blake3——比 md5 、sha1 、sha256 都快。接下来开始传教 /抹黑同行。

    @aliceclark xxHash 那么大一个 non-cryptographic 。这东西是用来做哈希表的,不是用来防人故意撞得。

    @dusu 面向什么都敢传的用户还用 md5 就是胆大包天。百度云盘前车之鉴放在那里,以文件损坏出名不是吹的。
    wnpllrzodiac
        38
    wnpllrzodiac  
       2020-12-28 07:48:53 +08:00 via Android
    @lysS 尾部嵌入。可以制作以特定字符串停止的滚动 gif.包括文件自身的 md5
    nlzy
        39
    nlzy  
       2020-12-28 10:41:16 +08:00   ❤️ 1
    加上 size 一点用没有。用一台普通的 PC 机在 **几分钟** 内就能生成两个 MD5 一样的文件,而且可以让这两个文件大小一样。

    MD5 首次发现冲突都已经十几年了,为什么还要抱着他不放啊。为什么宁愿写各种业务代码,加什么文件大小,加什么时间戳,都不愿意改用一些没有找到冲突的哈希函数啊。

    在现代的 64 位 CPU 上,SHA-512 真的很快,SHA-256 速度也没有慢到哪里去,这几个哈希函数性能都是在同一个数量级的,单核都是跑几百 MB/s,比机械硬盘或者 G 口网卡的吞吐量都大了。不要再说 MD5 省资源了。

    不要再在新系统中使用 MD5 或者 SHA-1 了,求求你们。
    v2tudnew
        40
    v2tudnew  
       2020-12-28 11:56:25 +08:00
    @LimeQAQ #22 再不发今天又要过去了
    wakzz
        41
    wakzz  
       2020-12-28 14:13:03 +08:00
    目前 md5 会出现哈希冲突的问题,通过使用 sha256 替代 md5 可以解决。
    shansing
        42
    shansing  
       2020-12-28 14:16:13 +08:00
    SHA-256 吧,实在觉得长就截取。
    tabris17
        43
    tabris17  
       2020-12-28 14:18:38 +08:00
    无论是哪种摘要算法,碰撞是肯定的,然而你只要防范恶意碰撞就行了,加盐 md5 足够了
    fffang
        44
    fffang  
       2020-12-28 14:22:25 +08:00
    @nlzy
    @wakzz
    因为 Terminal 自带 MD5 所以大家都用 MD5 吧。。
    LimeQAQ
        45
    LimeQAQ  
       2020-12-28 17:26:57 +08:00
    @v2tudnew 哈哈哈,今天有点忙,我压缩上传某盘了,你下载看一下。给某盘或某乎上传 2.jpg ,打开后会发现现实 1.jpg 的内容。
    哇,注册不够 30 天,不能发链接。你自己拼一下
    pan.baidu.com/s/1svvr6tFoHwrcag9-n-DdhQ 提取码: qg42
    v2tudnew
        46
    v2tudnew  
       2020-12-28 21:09:40 +08:00
    @LimeQAQ #45 ..... 亏我觉得百度校验要半天以为是多种哈希值计算的
    geligaoli
        47
    geligaoli  
       2020-12-28 21:47:13 +08:00
    用 sha256 吧,md5 和 sha1 都已经有冲突文件了。
    LimeQAQ
        48
    LimeQAQ  
       2020-12-28 22:14:43 +08:00 via iPhone
    @v2tudnew 要我写我也是 md5 计算后上传了😳😳😳
    chogath
        49
    chogath  
       2020-12-29 10:15:37 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3763 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:22 · PVG 18:22 · LAX 03:22 · JFK 06:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.