我将用于scrypt
在我的应用程序中存储密码。因此,我将使用 SHA-256 和 Salsa20 加密原语(使用 PBKDF2)。
考虑到这一点,我应该使用多大的盐?它应该等于 SHA-256 输出的大小:256 位还是应该等于我将从这个密码拉伸函数中获取的位数:512 位?
考虑到 OpenLDAP 使用的 SSHA 只有 32 位盐,而 Linux crypt() 使用 48 位盐,我的盐看起来相当大......
一般来说:盐大小的经验法则是什么?
有关的:
我将用于scrypt
在我的应用程序中存储密码。因此,我将使用 SHA-256 和 Salsa20 加密原语(使用 PBKDF2)。
考虑到这一点,我应该使用多大的盐?它应该等于 SHA-256 输出的大小:256 位还是应该等于我将从这个密码拉伸函数中获取的位数:512 位?
考虑到 OpenLDAP 使用的 SSHA 只有 32 位盐,而 Linux crypt() 使用 48 位盐,我的盐看起来相当大......
一般来说:盐大小的经验法则是什么?
有关的:
盐必须是唯一的;这是他们唯一的工作。您应该尽可能地努力从不重复使用盐值;偶尔的重用很少是关键的,但仍应避免)。通过合理设计的密码方案,盐除了唯一性之外没有其他有用的属性;只要您不复制完全相同的位序列,您就可以随意选择它们。必须在全球范围内理解独特性。
(对于设计不良的密码散列方案,salt 可能具有一些必需的附加属性,但如果您使用设计不良的密码方案,您已经遇到了更大的问题。请注意,salt 与对称加密的初始化向量并不完全相同,其中诸如不可预测的均匀随机性之类的严格要求通常适用。)
拥有或多或少唯一盐值的一种常见方法/dev/urandom
是随机生成它们,使用一个好的生成器(例如,一个适合加密使用的生成器,例如)。如果盐足够长,冲突的风险(即重复使用盐值)就很低。如果您使用n位盐,一旦您达到大约2 n/2 个生成值,碰撞的机会就变得不可忽略。这个星球上大约有 70 亿人,可以假设他们平均每个人拥有的密码少于 1000 个,因此全球散列密码的数量一定低于2 42.7. 因此,86 位盐应该足够了。由于我们有点喜欢所谓的“安全边际”,而且,由于程序员只喜欢 2 的幂,所以让我们使用128 位。根据上面的分析,这足以以足够高的概率确保全球唯一性,而我们对盐的要求不亚于唯一性。
唯一性也可以通过其他方式来确保,例如使用服务器名称的连接作为盐(全球 DNS 系统已经确保每个人都可以获得自己的服务器名称,与地球上任何其他人不同)和服务器范围的柜台。这引发了一些实际问题,例如保持一个不重复的计数器值,即使在不合时宜的服务器崩溃和重新启动的情况下,和/或几个具有负载平衡的前端。随机固定长度的盐更容易。
“它应该至少有八个八位字节(64 位)长。” 来自:http : //www.ietf.org/rfc/rfc2898.txt