arv*_*wat 2 java encryption postgresql
在通常情况下,连接字符串包含纯文本的密码,但这可以被Wireshark捕获,所以我想在连接字符串中使用加密的密码。我从 Postgres 文档中找到了以下摘录:
跨网络加密密码MD5 身份验证方法在将密码发送到服务器之前在客户端对密码进行双重加密。它首先根据用户名对其进行 MD5 加密,然后根据建立数据库连接时服务器发送的随机盐对其进行加密。正是这个双重加密的值通过网络发送到服务器。双重加密不仅可以防止密码被发现,还可以防止其他连接稍后使用相同的加密密码连接到数据库服务器。
如果我理解正确的话,要获取盐,我需要连接到数据库,但这是否意味着密码可以被欺骗?
我尝试用谷歌搜索,但没有找到令人满意的解决方案。我想了解如何使用 java 从 PostgreSQL 服务器获取随机盐,然后用它加密纯密码并使用加密密码建立连接。
如果您,用户arvind,将密码设置为secret,则实际密码设置为
'md5' || md5('secret' || 'arvind')
Run Code Online (Sandbox Code Playgroud)
那是md50624d6c2e831004efb7f4173699a1775。这就是您将在pg_authid系统目录中找到的内容。
现在连接的建立是这样的:
客户端到服务器:我想mydb以 user 身份连接到数据库arvind。
服务器到客户端:好的,我想要 MD5 身份验证。你的盐是g73j。
已向客户端提供secret密码。
首先,它使用上面的公式来获取真实密码(第一次哈希)。
然后,客户端使用第二次散列密码
'md5' || md5('0624d6c2e831004efb7f4173699a1775' || 'g73j')
Run Code Online (Sandbox Code Playgroud)
客户端到服务器:散列密码是md573ae1f550fb4bcd28411cefb24b800bc。
服务器计算相同的哈希值并将结果与从客户端获得的结果进行比较。
如果相同,服务器就知道客户端必须拥有真实的密码,否则它无法计算出正确的哈希值。
密码本身不会被传输,因此窃听者无法窃取。
服务器到客户端:好的,你加入了。
当然,实际的消息看起来有所不同,但这都在文档中。
| 归档时间: |
|
| 查看次数: |
6462 次 |
| 最近记录: |