是否可以在不提供纯文本密码的情况下在PostgreSQL中创建用户(理想情况下,我希望能够创建仅提供使用sha-256加密的密码的用户)?
我想做的是创建一个类似的用户:
CREATE USER "martin" WITH PASSWORD '$6$kH3l2bj8iT$KKrTAKDF4OoE7w.oy(...)BPwcTBN/V42hqE.';
有没有办法做到这一点?
感谢您的帮助。
答案 0 :(得分:59)
您可以提供已使用md5
进行哈希处理的密码,如文档(CREATE ROLE)中所述:
加密未加密这些关键词控制密码是否为 加密存储在系统目录中。 (如果两者都没有指定,那么 默认行为由配置参数确定 password_encryption。)如果显示的密码字符串已经存在 MD5加密格式,然后按原样加密存储,无论如何 是否指定了ENCRYPTED或UNENCRYPTED(因为系统不能 解密指定的加密密码字符串)。这允许 在转储/恢复期间重新加载加密密码。
此处缺少的信息是MD5加密的字符串应该是用户名加密的密码,加上开头的md5
。
例如,使用密码u0
创建foobar
,知道md5('foobaru0')
为ac4bbe016b808c3c0b816981f240dcae
:
CREATE USER u0 PASSWORD 'md5ac4bbe016b808c3c0b816981f240dcae';
然后u0将能够通过键入foobar
作为密码登录。
我认为目前没有办法使用SHA-256
代替md5
用于PostgreSQL密码。
答案 1 :(得分:8)
我不知道如何覆盖密码的默认md5加密,但是如果你有一个已经有md5加密密码的ROLE(又名“USER”),你可以提供它。使用pg_dumpall -g验证这一点(以查看集群中的全局变量) 例如
psql postgres
create role foo with encrypted password foobar;
\q
-- View the role from pg_dumpall -g
pg_dumpall -g | grep foo
CREATE ROLE foo;
ALTER ROLE foo WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION PASSWORD 'md5c98cbfeb6a347a47eb8e96cfb4c4b890';
Or get it from:
select * from pg_catalog.pg_shadow;
-- create the role again with the already-encrypted password
psql postgres
drop role foo;
CREATE ROLE foo;
ALTER ROLE foo WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION PASSWORD 'md5c98cbfeb6a347a47eb8e96cfb4c4b890';
\q
-- view the ROLE with the same password
pg_dumpall -g | grep foo
CREATE ROLE foo;
ALTER ROLE foo WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION PASSWORD 'md5c98cbfeb6a347a47eb8e96cfb4c4b890';
CREATE ROLE的文档
答案 2 :(得分:2)
更简单的方法是:
CREATE USER u0 PASSWORD 'foobar';
select * from pg_catalog.pg_shadow;
给passwd:md5ac4bbe016b808c3c0b816981f240dcae