12

我试图从 Python生成postgres使用密码。hashlib

>>> 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?好像没有。

4

2 回答 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)。

于 2013-02-18T16:50:28.500 回答
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;
于 2013-02-17T11:43:28.520 回答