对像MD5这样的哈希蛮力有什么大不了的

时间:2010-06-09 21:13:45

标签: security hash cryptography md5 sha1

我只是花了一些时间阅读https://stackoverflow.com/questions/2768248/is-md5-really-that-bad(我强烈推荐!)。

在其中,它讨论了哈希冲突。也许我在这里遗漏了一些东西,但是你不能只用MD5加密你的密码,然后再说SHA-1(或其他任何一个,没关系。)这不会增加所需的处理能力蛮力破解哈希并减少碰撞的可能性?

6 个答案:

答案 0 :(得分:5)

首先,md5和sha1不是加密函数,它们是消息摘要函数。此外,大多数哈希在现实世界中使用John The RipperRainbow Crack等字典攻击而被破坏。

John The Ripper最适合盐渍密码,攻击者知道盐值。 Rainbow Crack适用于具有小型未知盐和直线哈希的密码,如md5($pass)

Rainbow Crack需要很长时间来构建表格,但在此之后密码会在几秒钟内中断。这取决于磁盘驱动器的速度。

答案 1 :(得分:3)

你在谈论2个不同(虽然相关)的问题。首先是碰撞的可能性,第二个是能够在大量值上运行算法以找到创建散列的原始值。

  1. 碰撞即可。如果运行sha1(md5(text)),首先得到md5的哈希值,然后将其传递给sha1。假设sha1函数具有128位输出,md5也具有128位输出。你在md5函数中碰撞的几率是1/2 ^ 128。那么你在sha1中碰撞的几率是1/2 ^ 128。如果两者发生冲突,则整个功能发生碰撞,因此结果为(1/2^128) + (1/2^128)1/2^127
  2. 暴力强迫。运行sha1(md5(text))只会使查找原始字符串所需的时间加倍。这在安全性方面没有任何意义。例如,如果每个算法有128位的输出空间,并且需要1小时的暴力,则需要2个小时才能运行相同的强力两次以获得原始字符串。这与将输出空间增加到129位相同。但是,如果你想真正使强制执行不可能,你需要做的是将输出大小加倍(可以与加密中的密钥大小进行比较)。

答案 2 :(得分:2)

碰撞攻击(例如,对MD5已知的类型)没有真正的好处。为了在密码方面有效,您需要一个前映像攻击(即能够找到一些将散列到已知哈希码的输入)。虽然已知有针对MD5的原像攻击,但它们目前还不实用。

碰撞攻击对完全不同的目的很有用。已经执行的一个示例是为两个碰撞的不同身份创建两个X.509证书。提交一个由证书颁发机构签名,然后您可以使用另一个声明您完全是其他人。由于哈希将与第一个冲突冲突,当用户尝试验证证书时,它将显示为已经过验证。

答案 3 :(得分:2)

首先不使用散列函数加密创建Message Digest。

你的问题:

  

但你不能只加密(哈希)你的   密码使用,比方说,MD5然后,   说,SHA-1(或任何其他,不是   物。)

如果散列函数没有提供任何这些属性,那么你散列的次数并不重要,攻击者也可以散列n次以获得冲突。

  
      
  1. 对于任何给定的代码h,找到它在计算上是不可行的   这样的x,即H(x)= h,这个属性是   称为单向或抗原图像。

  2.   
  3. 对于任何给定的块x,找到y≠x在计算上是不可行的   H(y)= H(x)。这个属性是   提到第二前像抗性或   弱碰撞

  4.   
  5. 找到任何梨(x,y)在计算上是不可行的   H(X)= H(Y)。这称为强   抗冲击。

  6.   

正如The Rook所提到的,密码是通过为每个用户添加不同的salt值来存储的。如果利用密码文件,字典会变得更长,并且攻击者的计算开销和时间也会更长。

假设攻击者拥有密码的散列值,并开始从字典文件中读取并与散列值进行比较,如果匹配,那么pasword被破解,如果使用salt,则从字典中读取并添加一些盐值然后尝试找到一个匹配。但是这应该为每个用户完成。所以盐增加的复杂性(来自维基百科)

  

假设用户(加密)密钥   是被盗的,他知道使用一个   他的200,000英文单词   密码。系统使用 32位   盐即可。盐渍的钥匙现在是   原始密码附加到此   随机32位盐。因为这   盐,攻击者的预先计算   哈希是没有价值的。他必须   计算每个单词的哈希值   每个2 ^ 32(4,294,967,296)可能   添加盐直到找到匹配。   可能的输入总数   可以通过乘以得到   字典中的单词数量   可能的盐数量:   alt text

if H(password+salt)(in system)=H(Your password+salt) (login process)
login else
print<<error

答案 4 :(得分:1)

当您多次散列密码时,实际上会增加散列冲突的可能性,因此最佳做法是仅散列一次。

它与执行蛮力攻击的容易程度无关。这种攻击将系统地尝试给定范围内的每个可能的密码。因此,如果你的密码是“foobar”并且攻击测试密码“foobar”,那么你输入密码的次数和次数并不重要,因为暴力攻击成功地猜到了它。

因此,如果您希望防范暴力攻击,可以限制用户尝试授权或要求密码超过一定长度的频率。

旁注; Rainbow表和类似的方法被已经获得数据库访问权限的黑客使用,并且用于解密存储的密码。为了使这种攻击更加困难,你应该使用静态和动态盐。

答案 5 :(得分:-2)

散列哈希是一种“通过混淆加密”,这实际上并不是最佳实践。你是对的,它理论上可以“减少”碰撞的可能性,但它可能不会消除这种可能性。更重要的是,散列函数并不是真正的加密函数,谷歌“散列与加密”有数百种解释。