生成postgresql用户密码

2024-05-16 04:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python中的hashlibpostgres生成密码。

>>> 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用户,我可以在shell中生成密码。postgres有内置的命令吗?psycopg2有吗?看起来不是


Tags: 用户import密码postgresqlsudopostgrespasswordmd5
2条回答
alter user postgres ENCRYPTED password 'psql123';

对于其他用途,请使用^{}模块。

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;

Postgres的密码散列非常接近您所做的,它只需要包含用户名,如下所示:

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

另外,postgres文档根本没有记录这种散列格式,似乎认为管理员很少直接处理这些散列:(据我所知,没有生成这些散列的内置方法。如果提供给ALTER USER命令的密码不符合postgres散列格式,那么它假定密码没有被散列,并在内部按照CREATE ROLE加密关键字的文档进行处理。(这是一个有缺陷的行为,因为如果散列依赖于用户名,这意味着散列不能在不同的帐户之间复制和粘贴,在重命名帐户时中断,并且(猜测熵)只有~6位有效的salt)。

passlib文档顶部关于散列的警告可能更清楚。它的目的是警告浏览passlib文档的人:1)这个散列非常不安全;2)他们不应该在自己的应用程序中使用它;3)它只适合于使用postgres用户帐户,因为它是postgres对自己帐户最强大(也是唯一)的哈希格式。

(如果您试图使用postgres散列自己应用程序用户帐户的密码,我强烈建议Clodoaldo通过pgcrypto扩展使用bcrypt)。

相关问题 更多 >