如何在PostgreSQL中使用SCRAM-SHA-256来通过JDBC连接数据库

7

我正在尝试在JDBC中测试SCRAM-SHA-256。

  public static void main(String[] args) throws SQLException {
        String url = "jdbc:postgresql://192.168.56.101:1521/gisdb";
        Properties props = new Properties();
        props.setProperty("user", "pguser");
        String scram = "SCRAM-SHA-256$4096:QNTBYMpbvZjbOx5RLM7rvA==$tuBD7Ek7niK8jyiuwjCGLH2EurqMNoIaclZhOXohyik=:2b0Ow951/1OPKsqzaGLWPyT+wVIXOs9dvY8TF2eTCVM=";
        props.setProperty("password", scram);
//        props.setProperty("password", "*******");

        Connection conn = DriverManager.getConnection(url, props);
        String databaseProductVersion = conn.getMetaData().getDatabaseProductVersion();
        System.out.println(databaseProductVersion);
    }

我的pg_hba.conf:

hostssl all             all             192.168.0.0/16          scram-sha-256
#hostssl all             all             192.168.0.0/16          trust

select rolname,rolpassword from pg_authid; 这条命令会显示:

          rolname          |                                                              rolpassword
---------------------------+---------------------------------------------------------------------------------------------------------------------------------------
 pg_monitor                |
 pg_read_all_settings      |
 pg_read_all_stats         |
 pg_stat_scan_tables       |
 pg_read_server_files      |
 pg_write_server_files     |
 pg_execute_server_program |
 pg_signal_backend         |
 pguser                    | SCRAM-SHA-256$4096:PZNbiF6I5G1SVcoN9sTjJw==$xe8jrBS9iUn0ldoIV8moaAod06sYRbxsyyQaUbiuSQE=:2tpLS+eL1brme0Il0wcnsllkDBfDkaQ/II7iVJ3ecxM=
 test                      |
 postgres                  | SCRAM-SHA-256$4096:o1lyjT/acTglIuLsp6TF3Q==$pdWLZ8DuceZDwr9jla0WPzXXa3N3kWrjh9cPnrloP3w=:6hd8Ib7Od+ZZenItVoH4L+26oSiBxqp63WxO82PeonM=


当我在Java代码中使用 scram-sha-256 加密的密码字符串或者纯密码进行连接时,在日志文件中会显示 FATAL: password authentication failed for user "pguser"。当我将方法更改为 trustpg_hba.conf中,它可以正常工作。如何使用 scram-sha-256 方法进行密码连接?我的JDBC驱动程序版本是 postgresql-42.2.12.jar

你使用的JDBC驱动程序版本是哪个? - user330315
最新的 postgresql-42.2.12.jar - gooin
7
如果您可以使用数据库中的身份验证哈希作为密码,那么安全将成为一个笑话。 - Mark Rotteveel
2个回答

8

您必须提供明文密码,而不是SCRAM哈希值。


3
据我所知,这是一个多步骤的解决方案,所有步骤如下:
  • 首先,我们需要将SCRAM作为数据库的加密类型。为此,您需要编辑文件postgresql.conf,并将password_encryption的值更改为:password_encryption = scram-sha-256

更改后请重新启动您的postgres服务器

  • 其次,更新数据库中的密码并验证它们是否处于scram加密状态。 默认情况下,数据库密码使用MD5加密,更新db配置后,您需要更新存储在db中的这些加密字符串。运行sql查询:alter user with encrypted password ;通过运行查询select rolname,rolpassword from pg_authid;验证更改。您应该看到密码列中的字符串格式为SCRAM-*
  • 第三,我们需要为传入的客户端连接启用scram配置。为此,请编辑文件pg_hba.conf。请参考以下屏幕截图:

**Change the method value as in the image** 剩下的部分,您的jdbc程序应该可以工作(只需进行一些小的编辑:String scram = "plaintext-password";),请注意使用正确版本的jdbc驱动程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接