好的,我正在尝试了解使用盐的原因。
当用户注册时,我会为他/她生成一个唯一的盐,并将其存储在数据库中。然后我用 SHA1 对它和密码进行哈希处理。当他/她登录时,我用sha1($salt.$password)
.
但是如果有人破解了我的数据库,他可以看到散列密码和盐。
这比不加盐对密码进行哈希处理更难破解吗?我不明白……</p>
对不起,如果我是愚蠢的......</p>
好的,我正在尝试了解使用盐的原因。
当用户注册时,我会为他/她生成一个唯一的盐,并将其存储在数据库中。然后我用 SHA1 对它和密码进行哈希处理。当他/她登录时,我用sha1($salt.$password)
.
但是如果有人破解了我的数据库,他可以看到散列密码和盐。
这比不加盐对密码进行哈希处理更难破解吗?我不明白……</p>
对不起,如果我是愚蠢的......</p>
如果您不使用盐,那么攻击者甚至可以在他们侵入您的服务器之前离线预先计算密码<->哈希数据库。添加盐会大大增加该数据库的大小,从而使执行此类攻击变得更加困难。
此外,一旦他们闯入,他们可以猜测一个常用密码,对其进行哈希处理,然后检查数据库中的所有密码是否匹配。每个用户使用不同的盐,他们一次只能攻击一个密码。
维基百科上有一篇关于密码学中的盐的文章。
使用盐的另一个目的是确保使用相同密码的两个用户最终不会在用户表中具有相同的散列(假设他们的盐不一样)。但是,盐和密码的组合最终可能会导致相同的“字符串”或哈希,并且哈希将完全相同,因此请确保使用盐和密码的组合,而两种不同的组合不会导致相同的哈希。
如果攻击者为明文密码创建了一个巨大的哈希值表,使用盐可以防止他使用同一个表来破解多个密码。攻击者必须为每个盐生成一个单独的表。请注意,要使其真正正常工作,您的盐应该相当长。否则攻击者的预计算表很可能包含盐+密码哈希。