我只是花了一些时间阅读https://stackoverflow.com/questions/2768248/is-md5-really-that-bad(我强烈推荐!)。
在其中,它讨论了哈希冲突。也许我在这里遗漏了一些东西,但是你不能只用MD5加密你的密码,然后再说SHA-1(或其他任何一个,没关系。)这不会增加所需的处理能力蛮力破解哈希并减少碰撞的可能性?
答案 0 :(得分:5)
首先,md5和sha1不是加密函数,它们是消息摘要函数。此外,大多数哈希在现实世界中使用John The Ripper和Rainbow Crack等字典攻击而被破坏。
John The Ripper最适合盐渍密码,攻击者知道盐值。 Rainbow Crack适用于具有小型未知盐和直线哈希的密码,如md5($pass)
。
Rainbow Crack需要很长时间来构建表格,但在此之后密码会在几秒钟内中断。这取决于磁盘驱动器的速度。
答案 1 :(得分:3)
你在谈论2个不同(虽然相关)的问题。首先是碰撞的可能性,第二个是能够在大量值上运行算法以找到创建散列的原始值。
(1/2^128) + (1/2^128)
或1/2^127
答案 2 :(得分:2)
碰撞攻击(例如,对MD5已知的类型)没有真正的好处。为了在密码方面有效,您需要一个前映像攻击(即能够找到一些将散列到已知哈希码的输入)。虽然已知有针对MD5的原像攻击,但它们目前还不实用。
碰撞攻击对完全不同的目的很有用。已经执行的一个示例是为两个碰撞的不同身份创建两个X.509证书。提交一个由证书颁发机构签名,然后您可以使用另一个声明您完全是其他人。由于哈希将与第一个冲突冲突,当用户尝试验证证书时,它将显示为已经过验证。
答案 3 :(得分:2)
首先不使用散列函数加密创建Message Digest。
你的问题:
但你不能只加密(哈希)你的 密码使用,比方说,MD5然后, 说,SHA-1(或任何其他,不是 物。)
如果散列函数没有提供任何这些属性,那么你散列的次数并不重要,攻击者也可以散列n次以获得冲突。
对于任何给定的代码h,找到它在计算上是不可行的 这样的x,即H(x)= h,这个属性是 称为单向或抗原图像。
对于任何给定的块x,找到y≠x在计算上是不可行的 H(y)= H(x)。这个属性是 提到第二前像抗性或 弱碰撞
- 醇>
找到任何梨(x,y)在计算上是不可行的 H(X)= H(Y)。这称为强 抗冲击。
正如The Rook所提到的,密码是通过为每个用户添加不同的salt值来存储的。如果利用密码文件,字典会变得更长,并且攻击者的计算开销和时间也会更长。
假设攻击者拥有密码的散列值,并开始从字典文件中读取并与散列值进行比较,如果匹配,那么pasword被破解,如果使用salt,则从字典中读取并添加一些盐值然后尝试找到一个匹配。但是这应该为每个用户完成。所以盐增加的复杂性(来自维基百科)
假设用户(加密)密钥 是被盗的,他知道使用一个 他的200,000英文单词 密码。系统使用 32位 盐即可。盐渍的钥匙现在是 原始密码附加到此 随机32位盐。因为这 盐,攻击者的预先计算 哈希是没有价值的。他必须 计算每个单词的哈希值 每个2 ^ 32(4,294,967,296)可能 添加盐直到找到匹配。 可能的输入总数 可以通过乘以得到 字典中的单词数量 可能的盐数量:
if H(password+salt)(in system)=H(Your password+salt) (login process)
login else
print<<error
答案 4 :(得分:1)
当您多次散列密码时,实际上会增加散列冲突的可能性,因此最佳做法是仅散列一次。
它与执行蛮力攻击的容易程度无关。这种攻击将系统地尝试给定范围内的每个可能的密码。因此,如果你的密码是“foobar”并且攻击测试密码“foobar”,那么你输入密码的次数和次数并不重要,因为暴力攻击成功地猜到了它。
因此,如果您希望防范暴力攻击,可以限制用户尝试授权或要求密码超过一定长度的频率。
旁注; Rainbow表和类似的方法被已经获得数据库访问权限的黑客使用,并且用于解密存储的密码。为了使这种攻击更加困难,你应该使用静态和动态盐。
答案 5 :(得分:-2)