Postgres:MD5密码/明文密码

12

我正在尝试理解Postgres中角色密码应该如何操作。

https://www.postgresql.org/docs/current/static/sql-createrole.html中对ENCRYPTED / UNENCRYPTED的说明为:

如果提供的密码字符串已经以MD5加密格式存在,则将其加密存储,如原样。

因此,我的未加密密码是:MyPassword。

"MyPassword"的MD5哈希值为48503dfd58720bd5ff35c102065a52d7。

如果我执行以下操作:

-- See https://www.postgresql.org/docs/9.6/static/sql-alterrole.html
ALTER ROLE "MeOhMy"
LOGIN
PASSWORD '48503dfd58720bd5ff35c102065a52d7'
;

然后尝试在操作时使用"MyPassword"

  sudo -u postgres psql meohmy -h 127.0.0.1 -d meohmy_development

当然,我首先会被提示输入我的sudo密码,然后我会被Postgres提示“meohmy的密码”

如果我输入MyPassword,我会得到

FATAL:  password authentication failed for user "ralph@dos32.com"

如果我输入的是48503dfd58720bd5ff35c102065a52d7,那么我就可以登录。

我理解错了什么吗?


MD5不是加密,因为哈希函数不是加密,它们是单向不可逆的方法。加密意味着解密,使用正确的密钥可以将加密数据返回到其未加密状态。 - zaph
MD5不是一种安全或可接受的密码验证器。仅使用哈希函数保存密码验证器是不够的,仅添加盐也无法提高安全性。相反,应该使用随机盐迭代HMAC约100毫秒,并将盐与哈希一起保存。使用诸如PBKDF2Rfc2898DeriveBytespassword_hashBcryptpasslib.hash或类似函数。关键是让攻击者花费大量时间通过暴力破解找到密码。 - zaph
2
虽然您的评论都是正确的,但有两个考虑因素: 1)我受限于Postgres提供给我的设施。 2)我要保护的数据并不那么有价值,所以花费时间用最高级别的安全性来保护它并不值得。 - RalphShnelvar
4个回答

32

创建 PostgreSQL 的 md5 密码公式如下:

"md5" + md5(password + username)

这里有三种方法可以创建一个用户名为"admin",密码为"password123"的账户...

Linux:

# echo -n "md5"; echo -n "password123admin" | md5sum | awk '{print $1}'
md53f84a3c26198d9b94054ca7a3839366d

注意:使用 -n 选项是关键,以避免将换行符包含在哈希中!

MacOS:

➜ echo -n "md5"; md5 -qs "password123admin"                                                                                                                                                                                   
md53f84a3c26198d9b94054ca7a3839366d

Python 2:

Python 2:

>>> import hashlib
>>> print("md5" + hashlib.md5("password123" + "admin").hexdigest())
md53f84a3c26198d9b94054ca7a3839366d

Python 3:

与上述相同,但使用二进制字符串

print("md5" + hashlib.md5(b"password123" + b"admin").hexdigest())

在Linux示例中,我认为最好使用单引号而不是双引号。例如,如果密码包含特殊字符 $,双引号会将其解释为变量。例如 echo -n "password$123admin"echo -n 'password$123admin'在此处查看其他有趣的行为 - tk3

3

Postgresql的哈希密码具有md5前缀:

md548503dfd58720bd5ff35c102065a52d7

这个在哪里有文档啊!!?!我只找到了 https://dev59.com/_mUp5IYBdhLWcg3w8bJB - RalphShnelvar
1
@RalphShnelvar https://www.postgresql.org/docs/current/static/catalog-pg-authid.html - gilad905

0

在GCP Cloud SQL上使用Postgres11。Gitlab版本gitlab-ee 13.3.4 Omnibus安装。

# gitlab-ctl pg-password-md5 gitlab_user
Enter password:
Confirm password:

并且

# echo -n <password for gitlab_user>gitlab_user | md5sum

是等价的。

注意:我的数据库用户是 gitlab_user


-1

@zerkms提供的答案部分正确,它引导我找到了正确的答案。

生成postgresql用户密码中提供的答案是适合我的答案。


1
仅有一个链接是不够的,它不能完全帮助未来的读者,并且可能会失效。 - zaph
好的...为了未来的读者,我指向的文章说:pghash = "md5" + hashlib.md5(password + username).hexdigest() - RalphShnelvar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接