我尝试使用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
有那个吗?它看起来没有。
答案 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;