Isa*_*aac 11 mysql password-management mariadb
我可以通过以下方式登录mysql -u myuser -p mydb -h localhost:
grant all privileges on mydb.* to myuser@'%' identified by
'1234567890123456789012345678901234567890123456789012345678901234567890123456789';
Run Code Online (Sandbox Code Playgroud)
但不是在我这样做之后:
grant all privileges on mydb.* to myuser@'%' identified by
'12345678901234567890123456789012345678901234567890123456789012345678901234567890';
Run Code Online (Sandbox Code Playgroud)
数据库密码的 79 个字符的硬限制来自哪里?
Håk*_*ist 31
正如 Mircea Vutcovici 所涵盖的那样,密码仅在散列后存储,这意味着它在存储时将具有固定长度。
即,不明显应该有这样的限制。
我相信遇到的可能是mysql 客户端应用程序专门施加的限制。
该get_tty_password函数似乎将密码读入char buff[80];,这意味着 79 个字符 + 空终止。
(如果您使用不同的客户端,是否存在限制?)
存储的密码基于所提供密码的SHA-1哈希字符串。它们不是加密的,而是散列的。这意味着所有密码在 mysql.user 表中具有相同的长度。
MariaDB [(none)]> grant all privileges on mydb.* to myuser@'%' identified by '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> select host, user, password from mysql.user where user='myuser';
+------+--------+-------------------------------------------+
| host | user | password |
+------+--------+-------------------------------------------+
| % | myuser | *B3E74714C91FEC20BA4D5225155437727FBFD6CE |
+------+--------+-------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> select password('12345678901234567890123456789012345678901234567890123456789012345678901234567890') ;
+----------------------------------------------------------------------------------------------+
| password('12345678901234567890123456789012345678901234567890123456789012345678901234567890') |
+----------------------------------------------------------------------------------------------+
| *B3E74714C91FEC20BA4D5225155437727FBFD6CE |
+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> SELECT UPPER(SHA1(UNHEX(SHA1("12345678901234567890123456789012345678901234567890123456789012345678901234567890"))));
+--------------------------------------------------------------------------------------------------------------+
| UPPER(SHA1(UNHEX(SHA1("12345678901234567890123456789012345678901234567890123456789012345678901234567890")))) |
+--------------------------------------------------------------------------------------------------------------+
| B3E74714C91FEC20BA4D5225155437727FBFD6CE |
+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
Run Code Online (Sandbox Code Playgroud)
将存储的散列与如上计算的散列进行比较:
select host, user, password from mysql.user;
Run Code Online (Sandbox Code Playgroud)
对于“本地主机”,您需要添加:
grant all privileges on mydb.* to myuser@'localhost' identified by '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
Run Code Online (Sandbox Code Playgroud)
您也需要添加此授权,因为 '%' 与 'localhost' 连接不匹配。
要连接,您需要在命令行中提供密码以克服 @Håkan Lindqvist 在 MySQL 客户端中提到的 80 个字符限制。
mysql -u myuser -p12345678901234567890123456789012345678901234567890123456789012345678901234567890 mydb
Run Code Online (Sandbox Code Playgroud)