Postgres:MD5 密码/普通密码

Posted

技术标签:

【中文标题】Postgres:MD5 密码/普通密码【英文标题】:Postgres: MD5 Password / Plain password 【发布时间】:2018-01-05 19:47:32 【问题描述】:

我试图了解角色密码在 Postgres 中应该如何操作。

https://www.postgresql.org/docs/current/static/sql-createrole.html 表示加密/未加密

如果显示的密码字符串已经是 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 不是加密,因为散列函数不是加密,它们是单向不可逆方法。加密假设解密,使用正确的密钥加密数据可以返回到我们未加密的状态。 MD5 不是安全的或可接受的密码验证器。当保存密码验证器时,仅使用散列函数是不够的,并且仅添加盐对提高安全性无济于事。而是使用随机盐迭代 HMAC 约 100 毫秒的持续时间,然后将盐与哈希一起保存。使用PBKDF2Rfc2898DeriveBytespassword_hashBcryptpasslib.hash 等函数或类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。 虽然您在两个 cmets 中都绝对正确,但有两个考虑因素:1) 我仅限于 Postgres 提供给我的设施。 2) 我正在保护的数据没有那么有价值,因此花时间以***别的安全性保护它是不值得的。 【参考方案1】:

Postgresql 散列密码具有 md5 前缀:

md548503dfd58720bd5ff35c102065a52d7

【讨论】:

这是在哪里记录的!?!我找到的只是***.com/questions/14918763/… @RalphShnelvar postgresql.org/docs/current/static/catalog-pg-authid.html【参考方案2】:

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

Generating postgresql user password 中提供的答案是适合我的答案。

【讨论】:

只是一个链接是不够的,它不能完全帮助未来的读者,可能会失效。 好吧......对于未来的读者,我指出的文章说:pghash = "md5" + hashlib.md5(password + username).hexdigest()【参考方案3】:

为 PostgreSQL 创建 md5 密码,公式为:

"md5" + md5(password + username)

这里有 3 种方法可以创建一个,其中用户名是“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:

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

Python 3:

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

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

【讨论】:

【参考方案4】:

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

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

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

是等价的。

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

【讨论】:

以上是关于Postgres:MD5 密码/普通密码的主要内容,如果未能解决你的问题,请参考以下文章

posgresql

Postgresql 用户管理

PostgreSQL 将密码加密从 SCRAM 降级为 md5

PostgreSQL远程连接配置管理/账号密码分配(解决:致命错误: 用户 "postgres" Ident 认证失败)

APP账号密码传输安全分析

APP账号密码传输安全分析