我见过在 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 开始,如果省略密码,则会提示输入密码。
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 权限,您可以重置用户密码(并在必要时更改其主机),以便您登录执行此操作。但这有其自身的风险,因此并不理想。