使用 md5 加密密码而不是明文密码登录 PostgreSQL
Posted
技术标签:
【中文标题】使用 md5 加密密码而不是明文密码登录 PostgreSQL【英文标题】:Login to PostgreSQL using md5 encrypted password and not plaintext password 【发布时间】:2014-09-14 15:20:24 【问题描述】:我已经创建了一个使用 md5 加密密码的用户,如下:
create user testuser with encrypted password 'md54ca03099a7cd3945e0260801ff5972a3';
加密后的密码是“md5”+md5(密码+用户名)的组合
password=test
username=testuser
使用 md5 方法在 pg_hba.conf 文件中添加 testuser 条目
现在我正在尝试使用上面创建的用户登录,如下所示:
psql -d dbexpress -U testuser
它提示输入密码。我提供了上面的加密密码,所以它给了我错误:
psql: FATAL: password authentication failed for user "testuser"
但我可以使用纯密码“test”登录到 postgresql。
【问题讨论】:
您必须将password
与psql -d dbexpress -U testuser
一起传递,这是因为您有Added entry for testuser in pg_hba.conf file with md5 method
或将md5 Method
更改为Trust
什么是'md54ca03099a7cd3945e0260801ff5972a3'?是您首先生成然后放入上述查询吗?
您提供的密码是什么?是'md54ca03099a7cd3945e0260801ff5972a3'吗?
【参考方案1】:
认证方式md5
不直接管理系统目录中密码的加密(CREATE ROLE
中的关键字ENCRYPTED
):
Postgres 10 或更高版本
注意这个update in Postgres 10
为密码协商和存储添加 SCRAM-SHA-256 支持 (Michael Paquier、Heikki Linnakangas)
这提供了比现有 md5 协商更好的安全性,并且 存储方式。
The manual:
为了便于从 md5 方法过渡到较新的 SCRAM 方法,如果 md5 被指定为
pg_hba.conf
中的方法,但用户的密码在 服务器为 SCRAM 加密(见下文),然后基于 SCRAM 将自动选择身份验证。
Postgres 9.6 或更早版本
Per documentation on the authentication method:
基于密码的身份验证方法是 md5 和密码。这些 除了发送密码的方式外,其他方法的操作类似 跨连接,分别是 MD5 散列和明文。
Per documentation on the ENCRYPTED
keyword in CREATE ROLE
:
ENCRYPTED
UNENCRYPTED
这些关键字控制密码是否在系统目录中加密存储。 (如果两者都没有指定,则默认行为 由配置参数 password_encryption 确定。)如果 显示的密码字符串已经是 MD5 加密格式,那么 它按原样加密存储,无论是
ENCRYPTED
还是 指定UNENCRYPTED
(因为系统无法解密 指定的加密密码字符串)。这允许重新加载 转储/恢复期间的加密密码。
两者都使用 md5 加密,但第一个与 transport 有关,第二个与 storage 有关。即使使用身份验证方法md5
(在pg_hba.conf
中设置),您仍需要为您的登录提供未加密密码。用户名作为 salt 用于客户端和服务器上的 md5 加密。
pg_hba.conf
中的第一个匹配条目
关于你的评论:
使用 md5 方法在 pg_hba.conf 文件中添加 testuser 条目。
不要只是“添加”一个条目。应用pg_hba.conf
中的第一个 行!
pg_hba.conf
上的手册:
第一条记录具有匹配的连接类型、客户端地址、 请求的数据库,并使用用户名进行身份验证。
所有引号都用粗体强调。
【讨论】:
是的,我已经添加了条目,并确保它在 pg_hba.conf 文件中考虑了这个条目本身。我的要求是我通过 jdbc 传递加密密码,因此 Postgres 应该将此密码识别为加密并允许用户登录,或者是否有任何机制以便我们可以在登录前在 postgres 端解密密码?以上是关于使用 md5 加密密码而不是明文密码登录 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章
Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理