生成PostgreSQL用户密码

13 投票
2 回答
24152 浏览
提问于 2025-04-17 16:09

我尝试用Python里的hashlib来生成postgres的密码。

>>> import hashlib
>>> hashlib.md5("psql123").hexdigest()
2636d1ddc54901f98d011ffe050c0eb7

但是,postgresql要求密码前面要加md5这个前缀,所以接下来我做了

sudo -u postgres psql
ALTER USER postgres PASSWORD 'md52636d1ddc54901f98d011ffe050c0eb7';

不过,如果我用psql123作为密码,认证就会失败。

如果我用passlib,就没问题。可以看看这个链接:http://pythonhosted.org/passlib/lib/passlib.hash.postgres_md5.html

psql123作为密码做以下操作是可以的。

ALTER USER postgres PASSWORD 'md556074e7318bd4cee558faab0678a2fad';

我不太明白passlib里的警告是什么意思。用这个哈希值给postgres用户可以吗?另外,文档里哪里说username必须是输入的一部分?

我猜这就是为什么postgres无法理解hashlib的结果。作为一个LDAP用户,我可以在命令行生成密码。postgres有没有内置的命令可以做到这一点?psycopg2有这个功能吗?看起来是没有的。

2 个回答

5
alter user postgres ENCRYPTED password 'psql123';

如果你有其他用途,可以使用 pgcrypto 这个模块。

create table "user" (name text, password_hash text);

insert into "user" (name, password_hash) values
('u1', crypt('psql123', gen_salt('bf')));

select * from "user";
 name |                        password_hash                         
------+--------------------------------------------------------------
 u1   | $2a$06$SeH4u4aRtT2Zr39er4eSiONT/0IBQHYMbQXn2RauPJKCYdNX1.58G

select name, password_hash = crypt('psql123', password_hash)
from "user"
;
 name | ?column? 
------+----------
 u1   | t

在目标数据库中,以超级用户身份安装它:

create extension pgcrypto;
19

Postgres的密码哈希方式和你做的很相似,只是需要把用户名也包含进去,格式如下:

 pghash = "md5" + hashlib.md5(password + username).hexdigest()

据我所知,Postgres的文档并没有详细说明这种哈希格式,似乎假设管理员很少会直接处理这些哈希值 :( 我所知道的没有内置的方法来生成这些哈希。如果在ALTER USER命令中提供的密码不符合Postgres的哈希格式,它会认为这个密码没有被哈希,然后在内部处理这个问题——这是根据CREATE ROLE的ENCRYPTED关键字来说明的。(我认为这种行为有问题,因为如果哈希依赖于用户名,那就意味着哈希不能在不同账户之间复制粘贴,账户重命名时会出错,而且(从熵的角度猜测)有效的盐值只有大约6位)。

passlib文档开头对哈希的警告可能需要更清楚一些。它的目的是提醒浏览passlib文档的人,1)这个哈希非常不安全,2)不应该在自己的应用中使用它,3)它仅适合处理Postgres用户账户,因为这是Postgres支持的最强(也是唯一)哈希格式。

(如果你想用Postgres来为自己应用的用户账户哈希密码,我强烈支持Clodoaldo的建议,使用通过pgcrypto扩展的bcrypt)。

撰写回答