【问题标题】:How to connect to PostgreSQL server using encrypted password如何使用加密密码连接到 PostgreSQL 服务器
【发布时间】:2019-03-21 19:51:56
【问题描述】:

在通常情况下,连接字符串包含明文密码,但这可以被 Wireshark 捕获,所以我想在连接字符串中使用加密密码。我从 Postgres 文档中找到了以下摘录:

通过网络加密密码 MD5 身份验证方法 在将密码发送到客户端之前,对客户端上的密码进行双重加密 服务器。它首先根据用户名对其进行 MD5 加密,然后 根据服务器发送的随机盐对其进行加密,当 建立了数据库连接。正是这个双重加密的值 通过网络发送到服务器。不仅双重加密 防止密码被发现,但它也防止另一个 使用相同的加密密码连接到 数据库服务器。

如果我理解正确的话,为了得到盐,我需要连接数据库,但这是否意味着密码可以被欺骗?

我尝试谷歌搜索,但没有找到令人满意的解决方案。我想了解如何使用 java 从 PostgreSQL 服务器获取随机盐,然后用它加密纯密码并使用加密密码建立连接。

【问题讨论】:

  • 您连接到服务器,在发送任何登录信息之前服务器会向您发送盐,然后您使用散列密码登录。您使用的客户端库应该处理这个问题,而不是您。
  • @SamiKuhmonen 您的意思是 postgresql 驱动程序本身就支持这一点。除了调用通常的 getConnection 之外,我不需要做任何其他更改?

标签: java postgresql encryption


【解决方案1】:

如果您,用户arvind,将密码设置为secret,则实际密码设置为

'md5' || md5('secret' || 'arvind')

那是md50624d6c2e831004efb7f4173699a1775。这就是您可以在pg_authid 系统目录中找到的内容。

现在连接的建立是这样的:

客户端到服务器:我想以用户arvind 的身份连接到数据库mydb

服务器到客户端:好的,我想要 MD5 身份验证。你的盐是g73j

客户端已获得secret 作为密码。

首先,它使用上面的公式获取真实密码(第一次散列)。

然后,客户端使用第二次散列密码

'md5' || md5('0624d6c2e831004efb7f4173699a1775' || 'g73j')

客户端到服务器:哈希密码是md573ae1f550fb4bcd28411cefb24b800bc

服务器计算相同的哈希并将结果与​​从客户端获得的结果进行比较。

如果相同,则服务器知道客户端必须拥有真实密码,否则无法计算出正确的哈希值。

密码本身不会被转移,因此不会被窃听者窃取。

服务器到客户端:好的,你进去了。

当然,实际的消息看起来不同,但这都在the documentation 中。

【讨论】:

  • 在服务器端启用 MD5 身份验证需要任何配置,还是默认行为?如果我理解正确的话,这是在幕后发生的,对吧?
  • 您需要在pg_hba.conf 中指定md5 才能使身份验证像这样工作。如果您使用客户端库,该库将为您执行此操作。如果您想通过网络直接与服务器对话,则必须自己实现。
  • 所有的 postgresql 版本都支持双 MD5 哈希密码吗?根据我的研究,postgresql 9.4 或更高版本都支持这个。
  • 自古以来的每个版本都支持这一点。
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多