青青子衿, 悠悠我心, 但为君故, 沉吟至今
« 为什么说内容营销是营销之王苹果iPhone营销策略 »

为什么应该放弃或减少使用MD5

  MD5即Message-Digest Algorithm 5(信息-摘要算法 5),是网络上广泛使用的散列(Hash)算法之一,可以实现将任意长度的数值映射为固定长度的较小数值。

  MD5是一种常用的单向Hash算法。它被广泛用于以下几个用途:

  1、检查数据是否一致。将两地存储的数据进行哈希,比较结果,如果结果一致就无需再进行数据比对。这是利用了其“抵抗冲突”(collision- resistant)的能力,两个不同的数据,其哈希值只有很小的几率一致。相当多数据服务,尤其是网盘服务,利用类似的做法来检测重复数据,避免重复上传。

  2、存储用户密码。将密码哈希后的结果存储在数据库中,以做密码匹配。这是利用了其做为单向哈希的特点,从计算后的哈希值不能得到密码。

  3、校验数据正确性。将数据和数据哈希后的结果一并传输,用于检验传输过程中数据是否有损坏。这是利用了很难找到两个不同的数据,其哈希结果一致的特点。

  下面我们将说明为什么对于上面三种用途, MD5都不适用。

  第一个用途尤其可怕。这个用途的最大的问题是,MD5在现实中已经被发现有相当多的数据都可能导致冲突。举例而言,如下两段数据的MD5哈希值就是完全一样的。

    数据 1 

    4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
    d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
    af bf a2 00 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
    93 d8 49 67 6d a0 d1 55 5d 83 60 fb 5f 07 fe a2

    数据 2

    4d c9 68 ff 0e e3 5c 20 95 72 d4 77 7b 72 15 87
    d3 6f a7 b2 1b dc 56 b7 4a 3d c0 78 3e 7b 95 18
    af bf a2 02 a8 28 4b f3 6e 8e 4b 55 b3 5f 42 75
    93 d8 49 67 6d a0 d1 d5 5d 83 60 fb 5f 07 fe a2

    输出相同的MD5 哈希

    008ee33a9d58b51cfeb425b0959121c9

  这意味着,如果用户提供数据 1,服务器已经存储数据 2。通过简单的MD5哈希方式检查重复,服务器上为用户保存的数据就是2。 接下来发生的事情大家都知道了,就是用户数据丢了!

  第二个用途很容易遭到rainbow table攻击,和明文存储密码的实质区别不大。更详细的分析可以察看这篇文章

  第三个用途里一般会在需要哈希的数据中混入某些秘密,也就是计算公式为md5(secret key + data)。 但这样并不适合用于验证数据的完整性。这是因为,从理论上上来说,如果知道md5(secret key +X),即使不知道secret key的内容, 仍然可能通过对X的分析,计算得到md5(secret key +Y),从而将X成功的替换成Y,导致接收方仍然认为数据是正确的。

  来源:坚果云投稿,坚果云是一款类似Dropbox的云存储服务。原文链接



  除非注明,月光博客文章均为原创,转载请以链接形式标明本文地址

  本文地址:http://www.williamlong.info/archives/3229.html
  • 文章排行:
  • 1.EdiTurn
  • 这片文章就像是在说“因为吃饭有噎死的危险,所以应该放弃或减少吃饭”。
    单方面的列出一种事物的缺点,然后呼吁放弃使用毫无意义。相比之下更需要说明的是有什么比之优秀,并能够克服或者一定程度上缓解上述缺点的替代方案。
  • 2012/9/25 9:41:24   支持(42)反对(6) 回复
  • 2.magicd
  • 在劝导别人放弃这类使用的同时,是不是应该发表一下该用什么来替代,sha1? des? 纯粹吐槽缺点是毫无意义的,说的缺点都是众所周知,毫无新意。
  • 2012/9/25 9:52:59   支持(21)反对(10) 回复
  • 3.金马
  • 批评一下月光博客,在转别人的博客的时候,是不是可以把原博客的一些格式加一下?我看这个原博客上两段数据的MD5哈希值使用了粗字体明确了展现出来不同之处,而你转别人博客的时候,是不是也应该关注一下? 而不是让我们读者费力去找。
  • 2012/9/25 13:54:40   支持(22)反对(11) 回复
  • 4.没看见
  • 乍一看很有道理,实际跟没说一样。
  • 2012/9/25 13:17:29   支持(13)反对(6) 回复
  • 5.gudezhi
  • 月光博客开始什么文章都能引了啊。。这是故意吸引别人来喷么?
    另外第三条理由没看懂。有人能帮忙解释下吗?
  • 2012/9/27 22:01:34   支持(11)反对(5) 回复
  • 6.nobush
  • 第三條應不成為理由,因為數據傳輸都是用戶局部行為不可能出現離奇的低概率錯誤機會。
  • 2012/10/7 20:03:40   支持(8)反对(2) 回复
  • 7.北
  • 扯淡。
    1,MD5用来做数据校验仍然可靠,文件发生碰撞的概率极其微小,除非刻意构造。而实际上从概率学上讲,真正有用的文件发生碰撞问题可以认为是不可能事件。
    2,如果仅仅是一次简单的MD5当然不够安全,但是如果按不同的用户加入不同的salt并且多次MD5,就比较安全了。
    第三个用途恕我才疏学浅,没看懂。但是MD5包含的数据量并不大,LZ说的可是证书摘要?
  • 2012/9/25 10:16:34   支持(11)反对(7) 回复
  • 8.okchin
  • 不懂密码学,只是知道MD5、SHA-1均被国内数学家王小云破解,理论上数据基本可以伪造.这两个这么广泛使用的算法,也不可能说丢就丢啊,反正手上有没有什么星球级机密.
    末法时代 于 2012-9-25 19:31:21 回复
    楼上的,那个不是破解,是碰撞,但是伪造仍然是很困难的,需要非常强大的计算能力,成本非常高。例如,要对现在比特币网络进行51%攻击就需要投入大量资金去购置硬件设备。
  • 2012/9/24 23:15:00   支持(11)反对(12) 回复
  • 9.abc
  • 今天我想只通过MD5来查看我的15万+个文件是不是有重复的,结果有6组文件是MD5相同的,每组包括大约50个文件,另有一组包括160个文件,一组包括近300个文件。当然,它们实际上是大小不同的文件。
  • 2012/10/5 20:25:42   支持(7)反对(8) 回复
  • 10.lq
  • 烦请博主推荐一个完美的解决方案
  • 2012/10/8 9:20:15   支持(8)反对(9) 回复
  • 11.Yong
  • 求更好的解决方案、、、、、、、
  • 2012/10/8 13:45:49   支持(8)反对(9) 回复
  • 12.zengyj
  • 数据1:57aa81978af52fc299d4b79b96855d09
    数据2:eb57d1e73384b087d6e895e3fda048b4
  • 2012/9/24 15:12:21   支持(9)反对(11) 回复
  • 14.Jas0n
  • 刚算了下md5的可能信是1.844674407371E+19,不知道有没有算错
    这么说如果数据多余这个数,就肯定出现碰撞了,但这个数据量似乎非常大了,其余情况是运气差的情况下出现了碰撞
  • 2012/10/9 8:34:34   支持(6)反对(8) 回复
  • 16.不明觉厉
  • 感觉这篇文章说的有失偏颇。可能MD5有以上这些问题,但我觉得在实际使用过程中,它的作用远比这些可能存在的问题来的重要。

    我浏览器用的是firefox,用扩展downthemall来进行下载就是看中它的校验功能,无论是SHA-1或是MD5。例如我在google code或是其它提供校验码的网站下载东西,并且把校验码输入到dta中,在下载完的同时,它就会自动校验,从而保证文件的完整性。我觉得就这一个功能就非常有用。
  • 2012/9/25 18:57:44   支持(7)反对(10) 回复
  • 17.zengyj
  • 为什么我将“数据1”和“数据2”在
    ostools.net/encrypt?type=2
    进行md5散列,得到的值不一样?
    chengs2035 于 2012-9-24 15:28:04 回复
    1楼的,你那是文本加密,不一样。
    williamlong 于 2012-9-24 15:39:37 回复
    要输入二进制格式的数值才行。
    蓝天白云 于 2012-9-24 19:22:00 回复
    是的,要二进制格式才可以。 而且是哈希不是加密。
  • 2012/9/24 15:11:43   支持(5)反对(9) 回复
  • 18.alexblair
  • 哈哈~现在MD5=明文了
    不过,碰撞的事情,是无法绝对避免的,目前MD5的计算速度还是有点纠结的,所以,实际使用中会有多维检测方式。比如文件大小+CRC32这样的方式,就完全可以比对文件是否一致了,当然CRC32的重合概率更高,但是速度比MD5要快很多。
  • 2012/9/26 17:09:20   支持(9)反对(13) 回复
  • 19.Jas0n
  • md5是0000000000000000到ffffffffffffffff的值吗?
    有几种可能信啊
  • 2012/10/9 8:23:56   支持(6)反对(10) 回复
  • 20.overmind
  • 网盘的话,文件大小+md5不就行了。真有字节数+md5都一致的存在?
    fotomxq 于 2012-9-26 9:42:45 回复
    只能说碰撞率小了很多,算是一个可行的方案
    sqrabs 于 2012-9-29 13:55:30 回复
    文中的碰撞数据不就是字节数一样的
  • 2012/9/25 10:06:48   支持(9)反对(14) 回复
  • 21.寒川
  • 概率上不是说小概率事件不可能发生的么?
    精英王子 于 2012-9-29 10:18:42 回复
    如果有人刻意伪造的话,就可能发生了

    我感觉文章说的还是挺有道理的,只不过没提到用来替代md5的方案,比如sha之类的
  • 2012/9/28 16:17:43   支持(6)反对(14) 回复

发表评论:

 请勿发送垃圾信息、广告、推广信息或链接,这样的信息将会被直接删除。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 关注新浪微博:关注新浪微博
  • 关注腾讯微博:关注腾讯微博
  • 关注认证空间:关注QQ空间
  • 通过电子邮件订阅
  • 通过QQ邮件订阅

站内搜索

热文排行


月度排行

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.
This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License.