我必须承认,对于大多数与Web应用程序相关的高科技安全问题,我并不了解,但至少有一件事情我认为可以直接询问并得到具体答案。
以这个网站为例:http://www.15seconds.com/issue/000217.htm
它在页面下方展示了他们将盐值存储在表中,我理解使用盐的原理和数学原理,但我想知道:
他们为什么不只是使用用户名作为盐值,而不是生成一个盐值?
我必须承认,对于大多数与Web应用程序相关的高科技安全问题,我并不了解,但至少有一件事情我认为可以直接询问并得到具体答案。
以这个网站为例:http://www.15seconds.com/issue/000217.htm
它在页面下方展示了他们将盐值存储在表中,我理解使用盐的原理和数学原理,但我想知道:
他们为什么不只是使用用户名作为盐值,而不是生成一个盐值?
盐的作用是要保持其独特性。盐的目的是为了防止攻击成本分摊,即攻击者尝试攻击两个经过哈希处理的密码所需成本小于攻击一个密码两倍的成本。
确保唯一性的一个解决方案是在足够宽广的空间中生成随机盐。因此,在两个不同的密码实例中获得相同的盐的概率足够小,以至于实际上不会发生。
用户名并不足够独一无二:
盐的熵实际上并不重要,除非在随机生成设置中确保其唯一性。
因为用户名称的熵比随机盐低,所以它们比正确的盐更少地分散了您的哈希值。
不过那个页面上的例子也并不是非常惊人。我总是生成一个GUID并使用它。
我怀疑这在现实生活中对于安全性来说都微不足道,即使很小的每个用户的盐也会对安全性产生很大的影响,而盐变得更加复杂时,改进非常微小。
Salt = CryptoHash( CryptoHash(SubmittedEmailOrUsername) . CryptoHash(SubmittedPasswd) ) ?
似乎这种方法有一个优点,即不需要存储盐,因为它可以动态计算,同时具有良好的熵(基于哈希而非明文),并提供与加密哈希相同长度的盐,例如128-512位?
其中一个问题是如果系统允许两个用户拥有相同的用户名和密码(但不会出现在电子邮件地址中),但这种方案还存在其他问题吗?