存储和使用哈希片段

时间:2012-08-29 06:37:12

标签: security hash password-protection

我正在构建一个安全的loginmodule,我一直在阅读所有这些关于在散列等之前保存密码的指南。但是我觉得所有的密码仍然是“dehashable”,可以同时访问hash和salt。 / p>

所以我开始考虑如果我只是将一部分哈希存储在数据库中。在PHP中使用SHA-256进行散列时,我得到一个64字符串,如果我只是在数据库中保存了50个这样的字符串,并在登录时执行相同的50char比较。

Bruteforcing会给出一些额外的误报。但他们仍然需要尝试很多密码和真正的密码肯定不会消失。

我是否遗漏了我的想法,或者这实际上有用吗?

/ Andreas

2 个答案:

答案 0 :(得分:2)

没有值得称呼的哈希是可逆的。从SHA-256哈希的输出中丢弃14个字符会将其减少为SHA-228;这可能不是你想到的。如果你使用足够大的盐(64位或更多)并且它是正确随机的,那么你将足够安全,如果存储64个字符而不仅仅是50个字符,则更安全。

答案 1 :(得分:1)

  

我觉得所有的密码仍然是“dehashable”,可以同时访问hash和salt。

哈希不可逆转:这就是哈希的目的和本质。

攻击是,知道由于某些其他信息泄漏引起的哈希,你通过计算输入变量的所有可能值的哈希来强制解决问题,如果你遇到命中,那么很有可能您猜到的值是最初用于创建哈希值的值。

Salt减慢了这次攻击的速度,因为它必须为每个密码单独完成,而不是一次性预先计算,但现代硬件可以如此快速地计算哈希,因为它没有曾经做过的威慑价值

通过减少存储的哈希数据量,您当然可以降低蛮力猜测正确的可能性:例如,如果您只保留8位哈希值,则攻击者无法真正猜出原始密码,因为在每256个密码匹配。但是,必要的缺点是你自己使用那个哈希进行身份验证会大大削弱,允许每256个随机猜测中有1个进入。

使存储的哈希值不那么独特可猜测的好处与使主要身份验证接口更容易受到机会影响的成本成正比。离线可猜测哈希的情况仅在存在数据库泄露时发生,而不是像可猜测的身份验证接口那样的持续威胁,所以我们通常不会那么关心它。

在您的示例中,200位散列(50个十六进制数字)仍然可能为所有常见密码字符串赋予唯一值,因此几乎没有什么好处。

最终防止对泄漏的数据库进行离线猜测的问题是无法解决的,但我们目前最好的方法是使攻击者和真实身份验证服务器的哈希计算速度变慢。有关常见实现,请参阅bcrypt和PBKDF2。即便如此,这只会减慢大规模猜测离线攻击的时间,以便在发现数据泄露后让您有时间让用户更改密码。