关于 salt 最佳实践已经有过几次精彩的讨论,似乎压倒性的建议是为每个密码生成不同的 salt,并将其与密码一起存储在数据库中。
但是,如果我正确理解了 salt 的用途,它是为了减少您受到彩虹表攻击的可能性。所以,我知道通过将它存储在数据库中,为每个用户更改它是最佳的,但是如果盐离数据库不远怎么办?如果我在代码中存储一个盐值(在 Web 服务器上将在已编译的 dll 中),那么如果攻击者以某种方式获得对数据库的访问权限,这难道不是同样的目的吗?在我看来,这会更安全。
盐的价值在于它对每个用户都是不同的。当您重新创建散列值以进行比较时,您还需要能够检索此非唯一值。
如果您为每个密码存储一个盐值,那么您首先会大大降低使用盐的价值。
盐的目的是要求每个密码重新生成彩虹表。如果您使用单一的盐,黑客/破解者只需重新生成彩虹表一次,并且他拥有您所有的密码。但是,如果您为每个用户生成一个随机的,他必须为每个用户生成一个。黑客部分要贵得多。这就是为什么您可以以纯文本形式存储盐的原因,只要有多个盐,黑客是否知道它并不重要。
默默无闻的安全性并不好,微软已经教会了我们这一点。
...直到攻击者获得对 DLL 的访问权限。
除了其他答案之外,还值得注意的是,攻击者可以像找出密码一样找出你的盐:给定一个已知的密码(他自己的),他可以对可能的盐进行暴力攻击。
我从盐中学到的教训是:分而治之(安全)