这些答案中的大多数都有点误导,并证明了盐和加密密钥之间的混淆。包含盐的目的是修改用于散列每个用户密码的函数,以便必须单独攻击每个存储的密码散列。唯一的安全要求是它们对每个用户都是唯一的,它们不可预测或难以猜测没有任何好处。
盐只需要足够长,以便每个用户的盐都是唯一的。即使有 10 亿注册用户,随机 64 位盐也不太可能重复,所以这应该没问题。单独重复的盐是一个相对较小的安全问题,它允许攻击者一次搜索两个帐户,但总的来说不会加快整个数据库的搜索速度。即使是 32 位的 salt 对于大多数用途来说也是可以接受的,在最坏的情况下,它会使攻击者的搜索速度提高约 58%。将盐增加到 64 位以上的成本并不高,但没有安全理由这样做。
在每个用户的 salt 之上使用站点范围的 salt 也有一些好处,这将防止可能与存储在其他站点的密码哈希发生冲突,并防止使用通用彩虹表,尽管即使是 32 位盐足以使彩虹表成为不切实际的攻击。
甚至更简单——开发人员总是忽略这一点——如果你有唯一的用户 ID 或登录名,它们就像盐一样完美。如果你这样做,你应该添加一个站点范围的盐,以确保你不会与另一个系统的用户重叠,他们有同样的好主意。