生成 PostgreSQL 用户密码。

12

我尝试使用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是否有这样的命令?看起来它没有。

2个回答

19
Postgres的密码哈希与您所做的非常接近,只需���将用户名包含在其中,具体如下:
 pghash = "md5" + hashlib.md5(password + username).hexdigest()
AFAIK,postgres文档根本没有真正记录这个哈希格式,并且似乎假定管理员很少直接处理这些哈希值 :( 据我所知,没有内置方法可以生成这些哈希值。如果提供给ALTER USER命令的密码不符合postgres哈希格式,则假定该密码尚未进行哈希处理,然后在CREATE ROLE的ENCRYPTED关键字文档中处理 - 根据文档(依我之见,这是有缺陷的行为,因为如果哈希值取决于用户名,则意味着哈希值无法在不同账户之间复制和粘贴,在账户更名时会出错,而且(从熵的角度猜测)只有约6位有效盐)。 passlib文档顶部对哈希的警告可能需要更清晰一些。它旨在警告浏览passlib文档的人:1)这个哈希值非常不安全,2)他们不应该采用它用于自己的应用程序,3)它只适用于与postgres用户帐户一起使用,因为它是postgres为其自身帐户支持的最强(也是唯一)的哈希格式。
(如果您想使用postgres为自己应用程序的用户帐户哈希密码,我强烈支持 Clodoaldo 的建议,即通过pgcrypto扩展使用bcrypt )。

非常感谢。我会给你们两个点赞,但由于你们回答了我所有的疑虑,我会选择你。但我还是要感谢你们两个。不,哈希只是针对 postgres 用户账户,而不是应用程序用户账户。这种哈希方式让我想起了两种天真的 MAC 构造方式,它们会导致扩展/长度攻击。 - CppLearner

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;

非常感谢!我稍后会查看pgcrypto。非常有用的信息。 - CppLearner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接