如果您,用户arvind
,将密码设置为secret
, the actual密码设置为
'md5' || md5('secret' || 'arvind')
that is md50624d6c2e831004efb7f4173699a1775
。这就是您会在pg_authid
系统目录。
现在连接的建立是这样的:
客户端到服务器:我想连接数据库mydb
作为用户arvind
.
服务器到客户端:好的,我想要 MD5 认证。你的盐是g73j
.
已给客户secret
作为密码。
首先,它使用上面的公式来得到real密码(第一次哈希)。
然后,客户端使用第二次散列密码
'md5' || md5('0624d6c2e831004efb7f4173699a1775' || 'g73j')
客户端到服务器:哈希密码是md573ae1f550fb4bcd28411cefb24b800bc
.
服务器计算相同的哈希值并将结果与从客户端获得的结果进行比较。
如果相同,服务器就知道客户端必须拥有真实的密码,否则它无法计算出正确的哈希值。
密码本身不会被传输,因此窃听者无法窃取。
服务器到客户端:好的,你进来了。
当然,实际的消息看起来有所不同,但这就是全部文档 https://www.postgresql.org/docs/current/protocol-flow.html#id-1.10.5.7.3.