好吧,从讨论散列方法的弱点来看,我认为唯一一个好的暴力破解力是很有效的。
所以,问题是:
是否存在比其他算法更强硬的哈希算法?
如果是散列密码。
答案 0 :(得分:15)
唯一可以防止蛮力的事实是,执行蛮力需要非常长的时间。
蛮力通过简单地浏览每个可能的输入字符串并一次尝试一次来完成。没有办法防止只是尝试所有可能的组合。
答案 1 :(得分:2)
所有加密系统都容易受到暴力攻击。另一个术语是“琐碎的攻击”。
散列的一个简单解释是我们使用的所有散列算法都接受无限大小的输入并具有固定大小的输出。这是一个不可避免的碰撞,对于像sha256这样的东西,它需要2 ^ 256次操作才能自然地找到一个。 md5()有一个快捷方式,可以找到碰撞的第2~39次操作。
你可以做的一件事就是隐藏你的密码。 密码哈希在检索到盐之前不能被破坏。 John The Ripper可以获得一个字典,一个Salt和一个密码来恢复任何类型的密码哈希值。在这种情况下,sha256()和md5()将在大约相同的时间内中断。如果攻击者没有盐,他将不得不进行更多的猜测。如果你的salt与sha256(32字节)的大小相同,则需要(dictionary size)*2^256
猜测才能破解一个密码。盐的这种性质是CWE-760的基础。
答案 2 :(得分:0)
答案 3 :(得分:0)
正如Codeka所说,没有散列算法可以100%抵御暴力攻击。但是,即使使用硬件辅助密码破解(使用GPU来尝试密码),破解足够长的密码所需的时间也是天文数字。如果您的密码为8个字符,则可能容易受到暴力攻击。但是如果你再添加一些字符,那么破解所需的时间会急剧增加。
当然,这并不意味着你可以免受彩虹攻击。解决方法是在密码中添加一个盐,并使用不易受前映像攻击影响的散列算法。
如果您使用12-14个字符的盐渍密码,最好使用sha2算法(或等效的)进行哈希处理,您的密码非常安全。
答案 4 :(得分:0)
如果您知道输入空间足够小以使暴力攻击可行,那么有两种方法可以防止暴力攻击:
这就是答案:哈希算法计算得越慢,它就越不容易受到暴力迫使输入空间的影响
(原始答案如下)
输出格式中的任何其他位使得算法的强度是直接暴力攻击的两倍。
但是考虑一下,如果你有一万亿台计算机可以每秒尝试一万亿次哈希值,那么你仍需要超过100万亿年来强制使用一个128位哈希值,你会发现这是一个直截了当的暴力 - 对输出的强制攻击根本就不值得浪费。
当然,如果散列的输入的熵小于128位,那么你可以强制输入 - 这就是为什么通常可以强制密码破解(没有人可以实际上记住了128位熵的密码。
答案 5 :(得分:0)
现在,从暴力攻击的角度来看,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羽鸽子必然会发生碰撞,因为所有的洞都已经满了。
但它实际上并不是那么好,因为另一个名为 Birthday Paradox 的数字属性,在给出一些独立选择的情况下,你会发现复制的速度比它需要的要快得多。填写所有"漏洞"。
答案 6 :(得分:0)
这个问题已有十年之久,现在我已经有了答案。
是的,有防暴力破解算法。这种算法的关键是 slow 。如果在几毫秒内验证正确性,则不会有任何危害。但这会大大降低蛮力。而且,这些算法可以适应未来CPU性能的提高。这类算法包括
特别是在PHP中,必须使用password_hash()函数来散列密码