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

请教一个 md5 的问题

  •  
  •   livevilwt · 2017-01-16 11:48:54 +08:00 · 3648 次点击
    这是一个创建于 2869 天前的主题,其中的信息可能已经有所发展或是发生改变。

    向大家请教一个问题,一个大文件分成多块上传,每个请求只带上其中一片数据,怎么算出整个文件的 md5 ? btw 用的是 php

    24 条回复    2017-01-17 15:41:46 +08:00
    araraloren
        1
    araraloren  
       2017-01-16 12:37:23 +08:00
    整个文件的 MD5 只能用整个文件的数据来算。。
    yangff
        2
    yangff  
       2017-01-16 12:46:58 +08:00
    比较简单的做法是自己实现一个 md5 算法,然后每个 block update 之后把 context 存下来……
    abellee
        3
    abellee  
       2017-01-16 12:52:11 +08:00 via iPhone
    你上传之前 拿全文件计算好 不就好了吗
    ykjsw
        4
    ykjsw  
       2017-01-16 12:56:35 +08:00   ❤️ 1
    raysonx
        5
    raysonx  
       2017-01-16 13:02:17 +08:00
    楼上已经说得很清楚了。
    我再补充一点, MD5 现在很容易被碰撞,如果条件允许的话建议上 SHA256
    livevilwt
        6
    livevilwt  
    OP
       2017-01-16 13:39:01 +08:00
    @yangff context 貌似是不可序列化的,不好存..
    yangff
        7
    yangff  
       2017-01-16 13:43:48 +08:00
    @livevilwt 所以说自己实现
    Kilerd
        8
    Kilerd  
       2017-01-16 13:44:01 +08:00
    所以说还是 SHA3 好, 随便 update 。输出 HASH 长度也是随便定的,方便多了。
    stiekel
        9
    stiekel  
       2017-01-16 13:55:55 +08:00
    @raysonx MD5 很容易被碰撞?虽然的确有碰撞的,但说很容易,还是有点夸张吧。
    stancaohua
        10
    stancaohua  
       2017-01-16 14:51:54 +08:00
    @stiekel 不加盐的 MD5 确实很容易。
    而且好像在哪里看到个说法是普通 MD5 应被视为已被破解的加密方式了。。。
    otakustay
        11
    otakustay  
       2017-01-16 15:11:49 +08:00
    @raysonx md5 能碰撞但是要做出具备攻击能力的碰撞可是几乎不可能

    md5 可以流式输入,你必须建个队列,从第 0 块开始到一块就计算一块,如果到的顺序是 1-4-0-2-3 的话,你得等到 0 到了以后一起算 01 ,再等 2 到了把 2 给 update 上去, 3 到了再把 34 给 update 上去
    otakustay
        12
    otakustay  
       2017-01-16 15:12:51 +08:00
    另外一个办法是,如果你的切块的算法是一致的话,每块单独算,再把所有块的 md5 合起来再做一次 md5 其实也是可以保证效果的
    cxbig
        13
    cxbig  
       2017-01-16 15:13:31 +08:00
    LZ 只是用 MD5 验证文件完整性吧?不涉及密码或加密数据,你们谈碰撞、破解的有意义么?

    传输总有个拆分和合并的过程,做完了再验证不就好了?
    raysonx
        14
    raysonx  
       2017-01-16 15:38:43 +08:00
    @stiekel
    @otakustay
    @cxbig
    我只是指出一种更安全的方式的而已,毕竟能用 MD5 的地方一定能用 SHA-2 解决。
    如果只是考虑验证完整性,用 checksum 或者外加纠错码就足够了。
    raysonx
        15
    raysonx  
       2017-01-16 15:43:20 +08:00
    “年份用两位数表示就足够了”
    “ IP 地址用 32 位整数就足够了”
    “ 16K 内存可以满足所有人的需求”
    “又不涉及金钱,干嘛要上 HTTPS ?”
    otakustay
        16
    otakustay  
       2017-01-16 15:44:04 +08:00
    @raysonx 如果 SHA1 的话碰撞难度和 MD5 差不多,如果是 SHA256 的话性能是 MD5 的 1/3 左右, SHA512 和 SHA256 性能相当,看需要取舍吧
    ctsed
        17
    ctsed  
       2017-01-16 15:46:20 +08:00 via iPhone   ❤️ 1
    俩不同文件同 md5
    md5 彩虹表跑明文

    碰撞是第一个意思
    raysonx
        18
    raysonx  
       2017-01-16 15:56:35 +08:00 via Android
    @otakustay 其实就服务端来看, OpenSSL 在近些年的硬件上跑 sha1 和 sha256 的性能都差不多了,取决于实现,不过楼主如果用前端 js 实现估计就没办法了。
    mingyun
        19
    mingyun  
       2017-01-16 23:09:07 +08:00
    php md5_file
    former
        20
    former  
       2017-01-17 09:43:52 +08:00
    前端可以计算出整个文件的 md5 值,然后分片发送给后端,全部传完,后端按照既定的切割算法把文件合并了,然后 md5_file(),比对一下前端计算的值就可以了吧。
    btw 楼主分片上传有什么 demo 可以参考推荐吗
    stiekel
        21
    stiekel  
       2017-01-17 09:53:00 +08:00
    @stancaohua [不加盐的 MD5 确实很容易] ,这个和碰撞没有关系, MD5 碰撞是指两个不同的字符串或文件算出来的 MD5 相同。

    通过穷举或字典计算 MD5 值对比来获取原字符串,这个不是碰撞。
    woostundy
        22
    woostundy  
       2017-01-17 10:35:28 +08:00
    @stancaohua 密码或字符串容易被碰撞,文件几乎不可能被碰撞
    Vizogood
        23
    Vizogood  
       2017-01-17 13:10:11 +08:00
    MD5 会被碰撞是指 不同文件(数据) →相同 MD5
    目前还没有工具能够做到 不同文件(数据)→相同 MD5→指定功能和内容
    彩虹表跑 MD5 密码和碰撞没啥关系,这个是可逆性,并且 MD5 本身不可逆,依靠强大的彩虹表可以对比出原数据.
    离不能用的时候还远呢...... 足够了
    stancaohua
        24
    stancaohua  
       2017-01-17 15:41:46 +08:00
    @stiekel
    @woostundy

    随手在网上搜了篇文章 http://bobao.360.cn/learning/detail/2577.html
    这个问题重点不在于安全,校验文件的方法有很多,我只是指出 MD5 并不安全。当然如果题主确定价值足够低没有被搞的意义的话用什么方法都行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   930 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:38 · PVG 06:38 · LAX 14:38 · JFK 17:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.