MySQL 提供了两个身份验证插件,它们为用户帐户密码实现了 SHA-256 哈希
caching_sha2_password
:实现 SHA-256 身份验证(类似于sha256_password
),但在服务器端使用缓存以获得更好的性能,并具有适用于更广泛应用的附加功能。sha256_password
(已弃用):实现基本的 SHA-256 身份验证。
本节介绍原始的非缓存 SHA-2 身份验证插件。有关缓存插件的信息,请参阅第 8.4.1.2 节,“缓存 SHA-2 可插拔身份验证”。
在 MySQL 8.4 中,caching_sha2_password
是默认的身份验证插件,而不是 mysql_native_password
(已弃用)。有关此更改对服务器操作以及服务器与客户端和连接器兼容性的影响的信息,请参阅caching_sha2_password 作为首选身份验证插件。
由于 caching_sha2_password
是 MySQL 8.4 中的默认身份验证插件,并且提供了 sha256_password
身份验证插件功能的超集,因此 sha256_password
已弃用;预计它将在未来版本的 MySQL 中删除。使用 sha256_password
进行身份验证的 MySQL 帐户应迁移为使用 caching_sha2_password
。
要使用通过 sha256_password
插件进行身份验证的帐户连接到服务器,您必须使用 TLS 连接或支持使用 RSA 密钥对进行密码交换的未加密连接,如本节后面所述。无论哪种方式,sha256_password
插件都使用 MySQL 的加密功能。请参阅第 8.3 节,“使用加密连接”。
在名称 sha256_password
中,““sha256”” 指的是插件用于加密的 256 位摘要长度。在名称 caching_sha2_password
中,““sha2”” 更泛指 SHA-2 类加密算法,其中 256 位加密就是一个例子。后一种命名方式为将来扩展可能的摘要长度留下了空间,而无需更改插件名称。
下表显示了服务器端和客户端的插件名称。
以下各节提供了 SHA-256 可插拔身份验证特有的安装和使用信息
有关 MySQL 中可插拔身份验证的一般信息,请参阅第 8.2.17 节,“可插拔身份验证”。
sha256_password
(已弃用)插件以服务器和客户端形式存在
服务器端插件内置于服务器中,无需显式加载,也不能通过卸载来禁用。
客户端插件内置于
libmysqlclient
客户端库中,并且可用于链接到libmysqlclient
的任何程序。
要设置使用已弃用的 sha256_password
插件进行 SHA-256 密码哈希的帐户,请使用以下语句,其中 password
是所需的帐户密码
CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';
服务器将 sha256_password
插件分配给该帐户,并使用它通过 SHA-256 对密码进行加密,并将这些值存储在 mysql.user
系统表的 plugin
和 authentication_string
列中。
(如果 sha256_password
是默认插件,则不需要 IDENTIFIED WITH
子句;可以使用 authentication_policy
指定。)
sha256_password
支持通过安全传输进行连接。sha256_password
还支持在未加密的连接上使用 RSA 进行加密密码交换,前提是 MySQL 是使用 OpenSSL 编译的,并且要连接到的 MySQL 服务器配置为支持 RSA(使用本节稍后给出的 RSA 配置过程)。
RSA 支持具有以下特点
在服务器端,有两个系统变量命名 RSA 私钥和公钥对文件:
sha256_password_private_key_path
和sha256_password_public_key_path
。如果要使用的密钥文件的名称与系统变量默认值不同,则数据库管理员必须在服务器启动时设置这些变量。服务器使用
sha256_password_auto_generate_rsa_keys
系统变量来确定是否自动生成 RSA 密钥对文件。请参阅第 8.3.3 节“创建 SSL 和 RSA 证书和密钥”。Rsa_public_key
状态变量显示sha256_password
身份验证插件使用的 RSA 公钥值。拥有 RSA 公钥的客户端可以在连接过程中与服务器执行基于 RSA 密钥对的密码交换,如下所述。
对于通过使用
sha256_password
和基于 RSA 公钥对的密码交换进行身份验证的帐户的连接,服务器会根据需要将 RSA 公钥发送到客户端。但是,如果客户端主机上提供了公钥副本,则客户端可以使用它来节省客户端/服务器协议中的往返行程对于这些命令行客户端,请使用
--server-public-key-path
选项来指定 RSA 公钥文件:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap、mysqltest。对于使用 C API 的程序,请调用
mysql_options()
并传递MYSQL_SERVER_PUBLIC_KEY
选项和文件名来指定 RSA 公钥文件。对于副本,请使用带有
SOURCE_PUBLIC_KEY_PATH
选项的CHANGE REPLICATION SOURCE TO
语句来指定 RSA 公钥文件。对于组复制,group_replication_recovery_get_public_key
系统变量的作用相同。
对于使用 sha256_password
插件的客户端,在连接到服务器时,密码永远不会以明文形式公开。密码传输如何发生取决于使用的是安全连接还是 RSA 加密
如果连接是安全的,则不需要 RSA 密钥对,也不会使用它。这适用于使用 TLS 加密的连接。密码以明文形式发送,但由于连接是安全的,因此无法被窃听。
注意与
caching_sha2_password
不同,已弃用的sha256_password
插件不会将共享内存连接视为安全的,即使共享内存传输默认情况下是安全的。如果连接不安全,并且 RSA 密钥对可用,则连接将保持未加密状态。这适用于未使用 TLS 加密的连接。RSA 仅用于客户端和服务器之间的密码交换,以防止密码被窃听。当服务器接收到加密的密码时,它会对其进行解密。加密中使用了一种混淆技术来防止重复攻击。
如果未使用安全连接并且 RSA 加密不可用,则连接尝试将失败,因为无法在不将密码公开为明文的情况下发送密码。
要将 RSA 密码加密与已弃用的 sha256_password
插件一起使用,客户端和服务器都必须使用 OpenSSL 进行编译,而不仅仅是其中之一。
假设 MySQL 已使用 OpenSSL 编译,请使用以下过程在客户端连接过程中启用 RSA 密钥对以进行密码交换
使用 第 8.3.3 节“创建 SSL 和 RSA 证书和密钥” 中的说明创建 RSA 私钥和公钥对文件。
如果私钥和公钥文件位于数据目录中,并且分别命名为
private_key.pem
和public_key.pem
(sha256_password_private_key_path
和sha256_password_public_key_path
系统变量的默认值),则服务器会在启动时自动使用它们。否则,要显式命名密钥文件,请在服务器选项文件中将系统变量设置为密钥文件名。如果文件位于服务器数据目录中,则无需指定其完整路径名
[mysqld] sha256_password_private_key_path=myprivkey.pem sha256_password_public_key_path=mypubkey.pem
如果密钥文件不在数据目录中,或者要在系统变量值中显式指定其位置,请使用完整路径名
[mysqld] sha256_password_private_key_path=/usr/local/mysql/myprivkey.pem sha256_password_public_key_path=/usr/local/mysql/mypubkey.pem
重新启动服务器,然后连接到服务器并检查
Rsa_public_key
状态变量的值。实际显示的值与此处显示的值不同,但应该是非空的mysql> SHOW STATUS LIKE 'Rsa_public_key'\G *************************** 1. row *************************** Variable_name: Rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ g8aV7EtKwyhHb0c30QIDAQAB -----END PUBLIC KEY-----
如果该值为空,则表示服务器在密钥文件中发现了一些问题。请检查错误日志以获取诊断信息。
使用 RSA 密钥文件配置服务器后,使用已弃用的 sha256_password
插件进行身份验证的帐户可以选择使用这些密钥文件连接到服务器。如前所述,此类帐户可以使用安全连接(在这种情况下不使用 RSA)或使用 RSA 执行密码交换的未加密连接。假设使用的是未加密的连接。例如
$> mysql --ssl-mode=DISABLED -u sha256user -p
Enter password: password
对于 sha256user
的此连接尝试,服务器确定 sha256_password
是适当的身份验证插件,并调用它(因为这是在 CREATE USER
时指定的插件)。该插件发现连接未加密,因此需要使用 RSA 加密传输密码。在这种情况下,插件会将 RSA 公钥发送到客户端,客户端使用它对密码进行加密并将结果返回给服务器。插件使用服务器端的 RSA 私钥对密码进行解密,并根据密码是否正确接受或拒绝连接。
服务器会根据需要将 RSA 公钥发送到客户端。但是,如果客户端有一个文件包含服务器所需的 RSA 公钥的本地副本,则可以使用 --server-public-key-path
选项指定该文件
$> mysql --ssl-mode=DISABLED -u sha256user -p --server-public-key-path=file_name
Enter password: password
--server-public-key-path
选项命名的文件中公钥值应与 sha256_password_public_key_path
系统变量命名的服务器端文件中密钥值相同。如果密钥文件包含有效的公钥值但该值不正确,则会发生拒绝访问错误。如果密钥文件不包含有效的公钥,则客户端程序将无法使用它。在这种情况下,已弃用的 sha256_password
插件会将公钥发送到客户端,就像未指定 --server-public-key-path
选项一样。
客户端用户可以通过以下两种方式获取 RSA 公钥
数据库管理员可以提供公钥文件的副本。
可以通过其他方式连接到服务器的客户端用户可以使用
SHOW STATUS LIKE 'Rsa_public_key'
语句并将返回的密钥值保存在文件中。