美文网首页
PHP连接MySQL时:The server requested

PHP连接MySQL时:The server requested

作者: 四月不见 | 来源:发表于2022-01-10 23:44 被阅读0次

    ----- 最近更新【2022-01-29】-----

    一、问题描述与解决方案

    1、问题描述

    当我用 PHP 连接 MySQL 时报如下错误:

    The server requested authentication method unknown to the client

    上面错误信息的字面意思:服务器请求使用的是客户端未知的身份验证方法。

    2、我的开发环境

    PHP:PHP 7.3.31
    MySQL:mysql 8.0.27

    3、解决方案

    修改 MySQL 的身份认证插件:

    ALTER USER '用户名'@'%' IDENTIFIED WITH sha256_password BY '密码';
    

    二、问题分析与总结

    以明文形式发送密码可能会出现某些安全问题(如密码被截获),为了避免这些安全问题,许多客户端在将密码发送到服务器之前会使用 “身份验证插件” 对密码进行加密,MySQL 客户端连接到 MySQL 服务器的时候也是一样的道理。

    1、身份验证插件

    MySQL 目前使用的身份验证插件有三种,分别是 mysql_native_passwordsha256_passwordcaching_sha2_password

    • mysql_native_password:使用新的SHA1哈希算法进行认证校验。通过SHA1(SHA1(password))两次哈希计算用户的原始密码然后保存在表mysql.user的authentication_string列中。(SHA1哈希算法现在已变得比较容易破解、相同的密码拥有相同的哈希值)
    • sha256_password:实现基本的SHA-256身份验证。(加密方式比 mysql_native_password更安全,但认证过程中的时间更长 )
    • caching_sha2_password:哈希算法升级为了更为安全SHA256算法,并在服务器端使用缓存以获得更好的性能,并具有其他功能以提高适用性。(更安全的密码加密和更好的性能)

    在 MySQL 8.0 版本中,默认的身份验证插件是 caching_sha2_password;而在 MySQL 5.7 版本则为mysql_native_password。

    2、查看 MySQL 身份验证插件

    可以使用以下方式查看当前你的 MySQL 使用的是哪个身份验证插件。

    方法一:(查看默认值)

    mysql> show variables like 'default_authentication_plugin';
    +-------------------------------+-----------------------+
    | Variable_name                 | Value                 |
    +-------------------------------+-----------------------+
    | default_authentication_plugin | caching_sha2_password |
    +-------------------------------+-----------------------+
    1 row in set (0.00 sec)
    

    方法二:(查看用户与身份验证插件)

    mysql> select user,host,plugin from mysql.user;
    +------------------+-----------+-----------------------+
    | user             | host      | plugin                |
    +------------------+-----------+-----------------------+
    | root             | %         | caching_sha2_password |
    | mysql.infoschema | localhost | caching_sha2_password |
    | mysql.session    | localhost | caching_sha2_password |
    | mysql.sys        | localhost | caching_sha2_password |
    +------------------+-----------+-----------------------+
    4 rows in set (0.00 sec)
    

    3、查看 PHP 使用的身份验证插件

    可以通过 phpinfo() 函数查看当前 PHP 连接 MySQL 时支持哪种身份验证插件。如下图,查看 mysqlnd 下面的 Loaded plugins 的那一行,名字以auth_plugin_开头的就是 当前 PHP 可用的 MySQL 身份验证插件。

    可以看到,我当前使用的 PHP 并不支持 caching_sha2_password,这就是我连接 MySQL 会报错的原因。我们从中选一个 PHP 和 Mysql 都支持的身份验证插件就行,这里我选择使用 sha256_password,所以只要我把 MySQL 的也改成 sha256_password 就行了。

    注:
    php 8.0 开始也支持 caching_sha2_password 了。

    4、更改 MySQL 身份认证方式

    如我要更改 root 用户的身份认证方式,可使用命令:

    mysql> ALTER USER 'root'@'%' IDENTIFIED WITH sha256_password BY '用户密码';
    Query OK, 0 rows affected (0.01 sec)
    

    然后检查一下是否更改成功了:

    mysql> select user,host,plugin from mysql.user;
    +------------------+-----------+-----------------------+
    | user             | host      | plugin                |
    +------------------+-----------+-----------------------+
    | root             | %         | sha256_password       |
    | mysql.infoschema | localhost | caching_sha2_password |
    | mysql.session    | localhost | caching_sha2_password |
    | mysql.sys        | localhost | caching_sha2_password |
    +------------------+-----------+-----------------------+
    4 rows in set (0.00 sec)
    

    三、参考

    -- MySQL Authentication Plugins
    -- MySQL Authentication Methods
    -- MySQL 8.0:新的身份验证插件(caching_sha2_password)

    相关文章

      网友评论

          本文标题:PHP连接MySQL时:The server requested

          本文链接:https://www.haomeiwen.com/subject/cvizqrtx.html