我尝试使用来自 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
中的warning想说什么。 postgres
用户可以使用这个散列吗?另外,文档中的哪个地方说 username
必须是输入的一部分?
我想这就是 postgres
无法理解 hashlib
的结果的原因。作为 LDAP 用户,我可以在 shell 中生成密码。 postgres 是否有内置命令来执行此操作? psycopg2
有吗?好像没有。
最佳答案
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)。
关于python - 生成postgresql用户密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14918763/