【PostgreSQL采用MD5密码认证时密码和pg_authid里rolpassword的关系】

一、PostgreSQL用户密码以MD5方式加密

PostgreSQL里用户创建密码后,是把密码按照SCRAM-SHA-256或MD5等算法处理后的值写入数据库,等到用户登陆的时候,再把输入的密码进行相应的算法处理,把两个值进行比较来判断是否密码输入正确,具体如下:
客户端收到输入的密码后,会使用密码和用户做拼接,把用户作为salt,然后对拼接好的字符串做md5。即md5(密码+用户(salt))。然后把这个值加上md5前缀与存储在pg_authid里的rolpassword做比较,如果一致,则通过认证,如果不一致,则报密码错误。

MD5算法属于单向散列算法,无法通过反推获得原始输入数据,但是MD5不算严格意义上的加密算法,可用暴力穷举法破解。SCRAM-SHA-256生成的密文长度为256位,MD5生成的密文长度为128位。SCRAM-SHA-256算法的碰撞概率比MD5更小,因为SCRAM-SHA-256使用了更复杂的哈希算法和更长的输出长度。

二、测试验证使用md5认证时密码和pg_authid里rolpassword的关系

//session1

postgres=# show password_encryption ;

 password_encryption
---------------------

 md5
(1 row)

一个session用gdb来Attach这个进程,然后在encrypt_password函数这里打上断点。

//session2

(gdb) b encrypt_password
Breakpoint 1 at 0xaaaabc4f7a40: file crypt.c, line 118.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000aaaabc4f7a40 in encrypt_password at crypt.c:118

然后原本的这个数据库连接里执行创建用户的操作

//session1
执行后处于一直卡着的状态
postgres=# create user ysla with password '1qaz!QAZ';

然后去gdb端查看堆栈

(gdb) c
Continuing.

Breakpoint 1, encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0xaaaacccef658 "ysla", password=password@entry=0xaaaacccef670 "1qaz!QAZ") at crypt.c:118
118     {
(gdb) bt
#0  encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0xaaaacccef658 "ysla", password=password@entry=0xaaaacccef670 "1qaz!QAZ") at crypt.c:118
#1  0x0000aaaabc48d160 in CreateRole (pstate=pstate@entry=0xaaaaccdd3038, stmt=stmt@entry=0xaaaacccef750) at user.c:446
#2  0x0000aaaabc68c420 in standard_ProcessUtility (pstmt=0xaaaacccef800, queryString=0xaaaaccceec28 "create user ysla with password '1qaz!QAZ';",
    readOnlyTree=<optimized out>, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0xaaaacccf0030, qc=0xffffc7625318) at utility.c:911
#3  0x0000ffffab246270 in pgss_ProcessUtility (pstmt=0xaaaacccef800, queryString=0xaaaaccceec28 "create user ysla with password '1qaz!QAZ';",
    readOnlyTree=false, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0xaaaacccf0030, qc=0xffffc7625318) at pg_stat_statements.c:1145
#4  0x0000aaaabc68a6cc in PortalRunUtility (portal=portal@entry=0xaaaaccd71f18, pstmt=pstmt@entry=0xaaaacccef800, isTopLevel=isTopLeve
### 回答1: PostgreSQL不会以明文形式存储用户密码,而是将其哈希后存储在系统目录下的pg_authid表中。因此,您无法直接查看用户的密码。 如果您是数据库管理员,您可以更改用户密码,而不必知道其当前密码。您可以使用以下命令更改用户密码: ``` ALTER USER username WITH PASSWORD 'new_password'; ``` 其中,`username`是要更改密码的用户的名称,`new_password`是要设置的新密码。 如果您想了解用户的哈希密码值,您可以使用以下查询: ``` SELECT passwd FROM pg_authid WHERE rolname='username'; ``` 其中,`username`是要查询密码的用户的名称。但请注意,即使您知道哈希值,您也无法将其解密为明文密码。 ### 回答2: 在PostgreSQL中,默认情况下,用户的密码是以散列值的形式存储在系统表pg_shadow的字段shadow_password中的。而为了保护用户的密码安全,PostgreSQL不直接支持直接查看用户的密码。 然而,作为数据库管理员或特权用户,你可以通过以下步骤间接查看用户的密码: 1. 首先,以具有超级用户权限的角色登录到PostgreSQL服务器上。 2. 使用以下命令连接到你想要查看密码的目标数据库: ``` \c <目标数据库名称> ``` 3. 运行以下查询语句,以获取指定用户的密码哈希值: ```sql SELECT rolname, rolpassword FROM pg_authid WHERE rolname = '<用户名>'; ``` 其中,<用户名>是你要查看的用户的名称。 4. 在查询结果中,rolpassword列中存储了目标用户的密码散列值。这个散列值是通过MD5或SCRAM加密算法进行计算的。 需要注意的是,这种查询方式只适用于拥有较高权限的管理员或特权用户,应遵循安全隐私的最佳实践。在常规操作中,对于普通用户的密码,应该是加密的、不可见的,以提高安全性。 ### 回答3: 要查看PostgreSQL数据库中的用户密码,可以使用以下方法: 1. 通过连接到数据库服务器,使用超级用户(通常是postgres用户)权限登录到PostgreSQL。 2. 使用以下命令显示所有用户的密码哈希值: ```sql SELECT usename, passwd FROM pg_shadow; ``` 此命令将返回一个包含用户名密码哈希值的结果集。密码哈希值是加密的形式,不能直接查看明文密码。 3. 如果您需要将密码转换为明文以便查看,可以使用以下方法: - 若使用的是加密方法为MD5,您可以使用以下查询来获取对应的明文密码: ```sql SELECT username, decrypt(encode(passwd, 'hex'), current_setting('blowfish_key')) FROM pg_user; ``` 请注意,此查询需要在PostgreSQL配置文件中启用blowfish加密算法。您需要在postgresql.conf文件中设置`password_encryption`为`on`,并设置`blowfish_secret`为一个密钥字符串。此外,您还需要在pg_hba.conf文件中配置相应的认证方式。 - 若使用的是SCRAM-SHA-256加密方法,目前没有现成的方法可以将其转换为明文。这是因为SCRAM-SHA-256是一种安全的哈希算法,并且不允许简单地将密码解密为明文。 请注意,上述操作需要具有足够权限才能查看其他用户的密码。在生产环境中,保护用户密码的安全性非常重要,因此通常不建议查看或泄露用户密码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽ysl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值