段落引用原文作者: Laurenz Albe
翻译:Tracy
原文链接:https://www.cybertec-postgresql.com/en/from-md5-to-scram-sha-256-in-postgresql

从 v10 开始,PostgreSQL支持使用SCRAM-SHA-256加密方式来进行加密密码和认证。本文介绍了如何正确地调整应用程序改使用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,这种情况下身份验证会失败。
当服务器设置认证方式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;
请注意,即使您更改了参数,如果pg_hba.conf设置的认证方式仍然是的MD5,旧的以MD5方式加密的密码仍然有效。
3.再次设置所有密码
所有设置为密码认证的用户都必须修改密码。在中psql,超级用户可以使用以下命令更改任何用户的密码
\password user_name
即使用户设置了与以前相同的密码,密码也将使用SHA-256进行散列。在继续下一步之前,检查表pg_authid,确保它不再包含MD5哈希密码。
4.在pg_hba.conf中更改身份验证方法
这一步不是绝对必要的,因为即使在pg_hba.conf中身份验证方法设置为md5,PostgreSQL将对使用scram-sha-256方式加密的密码使用scram-sha-256认证方式。这是一个兼容性功能。
尽管如此,您还是应该调整pg_hba.conf,将所有出现的"md5"替换为"scram-sha-256"。这将阻止仍然使用旧MD5密码的用户进行身份验证。
之后,像上面一样重新加载配置。然后检查日志文件或检查视图pg_hba_file_rules,查看重新加载是否成功。
结论
从上面可以看出,在pg_hba.conf文件中修改md5认证方式并不那么困难。困难的是,您必须重新设置所有数据库用户的密码,并可能不得不升级旧的客户端软件。




