python - 生成postgresql用户密码

标签 python postgresql

我尝试使用来自 Python 的 hashlibpostgres 生成密码。

>>> 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/

相关文章:

python - 使用 Python Selenium 获取跨度文本

java - JPA实体关系?

sql - 如果联接表不返回结果,则不返回任何行

sql - 运算符不存在: integer = bigint[]

python - 基于局部变量的Django条件过滤器

python - Dropbox API 上的 401 未经授权

python - Pandas read_csv : Ignore second header line

python - __init__.py 发生了怎样的变化?

postgresql - 为什么 Docker 中的 pg_restore 段错误?

MySQL 外部数据包装器 : use SSH parameters for SSL connection?