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

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

  前面一篇文章讲述了为什么应该放弃或减少使用MD5,意料之外的是,线上线下都有不少读者表示希望知道更多信息。也有一些专家级读者指出了文章中的一些不足和不够详细的地方。希望能在这篇文章中一并补充,如有错误,也烦请指正。

  首先,原文是说MD5算法在很多场合都不再安全,应该避免使用,并不是全面否定其他安全哈希算法。SHA-2系列算法在最近几年应该还是足够安全和可靠的。另外,按照计划,SHA-3系列的哈希算法也即将在近期公开发布

  因此,对读者而言,这篇文章最有意义的提示是:“在使用安全哈希算法时,考虑使用SHA-2系列算法乃至更高级别算法,而不是MD5“。

  MD5最大的问题在于,通过我国的王晓云教授等学者的工作,md5已经被证明可以进行碰撞攻击。也就是说,攻击者可以产生两个应用程序,内容不一样,但是哈希值完全一样。

  在云存储的应用场合中,这种危害表现为攻击者可以伪造一个Windows 的安装光盘,在其中嵌入木马,通过上述手段让MD5哈希值和微软官方发布的光盘一致,抢先上传到分享类网盘中。如果该网盘采用MD5检查重复文件(例如离线下载服务), 木马就会被植入到希望下载原版光盘用户的电脑中。

  这种攻击形式不是天方夜谈,根据微软官方的报告,一款名为Flame的木马就用了类似的手段。当然,这种方式目前还是非常高级的攻击手段。

  另外,实际应用中我们也常需要验证对方发送的数据没有经过任何攻击者篡改。 例如,微博的API(应用接口)服务就需要验证请求来自于一个合法的授权方,而不是一个借用第三方名义的攻击者。

  使用私钥加密,公钥解密验证的方式是完全可行的,但是因为非对称加密算法执行效率低下。因此,很多时候会用类似MD5的哈希算法验证哈希值和内容一致来保证数据未被篡改。

  从前一篇文章的描述可以看出,MD5在这种场景是不安全的,不过需要额外注意的是,即使SHA-2系列的算法用于这个场景也是不安全的,这个时候应该考虑使用HMAC系列的对称验证算法。这个问题的根源是,从理论上上来说,如果知道hash(secret key +X),即使不知道secret key的内容, 仍然可能通过对X的分析,计算得到hash(secret key +Y),从而将X成功的替换成Y,导致接收误以为Y就是X。而HMAC尽管基于安全哈希算法,却能避免这个类型的攻击。

  从开放API的实例来看,Flickr的API在早期犯过这个错误

  当然,如果用于验证通信中的数据是否因为信道干扰损坏(而非攻击者人为干扰),或者将数据进行足够均匀的分布,MD5还是完全称职的,甚至是优秀的。关于这方面的内容,如果读者有兴趣,欢迎通过微博或者评论反馈,我们也可以再行补充。

  来源:坚果云投稿(一个用于移动办公的安全云存储服务)。原文链接

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

相关文章

  1. 1
    斌头   说道:
    SHA-3已经于2012年10月发布,成为新一代Hash标准。因此,现在讨论的不应该再是“放弃或减少使用MD5”,而是如何全面在行业中认识并使用国际标准。
    支持(9反对(5回复
  1. 2
    dashashi   说道:
    感觉只要是校验码,无论什么算法,都是有可能碰撞的吧,唯一减少碰撞的的办法就是增加校验码的长度,而且只有当校验码跟原文一样长才可能没碰撞- -不然一个校验码必然对应多个原文,不过用跟原文一样长的东西当校验码- -显然是不可能的吧- -|
    精英王子 于 2012-10-14 23:49:12 回复
    关键是MD5现在被发现了可以通过较小的成本来伪造校验码的方法。
    所以它不再安全了
    dashashi 于 2012-10-15 22:38:30 回复
    其实我一直很奇怪,王晓云教授的论文都这么久了,怎么网上就找不到程序实现他的算法的
    支持(4反对(2回复
  1. 3
    dkmilan   说道:
    王晓云教授的研究我记得是可以通过特定的算法加速实现碰撞。原来的方法,对于原文M获得一个伪造原文N使得H(M)=H(N)需要撞大运,以及构造Rainbow table。伪造原文N和原文M基本都会相差很远。利用她的研究成果可以使得这个加速实现。 但是无法实现对指定的原文M混入一小块指定的P而构造一个极其相近的M'还能让H(M)=H(M')
    蓝天白云 于 2012-10-15 11:33:44 回复
    参考上面Flame的分析报告。
    支持(8反对(9回复
  1. 4
    Aquamarine   说道:
    SHA-1也不安全了吗?直接提到SHA-2系列了。
    支持(4反对(5回复
  1. 5
    X   说道:
    其实之前有一个碰撞的例子,既是两个文件一同增加数据,使其哈希值变得一样,如果是一个已经释出哈希值的文件进行针对性修改,再通过向修改后的单一文件增加数据并使其哈希值变为相同,是很不现实的,即使成功碰撞,3K和300K的差距,明眼人还是可以看出来
    支持(3反对(4回复
  1. 6
    X   说道:
    我还是觉得楼主的两篇文档都稍显无力,第二篇强调的碰撞攻击法可能还没有一些字典来的快,希望楼主能能从细节上出来站到安全框架上做一些解决方案的点子,以进行科普,让后端程序员早日脱离细节苦海。BTW,支持楼主技术贴
    支持(5反对(6回复
  1. 7
    overmind911   说道:
    貌似md5的碰撞只是你给个md5,我能造个一样md5的文件,至于这个文件是exe还是sh还是其他,只能随机了。
    北 于 2012-10-15 9:04:13 回复
    大致支持你的观点。不过文件名是不影响MD5的.
    carelance 于 2012-11-14 15:04:27 回复
    文件名不影响MD5,但是你随便把一个文件后缀改成exe它就能运行么。。。
    支持(5反对(8回复

发表留言