文件储存用 md5 做标识可行吗,要考虑会出现相同 md5 的文件的情况吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kaiki
V2EX    问与答

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

  •  2
     
  •   kaiki 2020-12-27 05:24:56 +08:00 6925 次点击
    这是一个创建于 1773 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为了节省资源打算验证一下 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
      &nbp; 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
    任天堂使用的是 sha56 然后截取前 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,几年都没有什么问题,楼主想多了
    2kCS5c0b0ITXE5k2
        35
    2kCS5c0b0ITXE5k2  
       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 了,求求你们。
    Overfill3641
        40
    Overfill3641  
       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
    Overfill3641
        46
    Overfill3641  
       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     Solana     1098 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:11 PVG 07:11 LAX 15:11 JFK 18:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86