在PostgreSQL中使用加密密码创建用户

Mar*_*tin 42 passwords postgresql sha plaintext

是否可以在PostgreSQL中创建用户而不提供纯文本密码(理想情况下,我希望能够创建一个只提供用sha-256加密的密码的用户)?

我想做的是创建一个类似的用户:

CREATE USER "martin" WITH PASSWORD '$6$kH3l2bj8iT$KKrTAKDF4OoE7w.oy(...)BPwcTBN/V42hqE.';
Run Code Online (Sandbox Code Playgroud)

有办法做到这一点吗?

谢谢您的帮助.

Dan*_*ité 63

您可以提供已经哈希的密码md5,如doc(CREATE ROLE)中所述:

加密未加密这些关键词控制密码是否以加密方式存储在系统目录中.(如果两者都未指定,则默认行为由配置参数password_encryption确定.)如果显示的密码字符串已经是MD5加密格式,则无论是否指定了ENCRYPTED或UNENCRYPTED ,它都按原样加密存储(从系统无法解密指定的加密密码字符串).这允许在转储/恢复期间重新加载加密密码.

这里缺少的信息是MD5加密的字符串应该是用户名加密的密码,加上md5开头的.

因此,例如u0使用密码创建foobar,知道md5('foobaru0')ac4bbe016b808c3c0b816981f240dcae:

CREATE USER u0 PASSWORD 'md5ac4bbe016b808c3c0b816981f240dcae';
Run Code Online (Sandbox Code Playgroud)

然后u0将能够通过键入foobar密码登录.

我不认为目前有一种方法可以使用SHA-256而不是md5PostgreSQL密码.

  • 经常混淆加密和_hashing_让我很伤心:( MD5是一个_hashing_算法,这意味着没有密钥可以"解密"密码,但是暴力破解或碰撞攻击...... (18认同)
  • @Subbu:使用`echo -n`来抑制换行符,否则它也会被哈希处理.我在SQL中使用`select md5(...)`. (11认同)
  • 第三次是魅力.我有这个命令行为我工作.这是获得正确哈希的一种方便方法:`U = u0; P = foobar的; echo -n md5; echo -n $ P $ U | md5sum | cut -d'' - f1` (5认同)
  • 你是如何加密foobar到达ac4bbe016b808c3c0b816981f240dcae的?我正在尝试`echo"foobaru0"| md5sum | 切-d'' - f1`我得到一个不同的.然后尝试使用`CREATE USER u0 PASSWORD'mb5c49aa8b010dbdeec293c5a9504fb5531';`创建用户但是当我尝试使用密码foobar登录时它不接受它.称psql:FATAL:用户"u0"`的密码验证失败 (3认同)
  • @TobiasKienzler这是很久以前被破坏的MD5,因此至少有可能将其中一个密码"解密"回原始文本.此外,他们使用MD5的方式,哈希相当于密码.因此,哈希算法的强度无论如何都与他们的方案无关. (2认同)

小智 13

至少从版本 10.10 开始,也可以使用 SCRAM-SHA-256。

CREATE USER user_name
WITH PASSWORD 'SCRAM-SHA-256$4096:UunGvPETiX/JNGBvjOgW9A==$CPGNh7/MRfs0ispH9/HSJajOI8Uhp+UCRo/b/ToXIEY=:L6NzxQ3XUeWEeRa+oiuajC9Vgl7wk6ZpHAHl+pv4m00=';
GRANT CONNECT ON DATABASE database_name TO user_name;
Run Code Online (Sandbox Code Playgroud)

(重要的是不要忘记向新用户授予权限)

如果您希望默认使用 SCRAM,可以将 password_cryptography 设置为 SCRAM-SHA-256:

ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();
Run Code Online (Sandbox Code Playgroud)

我知道可以设置密码并避免 SQL 语句,此文档链接应该有所帮助。也许,有点不那么冗长。

无论如何,应尽可能避免 md5,SCRAM 是一种更可靠的密码存储方式。

如果您找不到创建 Postgres 接受的 SCRAM 字符串的方法,您可以使用以下代码让它为您创建一个字符串。

  1. 记得将password_cryption设置为SCRAM

    ALTER SYSTEM SET password_encryption = 'scram-sha-256';
    SELECT pg_reload_conf();
    
    Run Code Online (Sandbox Code Playgroud)

    这不能在事务块中运行。例如,如果您正在使用迁移文件,则可能必须为这两个命令创建两个不同的文件。

  2. 使用您需要编码的密码创建一个用户。

    CREATE USER tmp_user_to_create_a_password
    WITH PASSWORD 'your_password';
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用 SCRAM 加密读取密码。

    SELECT rolpassword
    FROM pg_catalog.pg_authid
    WHERE rolname='tmp_user_to_create_a_password';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 删除用户

    DROP USER IF EXISTS tmp_user_to_create_a_password;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在您可以在不使用纯文本的情况下创建用户。

    CREATE USER user_name
    WITH PASSWORD 'SCRAM-SHA-256$4096:3Lctb6GmH15cSO4bjcDsXg==$BSuI1c10J+NZ/Wmx4hwP4TvpdKEO9rl2hekZ8/DVuyA=:j8G9NJ30Xbz3Za2mjXF/j6O3DJbWyqvX886haFe4aCs=';
    GRANT CONNECT ON DATABASE database_name TO user_name;
    
    Run Code Online (Sandbox Code Playgroud)

    您现在可以使用“用户名”和“您的密码”登录。


bma*_*bma 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';
Run Code Online (Sandbox Code Playgroud)

创造角色的文件