在通常情况下,连接字符串包含纯文本形式的密码,但是可以由Wireshark捕获,因此我想在连接字符串中使用加密的密码。我从Postgres文档中找到了以下摘录:
跨网络加密密码 MD5身份验证方法 将密码在客户端上进行两次加密,然后再发送给 服务器。它首先根据用户名对它进行MD5加密,然后 当服务器发送 数据库连接已建立。正是这种双重加密的价值 通过网络发送到服务器。不仅是双重加密 防止发现密码,但同时也防止另一个 使用相同的加密密码连接到 数据库服务器。
如果我理解正确,为了获得帮助,我需要连接到数据库,但这并不意味着可以伪造密码?
我尝试四处搜寻,但没有找到令人满意的解决方案。我想了解如何使用java从PostgreSQL服务器中获取随机盐,然后使用它加密普通密码并使用加密密码建立连接。
答案 0 :(得分:1)
如果您(用户arvind
,将密码设置为secret
,则实际密码将设置为
'md5' || md5('secret' || 'arvind')
即md50624d6c2e831004efb7f4173699a1775
。这就是您在pg_authid
系统目录中找到的内容。
现在建立连接的过程如下:
服务器的客户端:我想以用户mydb
的身份连接到数据库arvind
。
服务器到客户端:好的,我想要MD5身份验证。你的食盐是g73j
。
已为客户提供了secret
作为密码。
首先,它使用上面的公式获取 real 密码(第一次哈希)。
然后,客户端再次使用
对密码进行哈希处理'md5' || md5('0624d6c2e831004efb7f4173699a1775' || 'g73j')
服务器的客户端:哈希密码为md573ae1f550fb4bcd28411cefb24b800bc
。
服务器计算相同的哈希并将结果与从客户端获得的哈希进行比较。
如果相同,则服务器知道客户端必须具有真实密码,否则它将无法计算出正确的哈希值。
密码本身未传输,因此不能被窃听者窃取。
服务器到客户端:好的,您在这里。
当然,实际消息看起来有所不同,但这全在the documentation中。