2012-07-04 255 views
0

为什么为每个密码存储使用不同盐份的密码更安全? 由于密码在盐渍后被散列,我没有理由使用不同的盐。盐渍密码安全

用已知盐或其他东西暴力密码更容易吗?或者一旦他们知道了盐,黑客就会自己制作彩虹桌吗?

亲切的问候

+1

[Secure hash和salt for PHP passwords]可能重复(http:// stackoverflow。com/questions/401656/secure-hash-and-salt-for-php-passwords) –

+0

@JohnConde它并不是真的重复。这个问题是关于每个密码有不同的盐的优点。 – Styxxy

+1

它最近成为一个热门话题,但普遍的共识是,腌制密码和使用密码散列是**不够**。调查使用密钥派生函数。 – Leigh

回答

2

如果您只使用一种盐,黑客只需重建其彩虹表一次,就可以将它们用于整个数据库。重复的密码也会更容易找到。

使用单独的哈希和昂贵的算法(bcrypt,scrypt)。

3

当你给每个密码自己独立的盐存在于每个密码每盐之间没有共同的纽带。所以即使“黑客”破解了一个密码,他也不会为任何其他密码加盐。

当涉及到使用PHP和窜改密码时,应该使用慢加密,如crypt。你加密的东西越快,“黑客”就能越快地找到一种解密方法。

您可以简单地根据用户的用户名,电子邮件或几件事的组合创建一个新盐的函数。

+0

答复你的第一段:即使他知道盐,他仍然必须去掉密码,这是'不可能的',因为散列是不可逆的? –

+0

他可以使用随机salt +密码蛮力,使用你使用的加密方法。这就是为什么Creshal和我都建议使用慢加密方法。 –

+0

@TomBroucke当只有一个散列时,Brute强制会快几个数量级。你“只”必须用盐计算每个散列一次。对于每个用户使用单独的盐分,您必须为每个用户重复整个过程。我想不出一个更简单的方法来增加复杂性。 – Creshal

1

好的,让我们来看一件事:盐渍与彩虹桌无关。是。再说一次。盐腌与彩虹桌无关。

那么,这并不完全正确。盐被用来防止时间和内存的折衷,通过摊销攻击一个散列的代价与其他散列的代价进行摊分。

在彩虹表的情况下,使用盐意味着整个表无效。

但还有其他方法可以使整个表无效。您可以将一个静态字符串附加到每个密码(这是而不是盐)。这将击败彩虹表...

真正的敌人

这里真正的敌人不是彩虹表。真正的敌人是蛮力。现代机器在强力驱动下运行速度非常快,构建庞大的GPU集群和执行先进的暴力破解比存储足够多的彩虹表以使其值得慢速访问磁盘更便宜。

盐有助于击败bruteforce,因为它是独一无二的。不是每个密码。不是每个用户,而是宇宙中唯一(至少统计)。这就是为什么你想使用随机数字,而不是用户名,电子邮件或任何可预测的。

同样,不是因为我们不想要可预测性。但是因为我们想要统计独特性。如果攻击者攻击两个使用用户名作为盐的网站,他可以同时对这两个哈希进行分解(即使这两个哈希都可能使用不同的密码)。

盐应该是随机的,并且每个用户。