什么是mysql_native_password?

d a*_*s y 22 authentication plugins mysql-5.7

我试图为root. 当我运行时:

mysql> SELECT * from mysql.user where User="root";
Run Code Online (Sandbox Code Playgroud)

表明:

+-----------+------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-----------------------+------------------+-----------------------+-------------------+----------------+
| Host      | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string | password_expired | password_last_changed | password_lifetime | account_locked |
+-----------+------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-----------------------+------------------+-----------------------+-------------------+----------------+
| localhost | root | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         | Y          | Y               | Y          | Y          | Y            | Y          | Y                     | Y                | Y            | Y               | Y                | Y                | Y              | Y                   | Y                  | Y                | Y          | Y            | Y                      |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password |                       | N                | 2018-06-13 15:11:59   |              NULL | N              |
+-----------+------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-----------------------+------------------+-----------------------+-------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

这份文件说,

mysql_native_password 本机身份验证插件向后兼容。不支持身份验证插件的旧客户端确实使用本机身份验证协议,因此它们可以连接到支持可插入身份验证的服务器。

但从技术上讲,我并没有得到太多。它与root用户密码有什么关系吗?

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';
Run Code Online (Sandbox Code Playgroud)

ALTER USER 'root'@'localhost' IDENTIFIED BY '<password>';
Run Code Online (Sandbox Code Playgroud)

它有什么区别吗?

jyn*_*nus 28

长期以来,MySQL 支持不同的身份验证插件,基本上是可编程的代码片段,以证明 mysql 帐户归任何声称拥有的人所有。

这样做的原始方法是设置密码,以特定方式对其进行散列,然后将其存储在 mysql.user 表中。但是,这不是您进行身份验证的唯一方法,例如:

  • unix 套接字身份验证允许登录在本地计算机上使用与 mysql 帐户相同的 unix 名称。这通常用于管理员帐户进行监控或其他任务,而无需维护密码。它有这个名字是因为它只适用于套接字连接(而不是远程连接)
  • PAM 身份验证插件允许设置,例如,LDAP 支持的系统并使用它进行身份验证(很高兴将其集成到现有组织中)
  • 最新版本的 mysql (8.0) 使用一种不太简单的身份验证方法 ( caching_sha2_password),理论上它更安全(我不是说它是或不是,但当然默认的“本机”很糟糕),但可能需要更新客户端驱动程序和应用程序,因此出于兼容性原因,您始终可以恢复到旧版本。

在“企业”世界中,很多时候都需要非常特殊的身份验证方法,而不仅仅是用户和密码。

基本上,mysql_native_password 是传统的身份验证方法 - 它不是很安全(它只使用密码的散列),但它与旧驱动程序兼容如果您要启动一个新的 mysql 服务,您可能希望从一开始就使用新插件(和 TLS)。如果您有特殊需要,您可以使用其他方法- 如果您有某些特殊需要,您甚至可以编程)。

您可以为每个单独的用户选择不同的方法- 例如,您的普通应用程序可以使用 mysql_native_password 或新的 sha2 密码,但您可以确保您的管理员帐户使用 2-factor 身份验证令牌,并确保您的管理员帐户使用 2-factor 身份验证令牌和 unix_socket 用于收集统计信息的监视用户在mysql服务器上。那些其他身份验证方法可能会或可能不会使用 mysql.user 表上的密码字段,就像原生方法一样(它们可能将密码存储在 elswhere,或者它们甚至可能没有密码的概念!)。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<password>';
Run Code Online (Sandbox Code Playgroud)

ALTER USER 'root'@'localhost' IDENTIFIED BY '<password>';
Run Code Online (Sandbox Code Playgroud)

本质上是一样的,mysql_native_password 通常是默认的认证方式。有了WITH你可以决定使用哪种方法。例如,如果使用GRANT USAGE ON *.* TO root@localhost IDENTIFIED WITH socket_auth,则将该用户设置为使用 unix 套接字身份验证。MariaDB 使用稍微不同的语法:VIA unix_socket. 运行这些命令主要会导致 mysql.user 表的更新。

注意ALTER/GRANT在下次用户登录时自动工作,而UPDATE直接 mysql.user 表可能需要一个FLUSH PRIVILEGES,并且在某些情况下(Galera 等)有一些问题。