其他的答案似乎并没有解决你对这个话题的误解,下面是这样说的:
盐的两种不同用途
我已经看过许多教程,建议将盐用作以下内容:
$hash = md5($salt.$password)
[...]
我看到的另一个用途是在我的Linux系统上。在/etc/阴影中,散列密码实际上是用SALT存储的。
你,你们总必须使用密码存储SALT,因为为了验证用户根据密码数据库输入的内容,必须将输入与SALT结合起来,对其进行散列,并将其与存储的哈希进行比较。
散列的安全性
现在,有彩虹表的人可以倒转哈希,并得到输入“foobar”。
[...]
因为te5SBM.7C25fFDu6bIRbX的反向散列已知包含“foo”。
这是不可能扭转哈希本身(至少在理论上)。“foo”的散列和“saltfoo”的散列有没什么共同之处。即使在加密哈希函数的输入中更改一位,也应该完全改变输出。
这意味着您不能用普通密码构建彩虹表,然后再用一些SALT“更新”它。你必须从一开始就把盐考虑进去。
这就是为什么你首先需要一张彩虹桌的全部原因。因为您无法从散列中获得密码,所以预先计算最可能使用的密码的所有散列,然后将您的散列与它们的散列进行比较。
盐质
但是说$salt=foo
“foo”将是极盐的选择很差。通常,您会使用一个随机值,编码在ASCII中。
另外,每个密码都有自己的SALT,与系统上的所有其他盐类不同(希望如此)。这意味着攻击者必须单独攻击每个密码,而不是希望一哈希值与数据库中的一个值匹配。
袭击
如果黑客能拿到这份文件,我看不出盐有什么用,
彩虹桌攻击总需要/etc/passwd
(或使用任何密码数据库),否则如何将彩虹表中的散列与实际密码的散列进行比较?
至于目的:假设攻击者想要为10万个常用的英语单词和典型密码(想想“秘密”)构建一个彩虹表。如果没有盐,她将不得不预先计算100,000个散列。即使传统的UNIX盐只有2个字符(每个字符都是64个字符中的一个):[a–zA–Z0–9./]
)她必须计算和存储4096,000,000散列.有了很大的进步。