4.3.7 Задание паролей
В большинстве случаев для задания пользователей и их паролей следует
пользоваться командой GRANT
, поэтому приведенная ниже информация
предназначена для опытных пользователей. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
В примерах, приведенных в предыдущих разделах, демонстрируется важный
принцип, который заключается в следующем: при сохранении непустых паролей
с использованием операторов INSERT
или UPDATE
для их шифрования должна
применяться функция PASSWORD()
. Это делается потому, что в таблице user
пароли хранятся в зашифрованном виде, а не как простой текст. Предположим,
что мы упустили это из виду и задали пароли следующим образом:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
В результате выполнения этих команд в таблице user будет сохранено
значение пароля biscuit
в виде простого текста. Когда пользователь jeffrey
попытается подсоединиться к серверу, используя этот пароль, клиент mysql
зашифрует его при помощи функции PASSWORD()
, сгенерирует вектор
аутентификации, основанный на зашифрованном пароле и случайно выбранном
числе, полученном от сервера, и направит результат на сервер. Сервер
использует значение password
из таблицы user
(в данном случае, это
незашифрованное значение biscuit
), чтобы осуществить точно такие же
вычисления, и сравнит результаты. Результаты не совпадут, и сервер не
позволит установить соединение:
shell> mysql -u jeffrey -pbiscuit test
Access denied
Перед занесением в таблицу user
пароли необходимо зашифровывать, поэтому
оператор INSERT
должен использоваться следующим образом:
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('%','jeffrey',PASSWORD('biscuit'));
При использовании оператора SET PASSWORD
также необходимо применять
функцию PASSWORD()
:
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
Если пароль задается при помощи оператора GRANT ... IDENTIFIED BY
или
команды mysqladmin password
, нет необходимости использовать функцию
PASSWORD()
. Обе эти команды самостоятельно производят шифровку пароля,
поэтому пароль следует указывать как biscuit
, например, таким образом:
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
или
shell> mysqladmin -u jeffrey password biscuit
Примечание: Функция PASSWORD()
шифрует пароли отличным от Unix образом. Не
следует полагать, что если ваши пароли для Unix и для MySQL совпадают, то
функция PASSWORD()
выдаст точно такой же результат шифрования, как и файл
паролей Unix. See section 4.3.2 Имена пользователей MySQL и пароли.