MD5的安全性是否低于SHA等.人.在实际意义上?

Dam*_*isa 9 security hash md5 sha

我在SO上看到 一些 问题答案,表明MD5不像SHA这样安全.

我的问题是,这在我的情况下值得担心吗?

这是我如何使用它的一个例子:

  1. 在客户端,我通过附加当前时间和密码然后使用MD5对其进行散列来为消息提供"安全"校验和.所以:MD5(message+time+password).
  2. 在服务器端,我正在使用我发送的时间和客户端密码的知识来检查此哈希.

在这个例子中,我真的更喜欢使用SHA而不是MD5吗?

在什么情况下,散列函数的选择在实际意义上真的很重要?

编辑:

只是为了澄清一下 - 在我的例子中,移植到SHA算法有什么好处吗?

换句话说,在这个例子中,有人在不知道共享密码的情况下发送消息和正确的哈希是否可行?

更多编辑:

为重复编辑道歉 - 我不清楚我在问什么.

Bri*_*ell 29

是的,在实践中值得担心.MD5非常破碎,研究人员已经能够伪造与证书颁发机构签署的真实证书相匹配的假证书.这意味着他们能够创建自己的假证书颁发机构,因此可以冒充他们认为完全信任它们的浏览器的任何银行或业务.

现在,这需要他们花费大量的时间和精力使用一组PlayStation 3,并且需要几周时间才能找到适当的碰撞.但是一旦破坏,哈希算法只会变得更糟,永远不会更好.如果您完全关心安全性,最好选择一个完整的哈希算法,例如SHA-2系列之一(SHA-1也被削弱了,虽然没有像MD5那样严重破坏).

编辑:我提供给你的链接中使用的技术包括能够选择两个任意消息前缀和一个公共后缀,从中可以为每个前缀生成一个可以在该前缀和公共后缀之间插入的数据块,生成与从另一个前缀构造的消息具有相同MD5总和的消息.我无法想到在您描述的情况下可以利用这种特定漏洞的方式,并且通常,使用安全的消息身份验证比使用数字签名更能抵御攻击,但我可以想到一些您需要注意的漏洞,这些漏洞大多与您选择的哈希值无关.

  1. 如上所述,您的算法涉及在服务器上以纯文本格式存储密码.这意味着您容易受到任何可能在服务器上发现密码的信息泄露攻击.您可能认为如果攻击者可以访问您的数据库,那么游戏就会启动,但是即使您的服务器遭到入侵,您的用户也可能更喜欢他们的密码.由于在线密码的激增,许多用户在服务中使用相同或类似的密码.此外,即使在代码执行或特权升级攻击不是的情况下,也可能发生信息泄露攻击.

    您可以通过使用随机盐在服务器上存储密码来缓解此攻击; 您将该对存储在<salt,hash(password+salt)>服务器上,并将salt发送到客户端,以便它可以计算hash(password+salt)用来代替您提到的协议中的密码.但是,这并不能保护您免受下一次攻击.

  2. 如果攻击者可以嗅探客户端发送的消息,他可以对客户端的密码进行离线字典攻击.大多数用户拥有相当低的熵密码,并且一个包含数十万现有密码的良好字典以及随机排列它们的一些时间可以根据攻击者通过嗅探消息非常容易的信息来查找密码.

  3. 您建议的技术不会验证服务器.我不知道这是否是您正在谈论的网络应用程序,但如果是,那么可以执行DNS劫持攻击,或在不安全的无线网络上进行DHCP劫持的人,或者其他任何类型的人都可以做中间人攻击,他们从客户那里以明文收集密码.

  4. 虽然目前针对MD5的攻击可能不会对您所描述的协议起作用,但MD5已经严重受损,并且哈希只会越来越弱,永远不会更强.你想打赌你会发现可以用来攻击你的新攻击,并且在攻击者有机会利用它之前有时间升级哈希算法吗?从目前比MD5更强的东西开始可能更容易,以减少你不得不进一步处理MD5的机会.

现在,如果您只是为了确保没有人在论坛或其他东西上伪造来自其他用户的消息,那么肯定的是,任何人都不可能花费时间和精力来破坏您描述的协议.如果有人真的想冒充其他人,他们可能只是创建一个新的用户名,使用Unicode代替O或者更相似的东西,甚至不用尝试伪造消息和破坏哈希算法.

如果这被用于安全性非常重要的事情,那么就不要发明自己的身份验证系统.只需使用TLS/SSL.密码学的基本规则之一不是发明自己的.然后即使对于论坛的情况来说,它可能并不重要,那么仅仅使用经过验证的东西而不是滚动自己的东西会不会更容易?


Fry*_*Guy 12

在这种特殊情况下,我认为您的应用程序使用md5而不是sha的最薄弱环节.md5被"破坏"的方式是,假设md5(K)= V,则可以生成K',使得md5(K')= V,因为输出空间是有限的(不是因为有任何减少搜索空间的技巧).但是,K'不一定是K.这意味着如果你知道md5(M + T + P)= V,你就可以生成P',使得md5(M + T + P')= V,这给出了一个有效的条目.但是,在这种情况下,消息仍然保持不变,并且P没有受到损害.如果攻击者试图用T'时间戳伪造消息M',则除非P'= P,否则md5(M'+ T'+ P')= md5(M'+ T'+ P)的可能性极小.在这种情况下,他们会强制密码.如果他们有强制密码,那么这意味着你使用sha或md5并不重要,因为检查md5(M + T + P)= V是否相当于检查sha(M + T + P) )= V.(除了sha可能需要更长的时间来计算,这不会影响P上蛮力的复杂性).

但是,如果有选择,你真的应该继续使用sha.没有使用它是没有意义的,除非使用它有严重的缺点.

第二件事是您可能不应该以纯文本形式将用户密码存储在数据库中.您应该存储的是密码的哈希值,然后使用它.在您的示例中,哈希值为:md5(message + time + md5(password)),您可以安全地将md5(密码)存储在数据库中.但是,攻击者窃取您的数据库(通过SQL注入之类的东西)仍然可以伪造消息.我没有看到任何解决方法.


Sam*_*ron 8

Brian的答案涵盖了这些问题,但我确实认为需要对其进行详细解释

您在这里使用了错误的加密算法

MD5在这里是错误的,Sha1在这里使用是错误的Sha2xx使用错误而且Skein使用错误.

您应该使用的是RSA之类的东西.

让我解释:

您的安全哈希有效地发送密码供全世界查看.

你提到你的哈希是"时间+有效载荷+密码",如果第三方获得你的有效载荷的副本并知道时间.它可以找到密码(使用蛮力或字典攻击).所以,它几乎就像你以明文形式发送密码一样.

如果您的服务器向您的代理发送公钥并让代理使用公钥加密数据,则应该查看公钥加密.

中间没有人能够在消息中说出什么,没有人能够伪造消息.

另一方面,MD5在大多数时候都非常强大.


Ben*_*ins 5

这取决于消息内容的价值.SHA系列显然比MD5更安全("更安全"意味着"更难伪造"),但如果您的消息是Twitter更新,那么您可能不在乎.

如果这些消息是处理金融交易的分布式系统的IPC层,那么您可能更关心.

更新:我还应该补充一点,两个摘要算法在很多方面基本上是可以互换的,那么使用更安全的算法真的会有多麻烦呢?

更新2:这是一个更彻底的答案:http://www.schneier.com/essay-074.html