为什么 PostgreSQL 默认将用户密码存储在 MD5 哈希中不是安全漏洞?

Why is it not a security hole that PostgreSQL by default stores user passwords in an MD5 hash?

为什么 PostgreSQL 默认将用户密码存储在 MD5 散列中不是安全漏洞?我正在研究 PostgreSQL 的内部结构并已进入系统目录 pg_authid,当我阅读有关 MD5 哈希加密的信息时,它似乎被认为是过时的。在我看来,如果管理员或用户能够访问底层文件存储,那么他们可以假设破解密码并执行任何所述凭据启用的操作。

我问为什么它不是安全漏洞,因为显然 PostgreSQL "Common Criteria Certified" 根据它的 wiki 说明它是西方国防组织的出处,它似乎是军事级安全的。

谢谢!

首先,PostgreSQL 10 adds SCRAM-SHA256 基于 SASL,使其成为一个有争议的问题。

对于旧版本:这是一个弱点,但由于多种原因它不是一个大的安全漏洞:

  • Internet 部署的 PostgreSQL 实例应使用 SSL,以防止窃听协议。这大大降低了成功窃取密码的机会。

  • 密码经过两次加盐处理。存储在磁盘上的密码用 salt 进行哈希处理,并采用 md5 摘要。但是在线路上发送的密码会被重新加盐并使用身份验证交换特定的盐重新散列,因此如果您在线上捕获散列密码,您不能在以后的身份验证中简单地重放它。

如果您设法通过窃听明文连接获得相同的两次加盐密码的几个副本,您可能会利用 MD5 中的弱点找到存储在磁盘上的一次加盐版本,并使用它来进行身份验证与数据库。

但这需要大量工作,而且使用 SSL 几乎可以完全阻止。

就我个人而言,我认为"Common Criteria"接近于一堆官僚废话。它仅适用于一个特定的安装,具有非常狭窄的、特定版本的所有内容,从硬件开始。它应该有助于排除总蛇油,但它肯定不能证明任何东西都是安全的。 (见鬼,看看政府系统……)