我不是 MySQL 权威,但根据 MySQL 当前的 5.7 文档,当前接受且最受好评的答案中的建议让我觉得不明智。(这可能是由于时间的流逝——问题和@mdamia 的答案都是在 2015 年发布的。)
@Tobia 的问题链接的MySQL 5.7.6(2015-03-09,里程碑 16)发行说明说“ALTER USER 现在是分配密码的首选语句。”
该问题确实询问是否可以将单个命令用于 MySQL 5.6 和 5.7,但鉴于ALTER USER
MySQL >= 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 服务器团队博客文章很有帮助:
“使用 sha256_password 插件保护 MySQL 密码”
“新的默认身份验证插件:caching_sha2_password”
在回答@Tobia 的问题如何以散列格式而不是明文将新密码传递给 MySQL 时,MySQLALTER USER
文档表明这是通过在语句中使用AS
代替来完成的:BY
ALTER 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 PASSWORD
并ALTER USER
警告说,这些语句也可以“在某些情况下”使用可见密码进行记录,[2] 尽管可能并非在所有情况下都像UPDATE
.
1:参见MySQL 5.7 密码记录手册(“特别是,mysql.user 系统表的 INSERT 或 UPDATE 语句引用文字密码被记录为原样,所以你应该避免这样的语句。(不鼓励直接修改授权表, 反正。)”)
2:参见MySQL 5.7 SET PASSWORD 文档和MySQL 5.7 ALTER USER 文档
免责声明:我只是在今天阅读 MySQL 手册后分享我的解释。我还没有测试 MySQL 以什么格式记录的密码更改语句的行为。