阅读本文后,我可以看到密码散列作为第二层防御的好处,以防入侵者访问密码数据库。我仍然不明白的是:
仅当系统弱到足以让入侵者访问密码数据库时,密码散列才重要吗?如果是这样,那么为什么如此强调建立安全密码数据库,而不是防止未经授权访问重要用户信息的安全系统?散列密码数据库为何经常被盗?
阅读本文后,我可以看到密码散列作为第二层防御的好处,以防入侵者访问密码数据库。我仍然不明白的是:
仅当系统弱到足以让入侵者访问密码数据库时,密码散列才重要吗?如果是这样,那么为什么如此强调建立安全密码数据库,而不是防止未经授权访问重要用户信息的安全系统?散列密码数据库为何经常被盗?
如果是这样,那么为什么如此强调建立安全密码数据库,而不是防止未经授权访问重要用户信息的安全系统?
因为这是一件非常困难的事情。无法保证您的系统 100% 防黑客攻击。事实上,如果你在 Reddit 上提出这样的声明,你的网站可能会在一小时内遭到入侵。
安全中有一个常用的术语,称为深度防御。受损的密码数据库不仅会影响您的应用程序。大多数人会为多个网站使用相同的用户名和密码组合。这使得入侵单个密码数据库的攻击者可以轻松访问用户使用的多个服务。这就是为什么您经常看到已被入侵的网站建议用户更改其所有帐户的密码。
即使您只认为您的应用程序很重要,如果攻击者拥有您用户的明文密码,他也可以做很多事情。攻击者很难在不被发现的情况下直接修改数据库值。但是,如果明文密码被泄露,他可以简单地登录用户帐户并进行更改。这是非常难以检测的。
经验告诉社区,实际上不可能将入侵者拒之门外。这是一个何时而不是是否有人可以访问您的密码数据库的问题。
不管你是一个随机的博客还是一个价值数十亿美元的政府部门,你都需要假设有一天有人会获得访问权。很多时候,他们将有足够的访问权限来读取数据库,但没有足够的访问权限,例如,插入一个中间人来获取明文密码,因为它们用于对某人进行身份验证。
例如,他们可能不会入侵您的主服务器,他们可能只会入侵包含数据库备份副本的服务器。
此外,大多数组织都有很多员工。员工无需入侵您的网络即可查看数据库,他们可能已经拥有不受限制的访问权限(尤其是如果他们是工程师或系统管理员)。让您的员工知道客户密码是一个坏主意的原因有很多。
即使您的网站完全没有价值,如果有人入侵它也没关系。用于登录您网站的用户名和密码通常与用于登录其他更重要服务的用户名和密码完全相同。
例如,有人可能会编写一个机器人,尝试使用数据库中的每个用户名/密码登录 Apple 的 iTunes 商店,如果成功,它就会开始通过商店购买东西。对于数据库中多达 10% 的用户,这种攻击可能会成功,而其中许多用户甚至不会注意到他们被收取了 4.99 美元的费用。这不是理论上的攻击,它每天整天都在发生,并且试图阻止它并不总是成功。
编辑:在评论中,@emory 提出了我忘记的另一点:有人可能会提交传票或使用其他一些法律程序来访问数据库,除非你有一个好的哈希值,否则他们可以看到明文密码。请注意,不仅执法部门可以这样做,任何对您有强烈法律诉讼的私人律师都可以访问您的数据库。
除了已经说明的原因之外,还有另一个原因:
密码应该是私密的!
以明文形式显示意味着您或您管理或开发的任何同事都可以访问所有密码,并且您可以冒充任何用户。现在你可能在想——我们永远不会那样做,那是错误的!
想想银行系统:数据库管理员都可以访问密码。这意味着他们可以简单地从任何地方登录您的帐户并提取资金。知道这一点,你会把钱存入这样的银行吗?更糟糕的是......许多人在多个位置使用相同的密码。他们现在可以登录银行帐户,并且在许多其他地方都有足够的信息。
请记住,许多攻击是内部工作 - 拥有特权信息的人。攻击者并非全部来自外部。
带有密码的数据库有很多方式最终落入不受欢迎的人手中。如果发生这种情况时密码没有安全地散列,则网站所有者将承担责任并遇到很多麻烦,因为用户通常也会在其他网站上重复使用他们的密码。我想给你一些关于数据库如何泄漏的例子: