PostgreSQL数据库保存用户密码的方式为加密保存(准确的说是保存用户的密码与随机数的hash值),加密算法为MD5和SCRAM-SHA-256两种,保存位置为系统表pg_authid。
SCRAM-SHA-256加密及认证流程图:
SCRAM-SHA-256加密
SCRAM-SHA-256$4096:kgMvWNAau3NfgfcUIY89CA==$KQXDM5+0dCYCYFIjP4VcIXvrD5sqneAPImEjnR42+IY=:yt950PbOeGkvBe75WN706nGAdDOhU/2jbzxf+iRjLFU=
密文格式解析:
SCRAM-SHA-256:加密算法名称
4096:循环轮数,加密过程中算法执行次数
kgMvWNAau3NfgfcUIY89CA==:随机数
KQXDM5+0dCYCYFIjP4VcIXvrD5sqneAPImEjnR42+IY=:stored_key
yt950PbOeGkvBe75WN706nGAdDOhU/2jbzxf+iRjLFU=:server_key
加密过程解析:
实现scram-sha-256加密的函数主要是pg_be_scram_build_secret,首先获取一个随机数,该随机数会随同密码密文一同保存(如上),然后进入加密函数scram_build_secret,这里最主要是下面四步:
/* Calculate StoredKey and ServerKey */
if (scram_SaltedPassword(password, salt, saltlen, iterations,
salted_password) < 0 ||
scram_ClientKey(salted_