POSTGRESQL中从MD5到SCRAM-SHA-256

本文介绍了PostgreSQL从v10开始采用scram-sha-256改进密码安全的过程,包括原因、切换问题、步骤以及注意事项,强调了升级客户端和重置密码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从 v10 开始,PostgreSQL 提供了scram-sha-256对密码哈希和身份验证的支持。本文介绍了如何安全地调整您的应用程序。

为什么我们需要scram-sha-256

PostgreSQL 使用哈希加密有两个目的:

  • 实际的数据库密码是用户输入的明文密码的哈希值。这可以防止小偷在其他系统上使用偷来的密码。
  • 在密码验证过程中,客户端必须使用服务器提供的随机盐对密码进行散列。如果服务器从客户端收到正确的散列响应,则密码检查成功。

现在,MD5 散列方法存在弱点,不适合加密。特别是,使用给定的 MD5 哈希值构造字符串太容易了。这些缺点不适用于 PostgreSQL 使用 MD5 的方式,但使用更好的哈希算法仍然有意义:

  • 昂贵的散列函数使得暴力破解密码变得更加困难
  • 在安全审计期间,如果PostgreSQL不使用有缺陷的散列函数,看起来会更好

因此在 v10 中引入了scram-sha-256支持。如果可以的话,开始使用新的哈希方法。暴力破解密码的难度增加了,因此值得付出努力。

切换到的问题scram-sha-256

有两个问题导致很难从 MD5 切换到scram-sha-256

  • 由于PostgreSQL不知道原来的明文密码,将密码加密方法改为 scram-sha-256 后,用户必须重新设置密码。
  • PostgreSQL客户端必须支持 scram-sha-256 身份验证,因此使用旧的客户端软件进行身份验证将会失败。

当你尝试连接到一个需要scram-sha-256身份验证的服务器时,使用旧版本的libpq会得到的错误信息是:

authentication method 10 not supported

旧的 JDBC 驱动程序会告诉您:

The authentication type 10 is not supported.

旧版本的 Npgsql 将返回:

Authentication method not supported (Received: 10)

切换到scram-sha-256的步骤说明

实际上,转换为scram-sha-256并不难,只要你遵循以下原则:

1.升级客户端软件

升级所有过时的PostgreSQL客户端软件和驱动程序,以支持新的身份验证方法。无论如何,这是一个好主意,因为陷入旧的、未维护的软件永远不是明智的。

2. 更改password_encryption参数

编辑postgresql.conf并将参数更改为

password_encryption = scram-sha-256

确保删除了该行开头的散列值(#)。然后通过运行重新加载服务器

pg_ctl reload -D /postgres/datadir

其中/postgres/datadir是 PostgreSQL 数据目录。或者,您可以运行以下 SQL 语句:

SELECT pg_reload_conf();

查看日志文件以查看重新加载是否成功,并通过 SQL 检查新值:

SHOW password_encryption;

注意,即使修改了参数,旧的MD5密码仍然有效,只要pg_hba.conf中的身份验证方法设置为MD5即可。

3. 重新设置所有密码

所有经过密码验证的用户必须更改密码。在psql中,超级用户可以用

\password user_name

即使用户设置与以前相同的密码,该密码现在也将使用 SHA-256 进行哈希处理。在继续下一步之前,请检查该表pg_authid并确保它不再包含 MD5 哈希密码。

4. 更改认证方式pg_hba.conf

这一步不是严格必须的,因为PostgreSQL将对sram -sha-256哈希密码使用sram -sha-256身份验证,即使在pg_hba .conf中将身份验证方法设置为md5。这是一个兼容性特性。

不过,您应该修改pg_hba.conf,将所有出现的md5替换为scham -sha-256。这将阻止仍然使用旧MD5密码的用户进行身份验证。

之后,像上面一样重新加载配置。然后检查日志文件或检查视图pg_hba_file_rules,以查看重新加载是否成功。

结论

从上面可以看出,将 md5 改为 scram-sha-256并不难。困难的部分是你必须重新设置所有的密码,并且你可能需要升级客户端软件。

### 解决使用 `org.postgresql.Driver` 时遇到的 Invalid 或不支持的 SCRAM 认证机制错误 当尝试通过 `org.postgresql.Driver` 进行数据库连接并收到关于无效或不受支持的 SCRAM (Salted Challenge Response Authentication Mechanism) 错误消息时,这通常意味着客户端版本与服务器端配置之间存在兼容性问题。 #### 修改 PostgreSQL 配置文件以禁用 SCRAM 为了使旧版 JDBC 客户端能够成功建立连接,在 PostgresQL 的安装目录下定位到数据文件夹中的 `pg_hba.conf` 文件[^4]。编辑此文件来调整认证方式: ```plaintext # TYPE DATABASE USER ADDRESS METHOD host all all 0.0.0.0/0 md5 ``` 上述更改将身份验证方法设置为 MD5 密码散列算法而非默认启用的新式 SCRAM-SHA-256 方案。保存修改后的配置文件,并重启 PostgreSQL 数据库服务以便应用新的设定。 #### 更新 PostgreSQL JDBC Driver 版本 如果可能的话,考虑升级应用程序使用的 PostgreSQL JDBC driver 至最新稳定发行版。较新版本已经包含了对于 SCRAM 协议的支持以及改进过的安全性特性。确保项目构建工具(Maven, Gradle 等)指向了一个适当范围内的依赖项声明[^2]: 对于 Maven 用户来说,可以在 pom.xml 中加入如下片段: ```xml <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.x.x</version><!-- 使用最新的次要版本 --> </dependency> ``` #### 设置合适的 JVM 参数传递给驱动程序 有时即使更新了驱动器也可能遭遇同样的异常情况;此时可以尝试向启动命令添加额外参数指定期望采用的身份验证模式: ```bash -Dorg.postgresql.ssl=true -Djavax.net.debug=ssl \ -Dorg.postgresql.authentication.scram_sha_256=false ``` 这些选项强制关闭了对 SCRAM SHA-256 加密握手过程的需求,允许继续沿用传统的简单密码交换流程完成登录操作。 #### Java 代码示例展示如何创建带有自定义属性的数据源对象 ```java import java.sql.Connection; import javax.sql.DataSource; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; public class DatabaseConnectionExample { public static void main(String[] args){ HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb"); config.setUsername("myuser"); config.setPassword("mypassword"); // 关闭SCRAM认证机制 config.addDataSourceProperty("authentication", "md5"); DataSource ds = new HikariDataSource(config); try(Connection conn = ds.getConnection()){ System.out.println("Connected to the database!"); } catch(Exception e){ e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值