我不是 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
@Carlos Alberto García Guardia 和 @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 表的“插件”字段。对于 MySQL 身份验证插件的历史和未来背景,我发现这些 MySQL 服务器团队博客文章很有帮助:
"Protecting MySQL Passwords With the sha256_password Plugin"
"New Default Authentication Plugin: caching_sha2_password"
在回答@Tobia 的问题如何以散列格式而不是明文将新密码传递给 MySQL 时,MySQL ALTER USER 文档表明这是通过使用 AS 代替 @987654341 中的 BY 来完成的@声明:
ALTER USER '<username>'@'localhost'
IDENTIFIED WITH <auth_plugin>
AS '<new_hashed_password_value>';
当使用AS 而不是BY,ALTER USER documentation says 时,密码字符串“假定已采用身份验证插件所需的格式,并按原样存储在 mysql.user 表中。”如果插件需要散列值,“该值必须以适合插件的格式进行散列。否则,插件无法使用该值,并且不会发生客户端连接的正确身份验证。” 身份证。
当前接受的答案建议使用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>)“自 MySQL 5.7.6 起已弃用,并将在未来的 MySQL 版本中删除”,根据the SET PASSWORD documentation。
SET PASSWORD ... = 'auth_string' 语法(即,省略了PASSWORD(str) 加密函数)“未被弃用,但 ALTER USER 是帐户更改的首选语句,包括分配密码。” Id. 另见 Removal and Deprecation in 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 PASSWORD 和 ALTER USER 的文档警告说,“在某些情况下”[2] 也可以使用可见密码记录这些语句,尽管可能并非在所有情况下都像 UPDATE 那样明显。
1:参见MySQL 5.7 manual on password logging(“特别是,mysql.user 系统表中引用文字密码的 INSERT 或 UPDATE 语句按原样记录,因此您应该避免此类语句。(不鼓励直接修改授权表,无论如何。)”)
2:见MySQL 5.7 SET PASSWORD documentation 和MySQL 5.7 ALTER USER documentation
免责声明:我只是在今天阅读 MySQL 手册后分享我的解释。我还没有测试 MySQL 以何种格式记录哪些密码更改语句的行为。