月光博客 » 编程开发 » 为什么应该放弃或减少使用MD5

为什么应该放弃或减少使用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的云存储服务。原文链接

顶一下 ▲()   踩一下 ▼()

相关文章

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

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

    我感觉文章说的还是挺有道理的,只不过没提到用来替代md5的方案,比如sha之类的
    支持(6反对(15回复

发表留言