如何才能更改 MySQL 用户密码而不在控制台上直接输入?

如何才能更改 MySQL 用户密码而不在控制台上直接输入?

我见过在 MySQL 中设置密码的各种方法,例如:

GRANT USAGE ON db.* to 'dave'@'localhost' IDENTIFIED BY 'supersecretpassword');
SET PASSWORD [FOR 'dave'@'localhost'] = PASSWORD('reallysecretpassword');
UPDATE mysql.user SET PASSWORD=PASSWORD('confidentialpassword') WHERE user='dave' AND host='localhost';

但它们似乎涉及在 SQL 命令中以明文形式输入密码,这引起了一些担忧,比如它是否会出现在我的 SQL 命令历史记录中,或者是否有人在监视我或可以偷看我的终端回滚。

有没有什么办法可以让 MySQL 提示我输入密码,而不将其显示到屏幕上(与 Unix 的做法相同passwd)?

答案1

密码哈希算法相当简单,并且可以在其他编程语言中复制。

根据https://www.pythian.com/blog/hashing-algorithm-in-mysql-password/在 MySQL 4.1 及更高版本中,该PASSWORD函数两次获取密码字符串的 (二进制) SHA1,然后将其作为前面带有星号的十六进制字符串返回。

例如,在 SQL 中:

> SELECT PASSWORD('test'), SHA1(UNHEX(SHA1('test')));
+-------------------------------------------+------------------------------------------+
| PASSWORD('test')                          | SHA1(UNHEX(SHA1('test')))                |
+-------------------------------------------+------------------------------------------+
| *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | 94bdcebe19083ce2a1f959fd02f964c7af4cfc29 |
+-------------------------------------------+------------------------------------------+

在控制台上使用 MySQL 代码会失去目的,但这里有一个相当简单的 Python 脚本,它提示输入密码并从中生成与 MySQL 兼容的密码字符串。

import hashlib, getpass

def mysql_password(p):
    return '*' + hashlib.sha1( hashlib.sha1(p).digest() ).hexdigest().upper()

password = getpass.getpass()

print(mysql_password(password))

然后可以将其直接分配给 MySQL 中的用户:

SET PASSWORD FOR 'dave'@'localhost' = '*94BDCE...';

因此,控制台/MySQL 历史记录中只显示密码哈希。(只有有权访问该mysql.user表的人才能看到它。)

答案2

某种语言的包装脚本(我会使用 php 并通过 cli 运行,因为它可以从我已有的东西中快速复制/粘贴)被执行,然后删除,或者至少再次编辑以将所有密码更改为“changeme”或类似的。

答案3

作为费德里科·谢拉在评论中指出,您可以使用mysqladmin password命令来更改您可以登录的任何用户的密码。

以前,必须在命令行上提供密码,但是从 5.7 开始,如果省略密码,则会提示输入密码。

来自mysqladmin 文档

password 新密码

设置新密码。这会将密码更改为新密码指定您用于连接服务器的帐户mysqladmin。因此,下次您mysqladmin使用同一帐户调用(或任何其他客户端程序)时,您将需要指定新密码。

[...]

在 MySQL 5.7 中,可以在命令后省略新密码password。在这种情况下,mysqladmin会提示输入密码值,这样您就可以避免在命令行上指定密码。仅当密码是命令行上的最后一个命令时,才应省略密码值mysqladmin。否则,下一个参数将被视为密码。

因此,如果您可以以用户身份登录(即,您知道用户的密码 - 并且您在允许登录的主机上) - 那么您可以使用以下方法更改他们的密码:

mysqladmin password -u <user_name> [-p]

例如

$ mysqladmin password -u dave -p
Enter password: 
New password: 
Confirm new password: 

当然,如果您有 root 权限,您可以重置用户密码(并在必要时更改其主机),以便您登录执行此操作。但这有其自身的风险,因此并不理想。

相关内容