如何使用加密密码连接到PostgreSQL服务器

时间:2019-03-21 11:02:37

标签: java postgresql encryption

在通常情况下,连接字符串包含纯文本形式的密码,但是可以由Wireshark捕获,因此我想在连接字符串中使用加密的密码。我从Postgres文档中找到了以下摘录:

  

跨网络加密密码 MD5身份验证方法   将密码在客户端上进行两次加密,然后再发送给   服务器。它首先根据用户名对它进行MD5加密,然后   当服务器发送   数据库连接已建立。正是这种双重加密的价值   通过网络发送到服务器。不仅是双重加密   防止发现密码,但同时也防止另一个   使用相同的加密密码连接到   数据库服务器。

如果我理解正确,为了获得帮助,我需要连接到数据库,但这并不意味着可以伪造密码?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

现在建立连接的过程如下:

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

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

已为客户提供了secret作为密码。

首先,它使用上面的公式获取 real 密码(第一次哈希)。

然后,客户端再次使用

对密码进行哈希处理
'md5' || md5('0624d6c2e831004efb7f4173699a1775' || 'g73j')

服务器的客户端:哈希密码为md573ae1f550fb4bcd28411cefb24b800bc

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

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

密码本身未传输,因此不能被窃听者窃取。

服务器到客户端:好的,您在这里。

当然,实际消息看起来有所不同,但这全在the documentation中。