PostgreSQL数据库保存用户密码的方式为加密保存(准确的说是保存用户的密码与随机数的hash值),加密算法为MD5和SCRAM-SHA-256两种,保存位置为系统表pg_authid。
MD5加密
md5bb1ea422b041dd851629d58572c7c744
从系统表pg_authid查询到的用户密码是上面这样的。
"md5":表示采用的是md5加密算法,后面是密码密文;
"bb1ea422b041dd851629d58572c7c744":密码密文,具体计算方式为明文密码和用户名的hash值,以下是手动计算用户user1/password1的md5密文的一种方式:
#echo -n password1user1 | md5sum
bb1ea422b041dd851629d58572c7c744 -
MD5认证
当系统存储用户user1的密码是md5加密并且hba文件配置用户user1的认证方式为md5时,用户user1登录时的密码校验(认证)过程如下:
1、服务端发送随机数salt到客户端,抓包看到的是4个字节;
2、客户端使用上述随机数做如下计算,并将结果发送到服务端:
md5(md5(username||password)||salt)
3、服务端校验密码的方式如下:
使用本地存储的密码密文store_key进行计算md5(store_key||salt),并将结果与客户端发过来的值进行比较,因为本地存储的密码密文是由md5(username||password)计算得来的,所以如果客户端提供的密码正确,比较结果肯定是一样的。