请教一个 md5 的问题

2017-01-16 11:48:54 +08:00
 livevilwt

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

3519 次点击
所在节点    程序员
24 条回复
araraloren
2017-01-16 12:37:23 +08:00
整个文件的 MD5 只能用整个文件的数据来算。。
yangff
2017-01-16 12:46:58 +08:00
比较简单的做法是自己实现一个 md5 算法,然后每个 block update 之后把 context 存下来……
abellee
2017-01-16 12:52:11 +08:00
你上传之前 拿全文件计算好 不就好了吗
ykjsw
2017-01-16 12:56:35 +08:00
raysonx
2017-01-16 13:02:17 +08:00
楼上已经说得很清楚了。
我再补充一点, MD5 现在很容易被碰撞,如果条件允许的话建议上 SHA256
livevilwt
2017-01-16 13:39:01 +08:00
@yangff context 貌似是不可序列化的,不好存..
yangff
2017-01-16 13:43:48 +08:00
@livevilwt 所以说自己实现
Kilerd
2017-01-16 13:44:01 +08:00
所以说还是 SHA3 好, 随便 update 。输出 HASH 长度也是随便定的,方便多了。
stiekel
2017-01-16 13:55:55 +08:00
@raysonx MD5 很容易被碰撞?虽然的确有碰撞的,但说很容易,还是有点夸张吧。
stancaohua
2017-01-16 14:51:54 +08:00
@stiekel 不加盐的 MD5 确实很容易。
而且好像在哪里看到个说法是普通 MD5 应被视为已被破解的加密方式了。。。
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
2017-01-16 15:12:51 +08:00
另外一个办法是,如果你的切块的算法是一致的话,每块单独算,再把所有块的 md5 合起来再做一次 md5 其实也是可以保证效果的
cxbig
2017-01-16 15:13:31 +08:00
LZ 只是用 MD5 验证文件完整性吧?不涉及密码或加密数据,你们谈碰撞、破解的有意义么?

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334865

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX