有很多关于盐和最佳实践的问题,但是其中大多数只是简单地回答了关于它们的非常具体的问题。我有几个问题相互补充。
假设数据库被破坏,每个用户加盐会阻止使用通用彩虹表来破解密码。必须为每个拥有唯一盐的用户生成一个单独的彩虹表,以获取他们的密码。这将是一个耗时的过程,而这正是使盐有效的原因。这对抵抗字典或蛮力攻击没有多大帮助。
这导致了一些问题:
- 尽管盐并不意味着通过默默无闻来保证安全,但将盐放在单独的表中不是更安全吗? 这样,即使“用户”表受到损害,盐也不会受到影响。
- 拥有第二个硬编码应用范围的盐会增加大量的安全性吗? 这样,即使数据库遭到破坏,实际应用程序也必须受到破坏,否则盐和散列将完全无用。
- 盐的最佳长度是多少?显然越长越好,但是随着用户数量的增加,数据库大小确实会成为一个问题,那么有效盐的最小长度是多少?
- 真的需要为“真正的随机盐”(random.org、random.irb.hr)使用第 3 方来源吗? 我知道使用基于服务器时间的盐在某种程度上是“可猜测的”,但是采用 sha1 随机字符串的随机子字符串似乎是一种有效的盐方法。
先感谢您。