N 个月之前,我在百度开放云平台上提了几个问题,今天他们回复了我一个。
我的问题是这样的:
看了分片文件上传的文档,有点疑问?1. 如果分片的片段中恰巧有片段内容和其他片段相同,那么合并的文件是否会不完整?2. md5 是有碰撞的可能的,假如内容不同 md5 恰巧相同,那么合并文件是否就有问题?当然这都是比较极端的情况,但是不排除这样的可能,这个地方的设计是否不太合理?
他们的回复:
您好,问题 1:这个需要您切割文件的时候注意即可避免,问题 2:,如果文件内容不一样,MD5 不可能一样的,请您知晓。
请大家感受
Update: 怕误伤了人,改了吧
md5 摘要值一般最后可以写成 32 个 ascii 字符,以小写字母和数字组成。共有 (26+10)^32 种可能排列。大概是 6.33E49,也就是 6 乘以 10 的 49 次方。你要知道整个宇宙的恒星数量也只不过是 3E23。换句话说,如果每颗恒星都爆发成一个完整的小宇宙,大概就是 md5 的 6E49 量级了。
所以,你到底是有多海量的文件,才能在 10 的 49 次方这个量级里面,遇到“碰撞是经常出现的事情”?
呵呵,MD5 只是加密串,不是内容压缩。像二维码就是根据内容转换的,能够转回来成文字内容。
如果你把 MD5 当做那啥,内容压缩工具,那就逗了,一部 3D 电影几个 G,转成几十个字符,那太牛了。以后看电影,只需要拷贝那几十个字符,逆转下就成 3D 电影啦。也就是说,MD5 重复是必然滴,它的作用只是用来验证判断内容是否发生过变化。。。
如果只是谈论 md5 的话 不同的文件 md5 可以一样,通过某个黑科技可以实现. http://www.mscs.dal.ca/~selinger/md5collision/
#5 楼 @seamon md5 可以表示成 32 个 16 进制 数字而不是任意 ascii 字符,排列数约 3.40E38, 但是由于 birthday paradox, 网盘里如果总共有 2.2E19 个文件 (目前应该达不到这么多), 就有 50% 的几率出现 md5 相同的文件,另外由于 md5 hash 长度比较短,人为制造相同的哈希需要的计算量,远比穷举哈希空间需要的计算量少得多,别说 "不可能". 虽然网盘还可以进一步对 md5 相同的文件做内容比较再决定是否合并,但涉及安全的地方别用 md5 是常识才对...
#9 楼 @night_song 多谢。这个是我疏忽了。共 128 位,应该是 16^32 才对。MD5 安全性不强这是肯定的,人工精心构造数据的话,是可以有一定概率发生碰撞的。单纯 MD5 是无法保证安全性的,多种手段结合会更靠谱一些。
#12 楼 @aptx4869 时间有点久了,记得是不一样的,但也不排除这个可能性。
这个命题有点意思,我去找点数据实验下。第三方的帖子也没少见到,比如说上传的是一个文件,下载下来却是另一个文件(当然也有可能是迅雷之类的 bug)。
至于理论,单纯从字符的位数来进行概率分析是比较初级的,不懂理论,希望下面的内容对看客有所启发。 http://wenku.baidu.com/view/5e3e82d649649b6648d747c4
======= @aptx4869 @seamon 对少量文件匹配了下,我觉得很可能是我「妖言惑众」啦,应该是疏忽了,抱歉,「大量」是不可能的,也就不浪费计算力去验证了。 虽然有自动生成 md5 一样的程序和文件,都是人为的。 不过百度云这样的量级不应该这么不严谨。
不说文件,随机生成的 128bit 的字符串,也可能发生碰撞,而且概率还很高,我做了个实验,使用 openssl 生成随机数,然后进行 md5,大约 11w 个的时候,就开始碰撞了,还有 从 1 开始生成数字,大约 2 千万的时候开始有了第一个碰撞(时间久了,记不太清楚具体多少了,反正肯定在 1 亿之内)