2013-10-02 49 views
4

假设我们不使用password_hash,而是使用crypt()而不是sha512来代替散列密码。我们需要向密码添加salt,因此攻击者不能使用彩虹表攻击。为什么盐必须是良好和很多随机答案中所述的很多答案?即使盐相差一点或者不是很随意,它仍然会给别人一个完全不同的散列。因此,攻击者不会知道谁使用相同的密码,他仍然无法创建一个彩虹表。为什么要吃好盐?

+0

好盐和随机盐应该是不可能“猜测”盐的。 – Rufinus

+1

“好”我假设你的意思是“随机”,在这种情况下,你应该阅读[这个答案](http://stackoverflow.com/a/1645190/139010),特别是“所以,为什么盐必须是随机?” –

+2

@Rufinus如果他得到密码,他会得到盐。 –

回答

2

计算和储存强盐需要很少的努力,但降低了彩虹表预先计算的盐的天然小的机会。

如果盐是3位数字,攻击者可能会为所有可能的盐组合预先计算彩虹表是可行的。如果salt是一个随机的24个字符的字母数字字符串,那么攻击者可以预先计算所有可能的盐的几率几乎为零。

2

盐应该是独特的,必须足够长,并且应该是不可预测的。随机性不是必需的,但它是计算机满足这些要求的最简单方法。盐不是秘密的目的,即使知道盐也会达到它的目的。

唯一性意味着它不仅在数据库中是唯一的(否则您可以使用用户标识),它应该是全球唯一的。有人可以为例如例如1-1000,并能够检索具有这些用户标识的所有帐户的密码(通常管理帐户的用户标识低)。

足够长:如果盐太短(可能的组合太少),再次建立彩虹桌会变得有利可图。盐和密码一起可以被看作只是一个更长的密码,如果你可以为这个更长的密码建立一个彩虹表,你也可以得到较短的原始密码。对于非常强大和长时间的密码,腌制实际上根本不是必需的,但大多数人为生成的密码可能是蛮横的,因为它们很短(人们必须记住它们)。

也使用从其他参数衍生的盐可以归入此类别。仅仅是因为你从用户ID计算散列,这不会增加可能的组合。

不可预测性是有点不那么重要,但试想一次您使用的用户ID为盐的情况下,攻击者可以找出未来几年用户ID是什么,因此可以预先计算rainbow-的窄数表。根据所使用的散列算法,这可以适用或不适用。他有时间优势,可以立即取回密码。如果管理员帐户使用可预测的盐,则会出现更多问题。

因此,使用真正的随机数,从OS随机源(dev/urandom)生成,是最好的,你可以做的。即使你忽略了上面的所有原因,为什么当有更好的方法时使用衍生盐,为什么不使用你知道的最好方法?