В mysql server 8.0 функция пароль не работает

Ошибка при выполнении функции PASSWORD в MySQL Server версии 8.0.12

У меня такой запрос:

SELECT * 
FROM users 
WHERE login = 'FABIO' 
  AND pwd = PASSWORD('2018') 
LIMIT 0, 50000

Я получаю эту ошибку:

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

Какая у вас версия mysql?

Madhur Bhaiya 13.09.2018 21:33

Вы уверены, что в строке запроса ничего не предшествует select?

Uueerdo 13.09.2018 21:34

Версия сервера @MadhurBhaiya mysql - 8.0.12

Fabio C 13.09.2018 21:35

@FabioC Эта функция не существует в MySQL версии 8.0

Madhur Bhaiya 13.09.2018 21:36

В любом случае вам не следовало использовать функцию PASSWORD () для собственных паролей. В руководстве для этой функции годами говорилось, что она предназначена для использования только системными таблицами MySQL. Вместо этого используйте SHA2 ().

Bill Karwin 13.09.2018 21:43

Bcrypt - это текущий отраслевой стандарт хеширования паролей. SHA2 задуман как алгоритм быстрого хеширования, и, скорее всего, bcrypt выдержит испытание временем. Кроме того, он выполняет посев, поэтому вам не нужно об этом думать.

Evert 16.02.2020 00:19
19
6
21 887
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Версия MySQL Server OP - 8.0.12. Начиная с Документация MySQL, функция ПАРОЛЬ устарела для версия> 5.7.5:

Note

The information in this section applies fully only before MySQL 5.7.5, and only for accounts that use the mysql_native_password or mysql_old_password authentication plugins. Support for pre-4.1 password hashes was removed in MySQL 5.7.5. This includes removal of the mysql_old_password authentication plugin and the OLD_PASSWORD() function. Also, secure_auth cannot be disabled, and old_passwords cannot be set to 1.

As of MySQL 5.7.5, only the information about 4.1 password hashes and the mysql_native_password authentication plugin remains relevant.

Вместо функции PASSWORD вы можете использовать гораздо лучшие и безопасные функции шифрования из здесь. Более подробную информацию от команды сервера MySQL можно увидеть в здесь.

Вот официальная ссылка, в которой говорится, что он был фактически удален здесь

Uueerdo 13.09.2018 21:39

- Вы знаете, что поставили вместо ПАРОЛЯ?

Fabio C 13.09.2018 21:47

@FabioC проверьте мой обновленный ответ внизу. Я дал две ссылки. Вместо этого были добавлены гораздо более продвинутые функции шифрования.

Madhur Bhaiya 13.09.2018 21:49

@MadhurBhaiya Я сейчас читаю этот документ. И я собираюсь использовать новый способ. Большое тебе спасибо.

Fabio C 13.09.2018 21:56

Если вам нужен замещающий хеш, соответствующий функции password (), используйте это: SHA1 (UNHEX (SHA1 ())); Например.

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

и замена, дающая тот же ответ в версии 8:

mysql> SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))));
+-------------------------------------------------+
| CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass'))))) |
+-------------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4       |
+-------------------------------------------------+

Почему голос против? Это отвечает на вопрос людям, которые ищут замену ПАРОЛЮ, когда они заблокированы в определенных версиях, находящихся вне их контроля.

rayzinnz 30.03.2020 19:46

А как насчет звездочки в начале? ВЫБРАТЬ СЦЕПИТЬ ('*', ВЕРХНИЙ (SHA1 (UNHEX (SHA1 ('mypass')))))

MrBlack 22.04.2020 10:17

В MySQL 8.0.22 мне пришлось сделать следующее:

  1. обновите /etc/mysql/my.cnf и добавьте строки:

     [mysqld]
    
     skip-grant-tables
    
  2. перезапустите mysql и выполните несколько запросов:

     > systemctl restart mysql
     > sudo mysql
     mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
     FLUSH PRIVILEGES;
     mysql> exit;
    
  3. войдите снова и обновите пароль:

     > mysql -u root
     mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'dbtastic5332';
     mysql> FLUSH PRIVILEGES;
    
  4. обновите /etc/mysql/my.cnf и удалите строку skip-grant-tables

     > systemctl restart mysql
    
  5. Наконец, протестируем

     > mysql -u root -p 
    

вы можете создать другую функцию, похожую на ПАРОЛЬ

SET GLOBAL log_bin_trust_function_creators = 1;
delimiter $$
CREATE FUNCTION PASSWORD2 (pass_in varchar(50)) RETURNS varchar(50)
BEGIN
  declare n_pass varchar(50);
  set n_pass = CONCAT('*', UPPER(SHA1(UNHEX(SHA1(pass_in))))); 
  return n_pass;
END$$

потом

SELECT PASSWORD2("my_super_scret_password") FROM MyUserTable ....

Другие вопросы по теме