【发布时间】: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) 我正在保护的数据没有那么有价值,因此花时间以最高级别的安全性保护它是不值得的。
标签: postgresql md5 role