在像MD5这样的哈希上使用蛮力有什么大不了

问题描述 投票:9回答:6

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

其中讨论了哈希冲突。也许我在这里遗漏了一些东西,但是您不能仅使用MD5加密然后再使用SHA-1加密(或者其他任何加密)吗?这不会增加所需的处理能力吗?强行散列并减少冲突的可能性?

security hash cryptography md5 sha1
6个回答
3
投票

您正在谈论2个不同的(尽管相关)问题。首先是发生冲突的可能性,其次是对大量值运行算法以查找创建哈希的原始值的能力。

  1. Collisions。如果运行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位相同。但是,如果您真的想使暴力破解成为不可能,那么您要做的就是将输出大小增加一倍(可以将其与加密中的密钥大小进行比较)。

5
投票

首先,md5和sha1不是加密功能,它们是消息摘要功能。同样,在大多数情况下,使用John The RipperRainbow Crack之类的字典攻击也可以破解大多数哈希。

John Ripper最适合于攻击者知道salt值的salted密码。 Rainbow Crack适用于带有少量未知盐和md5($pass)之类的直哈希的密码。

Rainbow Crack需要花费很长时间来构建表,但是在那之后密码会在几秒钟内破解。这取决于磁盘驱动器的速度。


2
投票

碰撞攻击(例如,针对MD5的已知攻击类型)并没有真正的好处。要有效地使用密码,您需要进行预映像攻击(即能够找到一些将散列为已知散列码的输入的功能)。尽管有针对MD5的原像攻击,但目前尚不实用。

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


2
投票

首先未加密,使用哈希函数创建Message Digest。

您的问题:

但是您不能只加密(hash)您的使用MD5密码,然后例如,SHA-1(或其他任何问题。]

如果哈希函数不提供任何这些属性,则不管您哈希多少次,攻击者也可以哈希n次以获得冲突。

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

  2. 对于任何给定的块x,找到y≠x在计算上是不可行的其中H(y)= H(x)。被称为第二原像抗性或耐弱碰撞

  3. 在计算上找不到任何梨(x,y)使得H(x)= H(y)。这叫做强耐碰撞。

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

假设攻击者拥有密码的哈希值,然后开始从字典文件中读取并比较匹配的哈希值,然后破解了密码,如果使用了salt,则从字典中读取并添加了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

1
投票

当您多次哈希密码时,实际上会增加哈希冲突的机会,因此最佳实践是仅哈希一次。


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.