MySQL и её новая сестричка из мира СПО – MariaDB довольно сильно распространены на хостингах, да и LAMP никто не отменял – пользуются ещё. Так вот не так давно стала возникать эта ошибка. Как её чинить? В этой заметке.
MySQL – это в прошлом открытая система управления базами данных. После
покупки Sun компанией Oracle, MySQL стала принадлежать последней.
Но свободный код позволил сделать ответвление – MariaDB (нельзя было
использовать именно название «MySQL»). Потому эти базы данных и похожи.
И так и там при создании пользователя нужно указать, как будет авторизоваться
пользователь. И там и там часто пишут нечто-то следующее (с версии 5.7):
mysql> GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD 's3cr3t';
На что получают:
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
А с некоторых пор (MySQL Server 8.0) и вообще:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
И это правильно, ведь функция PASSWORD
предоставляет очень слабое хеширование:
mysql> SELECT PASSWORD('xyz123');
54fg56gs32sgi3862
Такой короткий хеш может быть причиной взлома перебором.
Вместо этого вы можете писать:
mysql> GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY 's3cr3t';
Query OK, 0 rows affected (0.00 sec)
В этом случае MySQL и MariaDB будут использовать более стойкий хеш, и ошибки не будет.
В MySQL имеется функция PASSWORD()
для получения хеша из строки с паролем, котоаря используется самим MySQL для проверки авторизации.
При добавлении пользователя с использованием этой функции и при передачи пароля открытым текстом — возникает ошибка:
MariaDB [(none)]> CREATE USER ‘ruser’@’%’ IDENTIFIED BY PASSWORD ‘password’;
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
Вариант первый — не использовать PASSWORD()
, и передать пароль открытым:
MariaDB [(none)]> GRANT USAGE ON *.* TO ‘ruser’@’%’ IDENTIFIED BY ‘password’;
Query OK, 0 rows affected (0.00 sec)
Проверяем:
MariaDB [(none)]> SHOW GRANTS FOR ‘ruser’@’%’;
+——————————————————————————————————+
| Grants for ruser@% |
+——————————————————————————————————+
| GRANT USAGE ON *.* TO ‘ruser’@’%’ IDENTIFIED BY PASSWORD ‘*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19‘ |
+——————————————————————————————————+
1 row in set (0.00 sec)
Вариант второй — таки сначала получить хеш пароля, вызвав PASSWORD()
напрямую:
MariaDB [(none)]> SELECT PASSWORD(‘password’);
+——————————————-+
| PASSWORD(‘password’) |
+——————————————-+
| *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+——————————————-+
1 row in set (0.24 sec)
И затем использовать его при добавлении пользователя:
MariaDB [(none)]> GRANT USAGE ON *.* TO ‘ruser’@’%’ IDENTIFIED BY PASSWORD ‘*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19‘;
Query OK, 0 rows affected (0.00 sec)
Обращаем внимание на *
в начале строки.
Готово.
https://github.com/midnight47/
When you creating a new user for a MySQL server with the below method sometime you may get this below error.
Ex:
mysql>grant all privileges on *.* to ‘root’@’localhost’ identified by password ‘welcome’;
«ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number»
Solution:
mysql> select password (‘welcome’);
+——————————————-+
| password (‘welcome’) |
+——————————————-+
| *DF216F57F1F2066124E1AA5491D995C3CB57E4C2 |
+——————————————-+
1 row in set (0.02 sec)
mysql>grant all privileges on *.* to ‘root’@’localhost’ identified by password ‘*DF216F57F1F2066124E1AA5491D995C3CB57E4C2’;
Query OK, 0 rows affected (0.02 sec)
mysql>flush privileges;
Query OK, 0 rows affected (0.02 sec)
Now the error gone.Try this when you are getting this error.
Better always try this below way to create MySQL user.
mysql>grant all privileges on *.* to ‘root’@’localhost’ identified by ‘welcome’;
Query OK, 0 rows affected (0.00 sec)
mysql>flush privileges;
Query OK, 0 rows affected (0.02 sec)
В MySQL имеется функция PASSWORD()
для получения хеша из строки с паролем, котоаря используется самим MySQL для проверки авторизации.
При добавлении пользователя с использованием этой функции и при передачи пароля открытым текстом — возникает ошибка:
MariaDB [(none)]> CREATE USER ‘ruser’@’%’ IDENTIFIED BY PASSWORD ‘password’;
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
Вариант первый — не использовать PASSWORD()
, и передать пароль открытым:
MariaDB [(none)]> GRANT USAGE ON *.* TO ‘ruser’@’%’ IDENTIFIED BY ‘password’;
Query OK, 0 rows affected (0.00 sec)
Проверяем:
MariaDB [(none)]> SHOW GRANTS FOR ‘ruser’@’%’;
+——————————————————————————————————+
| Grants for ruser@% |
+——————————————————————————————————+
| GRANT USAGE ON *.* TO ‘ruser’@’%’ IDENTIFIED BY PASSWORD ‘*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19’ |
+——————————————————————————————————+
1 row in set (0.00 sec)
Вариант второй — таки сначала получить хеш пароля, вызвав PASSWORD()
напрямую:
MariaDB [(none)]> SELECT PASSWORD(‘password’);
+——————————————-+
| PASSWORD(‘password’) |
+——————————————-+
| *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+——————————————-+
1 row in set (0.24 sec)
И затем использовать его при добавлении пользователя:
MariaDB [(none)]> GRANT USAGE ON *.* TO ‘ruser’@’%’ IDENTIFIED BY PASSWORD ‘*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19’;
Query OK, 0 rows affected (0.00 sec)
Обращаем внимание на *
в начале строки.
Готово.