密码安全性:数据库连接密码vs存储用户密码



在过去的几天里我读了很多关于密码安全的书。这些帖子通常有很长的评论线程,这使得很难确定一个明确的答案。

一般情况下,建议使用

  • 将数据库连接密码存储在根文档上方的单独配置文件中。

  • 这个文件不受版本控制,由文件系统权限保护。
  • 使用经过验证的安全散列算法对用户密码进行散列,其中每个密码的盐是唯一的。

我不想重提(双关语)以前已经问过和回答过的相同问题。所以我不想深入讨论如何保护密码的细节。

我想理解的是,如果以明文形式存储数据库连接密码是可以接受的,为什么有这么多关于如何使用户密码安全的讨论(和分歧)。

为什么存储在数据库中的密码比保存连接密码的配置文件更容易受到攻击?攻击者不需要访问我的系统才能从我的数据库中获取用户密码吗?

在我的情况下,我在CentOS上使用PHP/MySQL,但这个问题也可以适用于其他环境。

我想理解的是,如果以明文形式存储数据库连接密码是可以接受的,为什么有这么多关于如何使用户密码安全的讨论(和分歧)。

有这么多的分歧有三个原因。首先,讨论通常缺乏威胁模型。其次,人们对什么是威胁有不同的看法。第三,对于如何应对特定威胁,各方意见不一。由于威胁没有很好的定义,人们省略了一些威胁,并把他们的意见扔到其他威胁上。

OWASP的John Stevens整理了一个关于服务器密码安全和存储的好文档。它介绍了攻击和威胁,然后添加了消除威胁的步骤。以下是对OWASP材料的引用:

  • 密码存储备忘单
  • 安全密码存储威胁模型

所以我不想深入讨论如何保护密码的细节。

嗯,在你有了一个威胁模型之后,细节才是关键。


为什么存储在数据库中的密码比保存连接密码的配置文件更容易受到攻击?

这取决于很多事情。例如,如果管理员有权访问配置文件,然后离开公司怎么办?或者如果您将数据库备份发送到异地怎么办?这些威胁在你的威胁模型中吗?


攻击者不需要访问我的系统才能从我的数据库中获取用户密码吗?

你需要一个定义良好的威胁模型。

同样,退出公司的管理人员呢?他知道所有的密码。

或者离线备份呢?快递员和现场工作人员可以访问密码。

或者一封FISA信,要求交出所有用户名和密码。Lavabit关闭是因为政府要求所有的东西,而不是他们感兴趣的一个用户(爱德华·斯诺登)的密码和密钥。

这些威胁都不涉及远程攻击者试图闯入您的系统。


攻击者不需要访问我的系统才能从我的数据库中获取用户密码吗?

在所有条件相同的情况下,NO。坏人会试图对你的用户进行网络钓鱼,因为这是最简单的。


有关密码(不仅仅是存储)的更多信息,请参阅Peter Gutmann的《工程安全》。你知道使用密码复杂度策略是个坏主意吗?让密码在N天后过期是个坏主意?古特曼的书告诉你为什么,并引用了相关的安全研究。

考虑攻击者通常需要哪些漏洞来检索其中任何一个密码:

  • 用户密码存储在数据库中,通常通过SQL注入泄露。根据密码的存储方式,攻击者可能需要一些额外的步骤来检索密码。

  • 数据库密码通常存储在文件中,因此需要文件读取/包含或代码/命令执行来读取该文件。

但是访问数据库通常仅限于某些网络或机器,即web服务器。因此,攻击者至少需要在web服务器上执行代码/命令才能访问数据库。如果攻击者能够在web服务器上执行任意代码/命令,那么web服务器已经完全被破坏了。

保护用户密码多于保护数据库连接密码有以下几个原因:

  1. 用户密码可以用单向散列函数保护,而不可能以同样的方式保护连接密码,应用程序最终需要这个明文密码来打开数据库。用户密码应该受到保护,以防攻击者已经窃取了密码哈希。
  2. sql注入是获得用户密码哈希的一种简单方法,您不需要在服务器上拥有特权。要获得连接密码,您需要服务器特权,这要难得多。如果你感兴趣,我做了一个演示页面来展示它是多么容易。
  3. 泄露的用户密码也可以危及其他网站,因为人们在几个网站上重复使用相同的密码。
  4. 还有其他方法可以丢失用户密码哈希,丢弃备份,忽略服务器,…通常这些方式都不在你的控制之下(外部供应商,外部开发人员)。

最新更新