为什么在我的 MySQL 密码中添加一个字符会将我锁定?

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 个字符 + 空终止。

https://github.com/MariaDB/server/blob/b4fb15ccd4f2864483f8644c0236e63c814c8beb/mysys/get_password.c#L155

(如果您使用不同的客户端,是否存在限制?)

  • 我们应该在 MySQL/MariaDB 客户端中打开一个文档错误。 (4认同)
  • MySQL 客户端将密码缓冲区截断为 80 个字符。前 80 个之后的任何字符都将被忽略。刚刚测试。 (4认同)
  • 不错的发现。我不知道 80 个字符的限制。 (2认同)

Mir*_*ici 5

存储的密码基于所提供密码的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)

  • 这并没有直接解决问题,而是表现出表明问题“应该”不是一件事的行为? (3认同)