生成postgresql用户密码

时间:2013-02-17 07:01:35

标签: python postgresql

我尝试使用Python中的postgreshashlib生成密码。

>>> 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 个答案:

答案 0 :(得分:18)

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

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

AFAIK,postgres文档根本没有真正记录这种哈希格式,并且似乎假设管理员很少直接处理这些哈希:(没有内置的方法来生成我知道的这些哈希。如果密码提供给ALTER USER命令不符合postgres哈希格式,它假定密码没有经过哈希处理,并在内部处理 - 根据CREATE ROLE的ENCRYPTED关键字的文档。 (恕我直言,这是一个有缺陷的行为,因为如果哈希取决于用户名,则意味着哈希不能被复制并粘贴在不同的帐户之间,当帐户被重命名时中断,并且(猜测熵)只有~6位有效的盐)。

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

(如果您尝试使用postgres来为您自己的应用程序的用户帐户哈希密码,我强烈要求Clodoaldo建议通过pgcrypto扩展名来使用bcrypt)。

答案 1 :(得分: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;