好吧,从对散列方法弱点的讨论中,我知道唯一好的暴力破解是有效的。
所以,问题是:
是否有一种哈希算法比其他算法更严格地抵抗暴力破解?
在散列密码的情况下。
好吧,从对散列方法弱点的讨论中,我知道唯一好的暴力破解是有效的。
所以,问题是:
是否有一种哈希算法比其他算法更严格地抵抗暴力破解?
在散列密码的情况下。
对蛮力的唯一保护是执行蛮力需要非常长的时间。
蛮力的工作原理是简单地遍历每个可能的输入字符串并尝试一次,一次一个。没有办法防止简单地尝试所有可能的组合。
这个问题已有十年之久,现在我得到了答案。
是的,有暴力证明算法。这种算法的关键是缓慢。如果正确性将在几毫秒内得到验证,则不会有任何害处。但这将大大减慢蛮力。而且,这些算法可以适应未来 CPU 的性能提升。此类算法包括
特别是在 PHP 中,password_hash()函数必须用于散列密码
如果您知道输入空间小到足以使蛮力攻击可行,那么有两种选择可以防止蛮力攻击:
所以这就是答案:哈希算法的计算速度越慢,它就越不容易受到暴力破解输入空间的影响
(原答案如下)
输出格式中的任何额外位都会使算法对简单的蛮力攻击的强度提高一倍。
但是考虑一下,如果你有一万亿台计算机,每台计算机可以每秒尝试一万亿次哈希,你仍然需要超过 100 万亿年的时间来暴力破解一个 128 位哈希,你会意识到一个简单的暴力破解攻击输出根本不值得浪费任何精力。
当然,如果哈希输入的熵小于 128 位,那么您可以暴力破解输入 - 这就是暴力破解密码通常可行的原因(实际上没有人能记住 128 位熵的密码) .
正如 Codeka 所说,没有哈希算法可以 100% 安全地抵御暴力攻击。然而,即使使用硬件辅助密码破解(使用 GPU 尝试密码),破解足够长的密码所需的时间也是天文数字。如果您有 8 个字符的密码,您可能容易受到暴力攻击。但是,如果您添加更多字符,则破解所需的时间会大大增加。
当然,这并不意味着您可以免受彩虹攻击。解决方案是在密码中添加盐,并使用不易受到原像攻击的散列算法。
如果您使用 12-14 个字符的加盐密码,最好使用 sha2 算法(或等效算法)进行散列,那么您将获得一个非常安全的密码。
在此处阅读更多信息:http: //www.codinghorror.com/blog/2007/10/hardware-assisted-brute-force-attacks-still-for-dummies.html
所有密码系统都容易受到暴力破解。另一个术语是“微不足道的攻击”。
对散列的简单解释是,我们使用的所有散列算法都接受无限大小的输入并具有固定大小的输出。这是不可避免的碰撞,对于 sha256 之类的东西,需要 2^256 次操作才能自然地找到一个。md5() 有一个快捷方式,使其成为第 2 ^ 39 次查找碰撞的操作。
你可以做的一件事是让你的密码更强大,那就是隐藏你的盐。 在检索到它的盐之前,不能破坏密码哈希。 可以给John The Ripper一个字典、一个盐和一个密码来恢复任何类型的密码哈希。在这种情况下 sha256() 和 md5() 将在大约相同的时间内中断。如果攻击者没有盐,他将不得不做出更多的猜测。如果您的 salt 与 sha256(32 字节)大小相同,则需要(dictionary size)*2^256
猜测才能破解一个密码。盐的这种特性是CWE-760的基础。
蛮力是最糟糕的攻击,没有什么可以证明蛮力...
现在,从暴力攻击的角度来看,大约 80-90 位被认为是加密安全的,所以如果防碰撞哈希函数是完美的,你只需要 10 个字节,但它们不是,所以你只需做更多的位......
鸽子洞原理证明没有什么可以是蛮力证明。
由于散列函数H
允许任意大小的输入并在输入大小超过输出大小时[0,1]^n
输出恒定输出: ,所以必然有一些输出可以由多个输入产生。[0,1]^k
n>k
您可以将一个正方形分成 9 个子正方形来形象化。
0 | 0 | 0
0 | 0 | 0
0 | 0 | 0
这些是你的 9 个洞。我们是蛮力攻击者,我们有无限的攻击机会......我们有无限的鸽子......但我们最多需要 10 只才能找到碰撞......
在 4 pidgeons 和良好的抗碰撞哈希算法之后:
P | 0 | 0
0 | P | P
0 | 0 | P
在 9 个 pidgeons 之后:
P | P | P
P | P | P
P | P | P
所以我们的第 10 羽鸽子必然会发生碰撞,因为所有的洞都已满。
但它实际上甚至不是那么好,因为另一个称为生日悖论的数字属性在给定许多独立选择的情况下,你会发现一个副本比填充所有“洞”要快得多。