嗯,这个问题通常与This Question 重复。但是,要回答您的确切问题:
在这一点上,我认为只有 Rainbow Tables 才有可能。我错了吗?
从技术上讲,是的,你错了。只要有足够的处理能力,没有哈希函数是不可恢复的。关键是它需要多少处理能力,在大多数情况下,这远远超出你的想象。原因是可能值的数量在散列周期的每个阶段呈指数增长。对于 MD5,每个阶段(有 64 个)会将可能性的数量乘以 10^77(很多零)。因此,要成功反转 MD5,您必须尝试 真正 大量可能的排列(信封后计算显示大约 10^4932 次尝试)。使用当今创造的最快的超级计算机(大约 8 petaflops,或每秒 8x10^15 次浮点运算),您需要大约 10^4908 年来扭转它。顺便说一下,现在是宇宙年龄的 2.5x10^4898 倍。真的,这是一个超出我们人类理解能力的庞大数字......
这绝对是最好的情况。
所以技术上是可以逆转的。但实际上,不,不是。
如果 Rainbow Tables 是唯一的出路,那么有人如何反转用盐制成的哈希?
问题是没有人需要来扭转它。他们只需要找到一个碰撞。基本上,冲突是导致相同输出的两个输入。所以如果hash(a) = x 和hash(b) = x,a 和b 是相互冲突的。所以,我们需要做的就是找到一个冲突(不管你信不信,这比找到确切的输入更容易,因为从技术上讲,有无限数量的输入可以提供特定的输出)。输入密码的大小,通常碰撞的是原始密码。
找到这种冲突的最简单方法是使用预先计算的哈希列表(通常称为彩虹表)。基本上,您需要做的就是查找表中的哈希值,看看是否有原始值。如果是这样,你就完成了(就这么简单)。
盐通常用于对抗彩虹桌。这是因为如果用户输入1234 作为他们的密码,并且您使用abcdefghijklmnop 作为盐,那么原始值将是1234abcdefgjhijklmnop,它出现在彩虹表中的可能性要小得多。因此,添加强盐可以防止预计算彩虹表。
暴力破解
但是,如果您只执行hash(pass + salt),则存在重大问题。它不易受预先计算的彩虹表的影响,但易受暴力破解的影响。原因是加密散列函数(如 sha1、md5、sha256 等)被设计为快速。他们的传统角色是Signing,所以他们需要快速才能有用。但是,在密码存储中,这是弱点。使用现代 GPU,攻击者可以在几个小时内暴力破解(尝试所有可能的密码排列)一个简单的盐哈希(有关更多详细信息,请参阅我的 blog post)...
最好的预防
最好的预防有两个特点:
预先计算值表(彩虹表)并不容易
散列单个值并不快(不容易暴力破解)。
事实证明,有一种使用哈希函数的简单方法。简单地对其进行迭代并使输出依赖于大量的哈希函数:
var result = password + salt;
for (var i = 0; i < 10000000; i++) {
result = hash(result + salt);
}
关键在于,通过人为地减慢速度并使用盐,您可以使其抵抗预计算和暴力破解。
事实证明,有 2 种标准算法可以做到这一点(好吧,使用原理)。
最好的是 Blowfish 散列 (bcrypt),它并不真正使用散列原语函数,而是使用 Blowfish 密码的密钥派生循环。它可以通过crypt() 在 PHP 中使用。要使用它:
$hash = crypt($password, '$2a$07$' . $salt . '$');
并用
验证它
$hash == crypt($password, $hash);
另一种方法(不太受欢迎)是PBKDF2。用 PHP 编程:
function pbkdf2($hashFunc, $password, $salt, $iterations, $length = 32) {
$size = strlen(hash($hashFunc, '', true));
$len = ceil($length / $size);
$result = '';
for ($i = 1; $i <= $len; $i++) {
$tmp = hash_hmac($hashFunc, $salt . pack('N', $i), $password, true);
$res = $tmp;
for ($j = 1; $j < $iterations; $j++) {
$tmp = hash_hmac($hashFunc, $tmp, $password, true);
$res ^= $tmp;
}
$result .= $res;
}
return substr($result, 0, $length);
}
注意:
这些都不能保护用户免受非常弱密码的影响。如果他们输入字典单词或通用密码,攻击者仍有可能破解它。然而,它们将增加对中等强度密码的防御......
更多阅读: