11

我编写了一个安装脚本来使用以下 SQL 命令更改 root 密码:

UPDATE user SET password='*C563415623144561...' WHERE user='root';

这在 Mysql 5.7 上不起作用:http: //dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-6.html#mysqld-5-7-6-account-management

我的问题是:如何将此命令更改为与 5.6 和 5.7 版本的 Mysql 兼容的另一个命令?我想用一个散列字符串而不是一个清晰的密码来更新密码。

4

8 回答 8

25

从 mysql 5.7 开始,这不再是用户表中的密码字段。它现在称为 authentication_string。您可以像这样更改或设置密码:

set password for 'jeff'@'localhost' = PASSWORD('mypass'); // this automatically hashes the password

如果您想使用您的查询,只需更改passwordauthentication_string,它就会起作用。

UPDATE user SET authentication_string='*C563415623144561...' WHERE user='root@localhost';

希望这有帮助。

于 2015-09-07T01:39:35.560 回答
20

我在 Mysql 5.7.22 中使用此命令重置为空密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
于 2018-04-24T20:32:19.330 回答
5

鉴于 'SET PASSWORD FOR = PASSWORD('')' 在 mysql 5.7 上已被弃用。如果没有正确完成,您甚至可能在 syslog 中出现以下错误。

The plugin 'auth_socket' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.

我建议使用下面的命令。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypass';

https://www.percona.com/blog/2016/03/16/change-user-password-in-mysql-5-7-with-plugin-auth_socket/

于 2017-04-12T15:20:51.323 回答
1

在带有 mysqld 版本 8.0.19 的 Ubuntu 19.10 上,以上都不适用于我。此处给出的说明https://linuxconfig.org/how-to-reset-root-mysql-mariadb-password-on-ubuntu-20-04-focal-fossa-linux有效。它适用于 MariaDB,但如果不使用 MariaDB,它也是一样的。两个关键点是:函数 password() 在 mysqld 8.0+ 中被删除,并且由于某种原因,mysqld 的 unix 套接字不是使用 --skip-grant-tables 选项创建的。因此,您必须使用这些修改后的说明:

$ sudo systemctl stop mysql
$ sudo mkdir -p /var/run/mysqld
$ sudo chown mysql:mysql /var/run/mysqld
$ sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking &

检查守护进程 mysqld 是否正在运行:

$ ps aux | grep mysqld

如果它正在运行,则启动mysql并更改密码

$ mysql -u root

> FLUSH PRIVILEGES;
> USE mysql; 
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'N3w_p@ssw0rD.';
> quit

重要提示:在您(重新)启动 mysqld 之前,您需要终止当前进程。只是以正常方式停止它是行不通的。

$ sudo pkill mysqld
$ sudo systemctl start mysql

然后你可以测试:

$ mysql -u root --password='N3w_p@ssw0rD.'
于 2020-02-25T01:41:06.727 回答
0

我不是 MySQL 权威,但根据 MySQL 当前的 5.7 文档,当前接受且最受好评的答案中的建议让我觉得不明智。(这可能是由于时间的流逝——问题和@mdamia 的答案都是在 2015 年发布的。)

@Tobia 的问题链接的MySQL 5.7.6(2015-03-09,里程碑 16)发行说明说“ALTER USER 现在是分配密码的首选语句。”

该问题确实询问是否可以将单个命令用于 MySQL 5.6 和 5.7,但鉴于ALTER USERMySQL >= 5.7.6 实现的语法提供了安全性增强,我会在可用时使用更新的语法。如果我仍然必须操作 MySQL < 5.7.6 的安装,我会限制我在这些情况下使用旧的和不推荐/不鼓励的密码更新语法。

因此ALTER USER,@Carlos Alberto García Guardia 和 @Venkat Kotra 在他们的回答中建议的语句在我看来像是用于 MySQL >= 5.7.6 的正确语法。两个示例(改编自他们的答案和MySQL 5.7 的 ALTER USER 文档)::

ALTER USER '<username>'@'localhost'
  IDENTIFIED BY '<new_cleartext_password>';

ALTER USER '<username>'@'localhost'
  IDENTIFIED WITH <auth_plugin>
  BY '<new_cleartext_password>';

上面的第二个示例包含一个可选WITH子句来指定身份验证插件。指定的插件被写入mysql.user表的“插件”字段。有关 MySQL 身份验证插件的历史和未来的背景,我发现这些 MySQL 服务器团队博客文章很有帮助:

  1. “使用 sha256_password 插件保护 MySQL 密码”

  2. “新的默认身份验证插件:caching_sha2_password”

在回答@Tobia 的问题如何以散列格式而不是明文将新密码传递给 MySQL 时,MySQLALTER USER文档表明这是通过在语句中使用AS代替来完成的:BYALTER USER

ALTER USER '<username>'@'localhost'
  IDENTIFIED WITH <auth_plugin>
  AS '<new_hashed_password_value>';

使用ALTER USER 文档AS代替时BY,密码字符串“假定已采用身份验证插件所需的格式,并按原样存储在 mysql.user 表中。” 如果插件需要散列值,“该值必须以适合插件的格式进行散列。否则,该值不能被插件使用,并且不会发生客户端连接的正确身份验证。” ID。


当前接受的答案建议使用SET PASSWORD ... PASSWORD()语句或UPDATE语句(前者用于以明文形式传递新密码,后者用于以散列格式传递它):

SET PASSWORD 
  FOR '<username>'@'localhost' = 
  PASSWORD('<mypass_in_cleartext>');

或者

UPDATE mysql.user
  SET authentication_string='<mypass_as_hash>'
  WHERE User='<username>';

相对于当前首选的ALTER USER声明,这些声明已被弃用和/或不鼓励。

SET PASSWORD ... = PASSWORD(<cleartext>)根据SET PASSWORD 文档,“自 MySQL 5.7.6 起已弃用,并将在未来的 MySQL 版本中删除” 。

SET PASSWORD ... = 'auth_string'语法(,省略PASSWORD(str)加密功能)“不被弃用,但 ALTER USER 是帐户更改的首选语句,包括分配密码。” ID。 另请参阅 MySQL 5.7 中的删除和弃用

我们已弃用 SET PASSWORD 语法和 PASSWORD() 函数。修改了现有的 ALTER USER 语句以涵盖已弃用的功能。PASSWORD() 函数最初是作为手动更新 mysql.user 表的一种方式引入的。这通常是一个坏主意,我们希望将管理用户身份验证属性的任务专门留给使用 ALTER USER 语句,该语句自动确定应该使用哪个身份验证插件,然后相应地调整密码算法。

如手册所述,它似乎也没有日志记录UPDATE那么安全ALTER PASSWORD。该手册指出UPDATE语句按原样写入日志,对具有日志读取权限的任何人都可见。 [1] 相比之下,手册指出,当 MySQL 将ALTER USER ... IDENTIFIED BY ...语句(以及SET PASSWORD语句)写入日志时,它会重写包含的密码,因此它们“不会按字面意思显示”。 [1]

至少在大多数情况下。的文档SET PASSWORDALTER USER警告说,这些语句也可以“在某些情况下”使用可见密码进行记录,[2] 尽管可能并非在所有情况下都像UPDATE.

1:参见MySQL 5.7 密码记录手册(“特别是,mysql.user 系统表的 INSERT 或 UPDATE 语句引用文字密码被记录为原样,所以你应该避免这样的语句。(不鼓励直接修改授权表, 反正。)”)

2:参见MySQL 5.7 SET PASSWORD 文档MySQL 5.7 ALTER USER 文档


免责声明:我只是在今天阅读 MySQL 手册后分享我的解释。我还没有测试 MySQL 以什么格式记录的密码更改语句的行为。

于 2019-05-29T17:13:05.300 回答
0

这是我唯一的方法:mysql Ver 14.14 Distrib 5.7.30

UPDATE user SET authentication_string = PASSWORD('YourPassword'), password_last_changed = NULL
WHERE user.Host = 'localhost' AND user.User = 'YourUsername';
于 2020-06-21T11:57:07.563 回答
0

对于服务器版本:5.7.25 - MySQL 社区服务器 (GPL)。使用以下查询,因为密码不再有效并由 authentication_string 代替

UPDATE user SET authentication_string = PASSWORD('yourpassword'), password_last_changed = NULL
WHERE user.Host = 'localhost' AND user.User = 'username';
于 2019-03-24T10:11:06.897 回答
0

首先看你指定的mysql版本安全策略。

show variables like '%validate_password%';

如果您愿意,可以更改此政策

set variable_name=new_value;

更改适当的用户密码。

MySQL 5.7.5 及更早版本:

SET PASSWORD FOR 'user_name' = PASSWORD('new_password');

MySQL 5.7.6 及更高版本:

alter user 'user_name' identified by 'new_password';
于 2016-05-19T07:28:40.797 回答