此外(更重要的是),用户经常使用相同的密码。如果没有为每个用户分配单独的 salt,则一旦破解了一个用户的密码,您就已经破解了所有其他使用相同密码的用户的密码。
hash(hash(password))
。function hashPassword(password, salt) {
result = hash(salt . password)
for (i = 0; i < 1000; i++) {
result = hash(salt . result)
}
return result
}
迭代哈希和使用盐都可以提高密码哈希的安全性。但它们保护不同类型的攻击。
迭代哈希可以增加暴力破解所需的工作量。但你不应该像你建议的那样使用天真的迭代,而是使用专为此设计的算法,例如PBKDF2
盐可以防止预先计算的表格攻击,因此每个网站和用户都应该使用不同的盐。
任何人都可以为双重哈希密码构建彩虹表,没有任何障碍。
我使用了一种可比较的方法对登录用户的密码进行哈希。在会话中生成一个盐(随机值)并发送给客户端。用户输入他们的密码,密码再与盐一起进行哈希,并将结果返回。这样确保从服务器发送的值每次都不同,使得利用中间人攻击更加困难。
盐是一个站点或用户特定的值。 这意味着为了检索密码,攻击者必须同时访问数据库并知道盐。
此外,攻击者可以额外生成一张表,然后对多个站点使用它。但是,使用盐,攻击者必须为每个站点甚至每个用户生成一张表(使攻击变慢)。
站点特定的盐对网站的安全几乎没有什么帮助。正如评论中所说,使用站点特定和用户特定的盐的组合可以显著提高安全性,而不仅仅是站点特定的盐。
几年前,我在stackoverflow上问了一个有关密码存储的问题,这可能对您有所帮助。请参见PHP密码的安全哈希和盐。