密码安全:数据库连接密码与存储用户密码的区别

3
最近几天我一直在阅读关于密码安全方面的文章,但这些文章中的评论通常很长,难以确定一个明确的答案。
总的来说,建议采取以下做法:
1.将数据库连接密码存储在文档根目录之上的一个单独的配置文件中。该文件不受版本控制,并受到文件系统权限的保护。
2.使用已证实的安全哈希算法对用户密码进行哈希处理,并使用对每个密码都唯一的盐进行处理。
我不想再次讨论已经被问过和回答过的那些问题,所以我不想详细讨论如何保护密码方面的具体内容。
我的疑问是:如果将数据库连接密码以明文形式存储是可以接受的,为什么对于如何使用户密码更加安全存在如此多的讨论和分歧呢?
为什么存储在数据库中的密码比保存连接密码的配置文件更容易受到攻击?难道攻击者不需要获取我的系统才能从我的数据库中获取用户密码吗?
在我的情况下,我正在使用PHP/MySQL运行在CentOS上,但这个问题也适用于其他环境。
3个回答

1
我试图理解的是,为什么在存储数据库连接密码时可以使用明文,但在保护用户密码方面却存在如此多的讨论和分歧。
有三个原因导致这种分歧。首先,讨论通常缺乏威胁模型。其次,对于什么是威胁存在不同的看法。第三,对于特定威胁应该采取什么措施也存在不同的看法。由于威胁没有得到很好的定义,人们会省略一些威胁并在其他方面表达自己的观点。
OWASP的John Stevens编写了一份关于服务器密码安全和存储的好文档。它详细介绍了攻击和威胁,并提供了中和威胁的步骤。以下是OWASP材料的参考链接:

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

好了,在你有了威胁模型之后,魔鬼就在于细节。


为什么存储在数据库中的密码比保存连接密码的配置文件更容易受到攻击?
这取决于很多因素。例如,如果管理员可以访问配置文件,然后离开公司会怎样?或者如果您将数据库备份发送到外部呢?这些是您威胁模型中的威胁吗?

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

您需要一个明确定义的威胁模型。

再比如,退出公司的管理员怎么办?他们可以访问所有密码。

或者说,备份离开现场了呢?快递员和现场工作人员都可以访问密码。

或者说,政府发布FISA信件要求交出所有用户名和密码。Lavabit关闭,因为政府要求提供全部信息,而不是他们所关心的一个用户(Edward Snowden)的密码和密钥。

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


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

一般情况下,不需要。坏人会尝试钓鱼你的用户,因为这是最容易的。


如果想进一步了解密码(不仅限于存储方面),请参阅彼得·古特曼的《工程安全》。你知道使用密码复杂度策略和在N天后让密码过期是个坏主意吗?古特曼的书可以告诉你为什么,并引用相关的安全研究。


0

考虑攻击者通常需要哪些漏洞才能检索出这两个密码:

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

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

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


你最后一段所说的正是我在问题中试图表达的。如果攻击者需要至少在Web服务器上执行代码/命令才能访问数据库,那么为什么数据库被认为比文件系统更容易受到攻击?你关于SQL注入的观点解释了其中的一个可能性。这是否意味着我应该始终假设代码本身存在不安全和容易受到SQL注入漏洞? - toxalot
@toxalot 不,数据库并不被认为更容易受到攻击。只是网络应用程序需要在数据库上进行身份验证。因此,它需要以明文形式提供密码。因此,您无法防止网络应用程序访问密码,否则将导致应用程序无法正常工作。 - Gumbo

0

有几个原因,为什么你想要比你的数据库连接密码更保护用户密码:

  1. 用户密码可以使用单向哈希函数进行保护,而无法以同样的方式保护连接密码,应用程序最终需要此密码明文才能打开数据库。
  2. 应该保护用户密码,以防攻击者已经窃取了密码哈希。
  3. SQL注入是一种轻松获取用户密码哈希的方法,您不需要在服务器上拥有特权。要获取连接密码,您需要服务器特权,这更难以获得。如果您感兴趣,我制作了一个演示页面,展示了它有多容易。
  4. 泄露的用户密码也可能危及其他网站,因为人们在多个网站上重复使用相同的密码。
  5. 有其他方式可以丢失用户密码哈希,例如备份被丢弃、服务器被忽视等。通常这些方式不在您的控制范围内(外部提供商、外部开发人员)。

第一点实际上并不完全正确;您可以轻松地生成一个随机的起始密码短语,然后使用PBKDF2/BCrypt/SCrypt生成具有高迭代次数/工作因子的哈希值,将输出转换为Base64或十六进制,然后将连接密码设置为该结果值。这并没有什么用处,但它确实需要连接级拦截或同时读取配置文件和代码,而不仅仅是配置文件。 - Anti-weakpasswords
@Anti-weakpasswords - 如果有人能够阅读配置文件,那么他很可能也能阅读代码,这两者都需要服务器特权。你可以让它变得更加困难,但最终必须发送明文密码。这就是为什么我说安全的单向哈希函数不能用于保护连接密码的原因。 - martinstoeckli
我同意,这就是为什么我说“它并没有做太多事情” - 它只是一个非常可悲的层,但它确实是一个层,除非添加HSM到加密密钥混合中或更改到某些操作系统级别的身份验证(Windows中的受信任身份验证),否则保护连接密码是相当困难的。 - Anti-weakpasswords

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接