最近我决定我想了解更多关于网络安全的知识,并且我已经到了一个我认为我非常了解如何安全存储密码的地步。我一直在使用随机盐和散列来存储密码,我对我的解决方案非常有信心。但是,我遇到了一篇让我很惊讶的文章。这是它的引述:
盐不会帮助你
需要注意的是,盐对于防止字典攻击或蛮力攻击是无用的。您可以使用大量盐或多种盐或手工收获的、阴凉种植的有机喜马拉雅粉红盐。考虑到数据库中的哈希和盐,它不会影响攻击者尝试候选密码的速度。
好吧,现在我很困惑……
在密码中添加盐仍然相关吗?
最近我决定我想了解更多关于网络安全的知识,并且我已经到了一个我认为我非常了解如何安全存储密码的地步。我一直在使用随机盐和散列来存储密码,我对我的解决方案非常有信心。但是,我遇到了一篇让我很惊讶的文章。这是它的引述:
盐不会帮助你
需要注意的是,盐对于防止字典攻击或蛮力攻击是无用的。您可以使用大量盐或多种盐或手工收获的、阴凉种植的有机喜马拉雅粉红盐。考虑到数据库中的哈希和盐,它不会影响攻击者尝试候选密码的速度。
好吧,现在我很困惑……
在密码中添加盐仍然相关吗?
是和不是。
Salt 可以保护您免受他人获取您的数据库并推断出实际密码,即使它们是经过哈希处理的。(如果有人窃取了您的整个数据库,很可能他们还获得了密码应该首先保护的用户数据,但我们假设密码比使用数据更有价值,因为很多人使用他们的密码在多个站点上,然后也会受到损害。)因此,散列和加盐都是标准做法,以最佳地保护您的用户。
但是,salt 并不能保护您免受选择“password123”作为密码的人的影响,并且攻击者只是尝试使用常用密码。没有什么可以保护您免受这种情况的影响 - 如果用户可以输入他们蹩脚的密码并获得访问权限,那么攻击者也可以(系统不知道谁在线路的另一端,这是密码的全部开始点)。
为了获得良好的安全性,提供者和用户都必须以最低限度的能力行事——两者之一是不够的。
盐不是用来防止这些的。盐可以防止使用彩虹表的攻击,彩虹表基本上是哈希列表及其密码。这是当攻击已经拥有您的密码哈希时。
除了彩虹表之外,salt 还可以防止有权访问您的数据库的人知道任何给定的用户对是否共享相同的密码。
盐无助于防止某人破解特定密码。它们有助于防止某人使用彩虹表一次破解多个密码。
假设您的站点上有以下用户(密码实际上不会存储在数据库中,只是散列版本)。
USER PASSWORD HASHED PASSWORD
========================================
hamfist god de898928393a893
bttltoad god de898928393a893
woob god de898928393a893
marco-fiset mypass1 1238ffff2342399
dean password2 a44ca77446ff449
如果有人要提前计算大量密码的哈希值并将其存储在内存中(彩虹表),那么他们检查de898928393a893
密码列表中是否存在将是微不足道的。然后他们会知道可以使用密码访问所有这些用户帐户,god
. 在很短的时间内,他们将可以使用彩虹表中存在的简单密码访问每个人的帐户(以及该人在网络上使用相同电子邮件/密码组合的任何其他地方)。
现在,如果你添加一个随机盐,每个使用相同密码的人都会得到不同的哈希值:
USER PASSWORD SALT HASHED PASSWORD
===============================================
hamfist god ae#o abf4388ff343401
bttltoad god cdo@ 29292d919100001
woob god !doe 3902dda99210099
marco-fiset mypass1 12uo aaffff121bcce13
dean password2 TEe9 b44ca7743324234
现在彩虹表并没有真正的帮助。例如god
,您需要预先计算god + <all_potential_salts>
. 有点限制您可以存储在内存中的内容。
但是,如果有人hamfist
特别想知道,他们有盐,因为它存储在数据库中,所以这根本不会减慢破解尝试的速度。