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 毫秒的持续时间,然后将盐与哈希一起保存。使用PBKDF2
、Rfc2898DeriveBytes
、password_hash
、Bcrypt
、passlib.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 密码/普通密码的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 将密码加密从 SCRAM 降级为 md5
PostgreSQL远程连接配置管理/账号密码分配(解决:致命错误: 用户 "postgres" Ident 认证失败)