MySQL提供了两个认证插件,为用户帐户密码实现SHA-256哈希:
sha256_password
:支持基本的SHA-256认证。caching_sha2_password
:支持SHA-256认证sha256_password
),但在服务器端使用缓存以获得更好的性能,并具有更广泛的适用性的附加特性。
介绍缓存SHA-2认证插件。有关原始基本(非缓存)插件的信息,请参见第6.4.1.3节“SHA-256可插式认证”.
在MySQL 8.0中,caching_sha2_password
是默认的认证插件而不是mysql_native_password
.有关此更改对服务器操作的影响以及服务器与客户机和连接器的兼容性的信息,请参见caching_sha2_password作为首选的认证插件.
的身份验证帐户连接到服务器caching_sha2_password
插件,您必须使用安全连接或支持使用RSA密钥对进行密码交换的非加密连接,稍后将在本节中介绍。无论哪种方式,caching_sha2_password
插件使用MySQL的加密功能。看到第6.3节“使用加密连接”.
的名字sha256_password
,”sha256”指插件用于加密的256位摘要长度。的名字caching_sha2_password
,”sha2”更一般地指SHA-2类加密算法,256位加密是其中一个实例。后一种名称选择为将来扩展可能的摘要长度留下了空间,而无需更改插件名称。
的caching_sha2_password
插件具有这些优点,相比之下sha256_password
:
在服务器端,内存缓存可以在用户再次连接时更快地对之前连接的用户进行身份验证。
基于rsa的密码交换是可用的,无论MySQL连接的SSL库是什么。
支持使用Unix套接字文件和共享内存协议的客户端连接。
下表显示了服务器端和客户端的插件名称。
表6.13 SHA-2认证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | caching_sha2_password |
客户端插件 | caching_sha2_password |
库文件 | 无(插件是内置的) |
以下部分提供了特定于缓存SHA-2可插入身份验证的安装和使用信息:
有关MySQL中可插入身份验证的一般信息,请参见第6.2.17节,“可插入认证”.
的caching_sha2_password
插件存在于服务器和客户端形式:
服务器端插件内置在服务器中,不需要显式加载,也不能通过卸载它来禁用它。
客户端插件内置到
libmysqlclient
客户端库,并可用于链接到的任何程序libmysqlclient
.
服务器端插件使用sha2_cache_cleaner
审计插件作为一个助手执行密码缓存管理。sha2_cache_cleaner
,就像caching_sha2_password
,是内置的,不需要安装。
设置一个使用caching_sha2_password
插件的SHA-256密码哈希,使用以下语句,其中密码
是所需的帐户密码:
CREATE USER 'sha2user'@'localhost' IDENTIFIED WITH ' caching_sha2_password '密码”;
服务器分配caching_sha2_password
插件,并使用该插件使用SHA-256加密密码,将这些值存储在插件
而且authentication_string
列的mysql.user
系统表。
前面的说明不假设caching_sha2_password
是默认的身份验证插件。如果caching_sha2_password
是默认的认证插件,更简单吗创建用户
可以使用语法。
启动服务器,默认的身份验证插件设置为caching_sha2_password
,把这些行放在服务器选项文件中:
(mysqld) default_authentication_plugin = caching_sha2_password
导致caching_sha2_password
插件将默认用于新帐户。因此,可以创建帐户并设置其密码,而无需显式地命名插件:
创建用户“sha2user”@“localhost”密码”;
设置的另一个后果default_authentication_plugin
来caching_sha2_password
要使用其他插件创建帐户,必须显式指定该插件。例如,要使用mysql_native_password
插件,使用以下语句:
CREATE USER 'nativeuser'@'localhost' WITH ' mysql_native_password '密码”;
caching_sha2_password
支持通过安全传输的连接。如果您遵循本节后面给出的RSA配置过程,它还支持在未加密的连接上使用RSA进行加密的密码交换。RSA支持具有以下特点:
在服务器端,有两个系统变量命名RSA私有和公共密钥对文件:
caching_sha2_password_private_key_path
而且caching_sha2_password_public_key_path
.如果要使用的密钥文件名称与系统变量默认值不同,则数据库管理员必须在服务器启动时设置这些变量。服务器使用
caching_sha2_password_auto_generate_rsa_keys
系统变量决定是否自动生成RSA密钥对文件。看到第6.3.3节“创建SSL和RSA证书和密钥”.的
Caching_sha2_password_rsa_public_key
命令使用的RSA公钥值caching_sha2_password
身份验证插件。拥有RSA公钥的客户端可以在连接过程中与服务器进行基于RSA密钥对的密码交换,后面会介绍。
用于通过与。进行身份验证的帐户进行的连接
caching_sha2_password
与RSA密钥对进行密码交换时,服务器默认不向客户端发送RSA公钥。客户端可以使用所需公钥的客户端副本,也可以向服务器请求公钥。使用公钥的可信本地副本使客户机能够避免客户机/服务器协议中的往返,并且比从服务器请求公钥更安全。另一方面,从服务器请求公钥更加方便(它不需要管理客户端文件),并且在安全的网络环境中是可以接受的。
对于命令行客户机,请使用
——server-public-key-path
选项指定RSA公钥文件。使用——get-server-public-key
选项从服务器请求公钥。以下程序支持这两个选项:mysql,mysqlsh,mysqladmin,mysqlbinlog,mysqlcheck,, mysqldump,mysqlimport,mysqlpump,mysqlshow,mysqlslap,mysqltest,mysql_upgrade.对于使用C API的程序,调用
mysql_options ()
命令指定RSA公钥文件MYSQL_SERVER_PUBLIC_KEY
选项和文件的名称,或通过传递MYSQL_OPT_GET_SERVER_PUBLIC_KEY
选择。对于副本,使用
将复制源更改为
语句(从MySQL 8.0.23)或改变主
语句(在MySQL 8.0.23之前)SOURCE_PUBLIC_KEY_PATH
|MASTER_PUBLIC_KEY_PATH
选项指定RSA公钥文件GET_SOURCE_PUBLIC_KEY
|GET_MASTER_PUBLIC_KEY
选项从源请求公钥。对于“组复制”,设置为“。group_replication_recovery_public_key_path
而且group_replication_recovery_get_public_key
系统变量也有同样的作用。
在所有情况下,如果给出了指定有效公钥文件的选项,则该选项优先于从服务器请求公钥的选项。
对于使用caching_sha2_password
插件,当连接到服务器时,密码永远不会暴露为明文。密码如何传输取决于使用的是安全连接还是RSA加密:
如果连接是安全的,则不需要使用RSA密钥对。这适用于使用TLS加密的TCP连接,以及Unix套接字文件和共享内存连接。密码以明文形式发送,但由于连接是安全的,因此无法窥探。
如果连接不安全,则使用RSA密钥对。这适用于未使用TLS加密的TCP连接和命名管道连接。RSA仅用于客户端和服务器之间的密码交换,防止密码被窥探。当服务器接收到加密的密码时,它将对其进行解密。加密过程中使用了打乱,以防止重复攻击。
在客户端连接过程中使用RSA密钥对进行密码交换,请执行以下步骤:
使用中的说明创建RSA私有和公共密钥对文件第6.3.3节“创建SSL和RSA证书和密钥”.
如果私钥和公钥文件位于数据目录中并被命名
private_key.pem
而且public_key.pem
的默认值caching_sha2_password_private_key_path
而且caching_sha2_password_public_key_path
系统变量),服务器在启动时自动使用它们。否则,要显式地命名密钥文件,请将系统变量设置为服务器选项文件中的密钥文件名。如果文件位于服务器数据目录中,则不需要指定它们的完整路径名:
(mysqld) caching_sha2_password_private_key_path = myprivkey。pem caching_sha2_password_public_key_path = mypubkey.pem
如果关键文件不在数据目录中,或者要在系统变量值中显式显示它们的位置,请使用完整路径名:
(mysqld) caching_sha2_password_private_key_path = / usr /地方/ mysql / myprivkey。pem caching_sha2_password_public_key_path = / usr /地方/ mysql / mypubkey.pem
如果您想更改使用的散列轮数
caching_sha2_password
密码生成过程中,请设置caching_sha2_password_digest_rounds
系统变量。例如:(mysqld) caching_sha2_password_digest_rounds = 10000
重新启动服务器,然后连接到它并检查
Caching_sha2_password_rsa_public_key
状态变量值。实际显示的值与这里显示的值不同,但应该是非空的:mysql >显示状态像Caching_sha2_password_rsa_public_key \ G *************************** 1。行*************************** Variable_name: Caching_sha2_password_rsa_public_key取值:-----BEGIN公钥----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/ 1lcs2xiyfad8fcj64zwtnkby2gkt1imjuab5ogd5kj g8aV7EtKwyhHb0c30QIDAQAB -----END公钥-----
如果该值为空,则服务器发现密钥文件有问题。检查错误日志以获得诊断信息。
在服务器上配置了RSA密钥文件后,使用RSA密钥进行认证的帐户caching_sha2_password
插件可以选择使用这些密钥文件连接到服务器。如前所述,这些帐户可以使用安全连接(在这种情况下不使用RSA),也可以使用使用RSA执行密码交换的非加密连接。假设使用一个未加密的连接。例如:
shell> mysql——ssl-mode=DISABLED -u sha2user -p Enter password:密码
对于这个连接尝试sha2user
,由服务器确定caching_sha2_password
是否合适的身份验证插件并调用它(因为插件指定在创建用户
时间)。插件发现连接没有加密,因此需要使用RSA加密传输密码。但是服务器没有将公钥发送给客户端,客户端又没有提供公钥,所以无法加密密码,连接失败:
错误2061 (HY000):认证插件'caching_sha2_password'报告错误:认证需要安全连接。
若要从服务器请求RSA公钥,请指定——get-server-public-key
选择:
shell> mysql——ssl-mode=DISABLED -u sha2user -p——get-server-public-key输入password:密码
在这种情况下,服务器将RSA公钥发送给客户端,客户端使用它加密密码,并将结果返回给服务器。该插件使用服务器端的RSA私钥来解密密码,并根据密码是否正确接受或拒绝连接。
或者,如果客户端有一个包含服务器所需的RSA公钥的本地副本的文件,它可以使用——server-public-key-path
选择:
shell> mysql——ssl-mode=DISABLED -u sha2user -p——server-public-key-path=file_name输入密码:密码
在这种情况下,客户机使用公钥对密码进行加密,并将结果返回给服务器。该插件使用服务器端的RSA私钥来解密密码,并根据密码是否正确接受或拒绝连接。
控件命名的文件中的公钥值——server-public-key-path
选项中命名的服务器端文件中的键值应相同caching_sha2_password_public_key_path
系统变量。如果密钥文件包含有效的公钥值,但该值不正确,则会发生拒绝访问错误。如果密钥文件不包含有效的公钥,客户端程序就不能使用它。
客户端用户可以通过以下两种方式获取RSA公钥:
数据库管理员可以提供公钥文件的副本。
可以通过其他方式连接到服务器的客户端用户可以使用
SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'
语句,并将返回的键值保存到文件中。
在服务器端caching_sha2_password
插件使用内存缓存,以更快地验证之前已连接的客户端。条目由帐户-名称/密码-哈希对组成。缓存的工作原理如下:
当客户端连接时,
caching_sha2_password
检查客户端和密码是否与某个缓存条目匹配。如果是,则认证成功。如果没有匹配的缓存条目,插件将尝试根据中的凭据验证客户端
mysql.user
系统表。如果成功,caching_sha2_password
将客户端的条目添加到散列中。否则,认证失败并拒绝连接。
通过这种方式,当客户机第一次连接时,根据mysql.user
系统表。当客户端随后连接时,针对缓存进行更快的身份验证。
方法处理除添加项以外的密码缓存操作sha2_cache_cleaner
审计插件,它代表执行这些操作caching_sha2_password
:
它会清除任何被重命名或删除的帐户的缓存条目,或者任何凭证或身份验证插件被更改的帐户的缓存条目。
时,它会清空缓存
冲洗的特权
执行语句。它在服务器关闭时清空缓存。(这意味着缓存在服务器重新启动时不会持久。)
缓存清理操作会影响后续客户端连接的身份验证要求。对于每个用户帐户,在进行以下任何操作后,该用户的第一个客户端连接必须使用安全连接(使用TCP使用TLS凭证、Unix套接字文件或共享内存)或基于RSA密钥对的密码交换:
冲洗的特权
对象清除整个缓存并影响所有使用caching_sha2_password
插件。其他操作清除特定的缓存条目,只影响作为该操作一部分的帐户。
一旦用户身份验证成功,该帐户就被输入到缓存中,后续连接不需要安全连接或RSA密钥对,直到另一个缓存清除事件发生,影响该帐户。(当可以使用缓存时,服务器使用挑战-响应机制,该机制不使用明文密码传输,也不需要安全连接。)