生成PostgreSQL用户密码
我尝试用Python里的hashlib
来生成postgres
的密码。
>>> 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用户,我可以在命令行生成密码。postgres有没有内置的命令可以做到这一点?psycopg2
有这个功能吗?看起来是没有的。
2 个回答
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;
Postgres的密码哈希方式和你做的很相似,只是需要把用户名也包含进去,格式如下:
pghash = "md5" + hashlib.md5(password + username).hexdigest()
据我所知,Postgres的文档并没有详细说明这种哈希格式,似乎假设管理员很少会直接处理这些哈希值 :( 我所知道的没有内置的方法来生成这些哈希。如果在ALTER USER
命令中提供的密码不符合Postgres的哈希格式,它会认为这个密码没有被哈希,然后在内部处理这个问题——这是根据CREATE ROLE的ENCRYPTED关键字来说明的。(我认为这种行为有问题,因为如果哈希依赖于用户名,那就意味着哈希不能在不同账户之间复制粘贴,账户重命名时会出错,而且(从熵的角度猜测)有效的盐值只有大约6位)。
passlib文档开头对哈希的警告可能需要更清楚一些。它的目的是提醒浏览passlib文档的人,1)这个哈希非常不安全,2)不应该在自己的应用中使用它,3)它仅适合处理Postgres用户账户,因为这是Postgres支持的最强(也是唯一)哈希格式。
(如果你想用Postgres来为自己应用的用户账户哈希密码,我强烈支持Clodoaldo的建议,使用通过pgcrypto扩展的bcrypt)。