文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  SHA-256 可插拔身份验证

8.4.1.3 SHA-256 可插拔身份验证

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 位加密就是一个例子。后一种命名方式为将来扩展可能的摘要长度留下了空间,而无需更改插件名称。

下表显示了服务器端和客户端的插件名称。

表 8.17 SHA-256 身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 sha256_password
客户端插件 sha256_password
库文件 无(插件内置)

以下各节提供了 SHA-256 可插拔身份验证特有的安装和使用信息

有关 MySQL 中可插拔身份验证的一般信息,请参阅第 8.2.17 节,“可插拔身份验证”

安装 SHA-256 可插拔身份验证

sha256_password(已弃用)插件以服务器和客户端形式存在

  • 服务器端插件内置于服务器中,无需显式加载,也不能通过卸载来禁用。

  • 客户端插件内置于 libmysqlclient 客户端库中,并且可用于链接到 libmysqlclient 的任何程序。

使用 SHA-256 可插拔身份验证

要设置使用已弃用的 sha256_password 插件进行 SHA-256 密码哈希的帐户,请使用以下语句,其中 password 是所需的帐户密码

CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';

服务器将 sha256_password 插件分配给该帐户,并使用它通过 SHA-256 对密码进行加密,并将这些值存储在 mysql.user 系统表的 pluginauthentication_string 列中。

(如果 sha256_password 是默认插件,则不需要 IDENTIFIED WITH 子句;可以使用 authentication_policy 指定。)

sha256_password 支持通过安全传输进行连接。sha256_password 还支持在未加密的连接上使用 RSA 进行加密密码交换,前提是 MySQL 是使用 OpenSSL 编译的,并且要连接到的 MySQL 服务器配置为支持 RSA(使用本节稍后给出的 RSA 配置过程)。

RSA 支持具有以下特点

对于使用 sha256_password 插件的客户端,在连接到服务器时,密码永远不会以明文形式公开。密码传输如何发生取决于使用的是安全连接还是 RSA 加密

  • 如果连接是安全的,则不需要 RSA 密钥对,也不会使用它。这适用于使用 TLS 加密的连接。密码以明文形式发送,但由于连接是安全的,因此无法被窃听。

    注意

    caching_sha2_password 不同,已弃用的 sha256_password 插件不会将共享内存连接视为安全的,即使共享内存传输默认情况下是安全的。

  • 如果连接不安全,并且 RSA 密钥对可用,则连接将保持未加密状态。这适用于未使用 TLS 加密的连接。RSA 仅用于客户端和服务器之间的密码交换,以防止密码被窃听。当服务器接收到加密的密码时,它会对其进行解密。加密中使用了一种混淆技术来防止重复攻击。

  • 如果未使用安全连接并且 RSA 加密不可用,则连接尝试将失败,因为无法在不将密码公开为明文的情况下发送密码。

注意

要将 RSA 密码加密与已弃用的 sha256_password 插件一起使用,客户端和服务器都必须使用 OpenSSL 进行编译,而不仅仅是其中之一。

假设 MySQL 已使用 OpenSSL 编译,请使用以下过程在客户端连接过程中启用 RSA 密钥对以进行密码交换

  1. 使用 第 8.3.3 节“创建 SSL 和 RSA 证书和密钥” 中的说明创建 RSA 私钥和公钥对文件。

  2. 如果私钥和公钥文件位于数据目录中,并且分别命名为 private_key.pempublic_key.pemsha256_password_private_key_pathsha256_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
  3. 重新启动服务器,然后连接到服务器并检查 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' 语句并将返回的密钥值保存在文件中。