65.9K
CodeProject 正在变化。 阅读更多。
Home

告别 MD5

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.16/5 (38投票s)

2005年8月23日

CPOL

6分钟阅读

viewsIcon

217238

MD5 被破解是否使其无用?

引言

一篇补充文章,展示如何利用这一点,请点击此处

哈希领域出现了一场危机。密码学最新研究成果引发了关于加密单向哈希函数安全性的争论。

我在另一篇文章中建议:

不要将用户密码存储在数据库中。无论您采取多少安全措施,都不存在完美的安全性系统。对密码使用哈希方法,例如SHA1或MD5。

SHA1和MD5已不再安全,因为像passcracking这样的项目,我们不能再信任这些哈希函数进行单向加密。

事实上,专家建议:

"鉴于MD5的实际攻击数量,可能需要
转向联邦信息处理标准 (FIPS) 批准的哈希
算法,例如SHA-256或SHA-512。请注意,最近已发现
SHA-1中的漏洞,NIST 已计划
在2010年之前淘汰它。" (引自cn.bbs.comp.security。)

更新 - 以下是对这些问题的一些反应

据一位公司高管称,微软正在禁止新代码中使用某些加密函数,原因是日益复杂的攻击使其安全性降低。

雷德蒙德(Redmond, Wash.)的这家软件公司为所有开发人员制定了一项新政策,禁止使用DES、MD4、MD5以及在某些情况下SHA1加密算法的函数,该算法正变得“摇摇欲坠”,该公司高级安全项目经理迈克尔·霍华德(Michael Howard)表示。 (来源)

为了理解其后果,本文首先解释了什么是单向哈希函数,展示了它们在密码存储中的常见用途,并展示了当前攻击的性质及其后果,同时还提出了目前更强的其他替代哈希函数。

单向哈希函数

以下定义摘自布鲁斯·施奈尔(Bruce Schneier)的著作:《应用密码学 第二版》(Applied Cryptography Second Edition)

单向哈希函数 H(M) 作用于任意长度的原始消息 M。它返回一个固定长度的哈希值 h。

h = H(M),其中 h 的长度为 m

许多函数可以接受任意长度的输入并返回固定长度的输出,但单向哈希函数具有使其成为单向的附加特性 [1065]

给定 M,计算 h 很容易。
给定 h,很难计算出 M,使得 H(M) = h。
给定 M,很难找到另一个消息 M',使得 H(M) = H(M')。
....

在某些应用中,单向性不足以满足要求;我们需要一个附加要求,称为**抗碰撞性**。

很难找到两个随机消息 M 和 M',使得 H(M) = H(M')。

用于密码存储的哈希函数

前面提到的定义促成了安全密码存储的发展。

单向哈希函数的使用遵循以下算法:

  1. 对于密码存储,从用户请求输入`plain_password`,然后对其应用单向哈希函数H并存储。在代码中,`stored_password = H(plain_password)`
  2. 对于密码检查,从用户处请求`probe_password`,对其应用H,并与`stored_password`进行比较,即检查`::= H(probe_password) == stored_password`。

只要H是一个良好且强大的哈希函数,此方案就是好的。

如今,MD5正遭受严重攻击,原因是它在POSIX函数Crypt的GNU实现中使用。事实上,在这个网站上,您可以找到许多此函数的碰撞。

关于MD5攻击的其他论文可以在这里找到。

其他安全副作用

在最近的研究中,三位研究员:Lenstra、Wang 和 Weger,展示了使用 Wang 开发的 MD5 碰撞技术构建碰撞的电子 X.509 证书是可行的。您可以在此处阅读他们的论文。

这项工作违反了PKI(公钥基础设施)的基本信任原则。

此外,中国研究人员已经展示了对其他哈希函数SHA-1的攻击。(在此阅读)。

其他一些副作用在题为“MD5总有一天会被认为有害”的论文中有所提及。

例如,RSA、DSA/ElGamel 和椭圆曲线等数字签名从不直接哈希数据,而是哈希数据的哈希值,通常选择MD5。还要考虑使用MD5的DRM(数字版权管理)实现。所有这些保护签名和校验和都因这些发现而面临风险。

如果您阅读该论文,您会发现可以向数据添加负载,或者更改数据而不被察觉。

另一个例子在论文《使用MD5消息摘要对数字签名的实际攻击》中展示。

概念验证

这篇文章中,我介绍了如何在Microsoft.NET中实现该攻击。

寻找 MD5 碰撞

碰撞搜索的典型方法是使用暴力破解算法:给定一个哈希值`h`,对于用字母表`A`编写的明文消息`m`,则`h = MD5(m)`,因此在暴力碰撞搜索中,我们尝试字母表`A`中的所有可能组合,直到找到一个消息`m'`,使得`MD5(m') = h`。`m'`可以等于`m`,也可以不等于`m`。

彩虹表攻击(Rainbow Crack)使用预先计算好的表来处理中间步骤,这可以加速破解过程。例如,一个最多14个字符的密码,字符集为:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+=”,可以在几分钟内被破解。

更好的单向哈希函数

有些人建议使用更复杂的MD5应用,例如,使用`stored_password = crypt(plain_password + salt)`,其中密钥是固定的或用户ID,或其他一些固定值。这种方案并不更强,并且可以证明这种方法存在一些缺陷。

其他替代方案包括:

  • 使用基于密钥的哈希函数
  • 组合算法
  • 使用其他函数

第一个方案依赖于一个可能被窃取的密钥。组合算法更好,但可能只会导致更高的CPU使用率,而不是真正的保护。

替代函数

使用其他哈希函数可能是一种解决方案,但选择一个好的哈希函数使用什么标准呢?

答案很简单,使用具有更大结果域的哈希函数。例如,MD5生成128位值,因此可能的结果值空间大小为2128。简单来说,如果您的哈希函数输出域的大小大于此,那么它就是一个不错的替代方案。

以下所有函数的实现都比MD5更强大。

  • WHIRLPOOL,生成512位输出
  • RIPEMD,使用160、128或320位输出
  • SHA-2,生成256、512位输出

SHA-2在加密API和Microsoft.NET中可用,所以我建议您使用它。SHA-2是一组函数,在Microsoft.NET中您有以下类:

  • System.Security.Cryptography.SHA256Managed
  • System.Security.Cryptography.SHA384Managed
  • System.Security.Cryptography.SHA512Managed

更改日志

  • 2005年9月7日:添加了一些来自中国安全组织的引用,以及更多关于MD5碰撞论文的链接。还包含了一个关于DRM和校验和的其他影响的章节。进行了一些语法修正。
  • 2005年9月8日:更改了一些标题,以更精确地描述密码学术语。修正了一些拼写错误。
  • 2005年9月9日:添加了Microsoft.NET 1.1中可用的SHA-2算法列表。
  • 2005年9月14日:添加了指向概念验证文章的链接
© . All rights reserved.