【问题标题】:Creating user with encrypted password in PostgreSQL在 PostgreSQL 中使用加密密码创建用户
【发布时间】:2013-06-30 00:35:12
【问题描述】:

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

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

CREATE USER "martin" WITH PASSWORD '$6$kH3l2bj8iT$KKrTAKDF4OoE7w.oy(...)BPwcTBN/V42hqE.';

有什么办法吗?

感谢您的帮助。

【问题讨论】:

    标签: postgresql passwords sha plaintext


    【解决方案1】:

    您可以提供已经用md5 散列的密码,如文档(CREATE ROLE)中所述:

    ENCRYPTED UNENCRYPTED 这些关键字控制密码是否是 加密存储在系统目录中。 (如果两者都没有指定,则 默认行为由配置参数确定 password_encryption.) 如果提供的密码字符串已经在 MD5 加密格式,然后按原样加密存储,不管 是否指定了 ENCRYPTED 或 UNENCRYPTED(因为系统无法 解密指定的加密密码字符串)。这允许 在转储/恢复期间重新加载加密密码。

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

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

    CREATE USER u0 PASSWORD 'md5ac4bbe016b808c3c0b816981f240dcae';
    

    然后 u0 将能够通过输入 foobar 作为密码登录。

    我认为目前没有办法使用SHA-256 代替md5 作为 PostgreSQL 密码。

    【讨论】:

    • 加密和散列的常规混合让我很难过:( MD5是一个散列算法,这意味着没有“解密”的密钥密码但暴力破解或碰撞攻击......
    • 你是如何加密 foobar 以到达 ac4bbe016b808c3c0b816981f240dcae 的?我正在尝试echo "foobaru0" | md5sum | cut -d' ' -f1,但我得到了一个不同的。然后尝试使用CREATE USER u0 PASSWORD 'md5c49aa8b010dbdeec293c5a9504fb5531'; 创建用户,但是当我尝试使用密码 foobar 登录时,它不接受它。说psql: FATAL: password authentication failed for user "u0"
    • @Subbu: 使用echo -n 抑制换行符,否则它也会被散列。我在 SQL 中使用了select md5(...)
    • 第三次的魅力。我让这个命令行为我工作。这是获取正确哈希的便捷方式:U=u0; P=foobar; echo -n md5; echo -n $P$U | md5sum | cut -d' ' -f1
    • @TobiasKienzler 这是 MD5,很久以前就被破解了,所以至少有可能其中一个密码可以“解密”回原始文本。此外,他们使用 MD5 的方式,哈希相当于密码。所以无论如何,哈希算法的强度与他们的方案无关。
    【解决方案2】:

    我不知道有一种方法可以覆盖密码的默认 md5 加密,但如果您有一个 ROLE(又名“用户”),其密码已经 md5 加密,那么您似乎可以提供该密码。使用 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 的文档

    【讨论】:

    • 您可以在postgresql.conf中设置password_encryptionscram-sha-256以获得scram-sha-256密码加密。但是请注意,旧客户端可能不支持 SCRAM 身份验证(请参阅postgresql.org/docs/11/…
    【解决方案3】:

    更简单的方法是:

    CREATE USER u0 PASSWORD 'foobar';

    select * from pg_catalog.pg_shadow;
    

    提供密码:md5ac4bbe016b808c3c0b816981f240dcae

    【讨论】:

    • 这忽略了问题的重点,即创建密码的人不必知道密码才能创建用户。
    【解决方案4】:

    至少从版本 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;
    

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

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

    ALTER SYSTEM SET password_encryption = 'scram-sha-256';
    SELECT pg_reload_conf();
    

    我知道设置密码也可以避免 SQL 语句 this link to the documentation should help。也许,this 不那么冗长。

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

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

    1. 记得将密码加密设置为 SCRAM

      ALTER SYSTEM SET password_encryption = 'scram-sha-256';
      SELECT pg_reload_conf();
      

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

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

      CREATE USER tmp_user_to_create_a_password
      WITH PASSWORD 'your_password';
      
    3. 使用 SCRAM 加密读取密码。

      SELECT rolpassword
      FROM pg_catalog.pg_authid
      WHERE rolname='tmp_user_to_create_a_password';
      
    4. 删除用户

      DROP USER IF EXISTS tmp_user_to_create_a_password;
      
    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;
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      相关资源
      最近更新 更多