在Mysql 5.7中更新用户密码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Mysql 5.7中更新用户密码相关的知识,希望对你有一定的参考价值。

我编写了一个安装脚本来使用此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的命令更改此命令?我想用散列字符串更新密码,而不是使用明确的密码。

答案

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

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

如果你想使用你的查询,只需将password更改为authentication_string,它就可以了。

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

希望这有帮助。

另一答案

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

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
另一答案

鉴于'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/

另一答案

首先查看您指定的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';
另一答案

对于服务器版本: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';
另一答案

我不是MySQL的权威,但基于MySQL目前的5.7文档,目前接受和最受欢迎的答案中的建议让我觉得不可取。 (这可能是由于时间的推移 - 问题和@ mdamia的答案都在2015年发布。)

由@ Tobia的问题链接的MySQL 5.7.6 (2015-03-09, Milestone 16) release notes说“ALTER USER现在是分配密码的首选语句。”

问题确实询问是否可以将单个命令用于MySQL 5.6和5.7,但鉴于MySQL> = 5.7.6实现的ALTER USER语法提供了安全性增强,我会在可用时使用更新的语法。如果我还是要操作MySQL

@CarlosAlbertoGarcíaGuardia和@Venkat Kotra在他们的答案中提出的ALTER USER陈述在我看来似乎是用于MySQL> = 5.7.6的正确语法。两个例子(改编自他们的答案和ALTER USER documentation for MySQL 5.7)::

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

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

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

  1. "Protecting MySQL Passwords With the sha256_password Plugin"
  2. "New Default Authentication Plugin: caching_sha2_password"

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

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

当使用AS而不是BYALTER USER documentation says时,密码字符串“假定已经采用认证插件所需的格式,并按原样存储在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>)的说法,the SET PASSWORD documentation“从MySQL 5.7.6开始被弃用,并将在未来的MySQL版本中删除”。

SET PASSWORD ... = 'auth_string'语法(即省略PASSWORD(str)加密函数)“不推荐使用,但ALTER USER是帐户更改的首选语句,包括分配密码。” Id.参见Removal and Deprecation in MySQL 5.7

We have deprecated the SET PASSWORD syntax and the PASSWORD() function. The existing ALTER USER statement is modified to cover the deprecated functionality. The PASSWORD() function was originally introduced as a way to manually update the mysql.user table. This is generally a bad idea and we want to leave the task of managing user authentication properties exclusively to using the ALTER USER statement which automatically determines which authentication plugin should be used and then adjusts the password algorithm accordingly.

如手册所述,UPDATE在测井方面似乎不如ALTER PASSWORD安全。该手册指出UPDATE语句按原样写入日志,任何对日志具有读访问权限的人都可以看到。[1]相反,手册指出,当MySQL将ALTER USER ... IDENTIFIED BY ...语句(以及SET PASSWORD语句)写入日志时,它会重写所包含的密码,因此它们“不会按字面意思显示”。[1]

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

1:请参阅MySQL 5.7 manual on password logging(“特别是,引用文字密码的mysql.user系统表的INSERT或UPDATE语句按原样记录,因此您应该避免使用这些语句。(不鼓励直接修改授权表。)” )

2:见MySQL 5.7 SET PASSWORD documentationMySQL 5.7 ALTER USER documentation


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

以上是关于在Mysql 5.7中更新用户密码的主要内容,如果未能解决你的问题,请参考以下文章

mysql错误代码1045不能登录的原因与解决方法

mysql 5.7 初始密码问题

MySQL(mysql 5.7)用户密码的管理

MySQL 5.7 密码策略

MySql 5.7中添加用户,新建数据库,用户授权,删除用户,修改密码

MySql 5.7中添加用户,新建数据库,用户授权,删除用户,修改密码