Я видел различные методы установки паролей в MySQL, например:
GRANT USAGE ON db.* to 'dave'@'localhost' IDENTIFIED BY 'supersecretpassword');
SET PASSWORD [FOR 'dave'@'localhost'] = PASSWORD('reallysecretpassword');
UPDATE mysql.user SET PASSWORD=PASSWORD('confidentialpassword') WHERE user='dave' AND host='localhost';
Но они, похоже, включают ввод пароля в открытом виде как часть команды SQL, что вызывает паранойю по поводу таких вещей, как то, попадает ли он в мою историю команд SQL, или о том, смотрит ли кто-нибудь через мое плечо или может взглянуть на мою прокрутку терминала .
Могу ли я каким-либо образом заставить MySQL предлагать мне ввести пароль, не отображая его на экране (так же, как Unix с passwd
)?
Алгоритм хеширования паролей довольно прост и может быть воспроизведен на других языках программирования.
В соответствии с https://www.pythian.com/blog/hashing-algorithm-in-mysql-password/, в MySQL 4.1 и выше PASSWORD
функция дважды принимает (двоичный) SHA1 строки пароля, а затем возвращает его в виде шестнадцатеричной строки, перед которой стоит звездочка.
Например, в SQL:
> SELECT PASSWORD('test'), SHA1(UNHEX(SHA1('test')));
+-------------------------------------------+------------------------------------------+
| PASSWORD('test') | SHA1(UNHEX(SHA1('test'))) |
+-------------------------------------------+------------------------------------------+
| *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | 94bdcebe19083ce2a1f959fd02f964c7af4cfc29 |
+-------------------------------------------+------------------------------------------+
Использование кода MySQL на консоли лишает смысла, но вот довольно простой сценарий Python, который запрашивает пароль и генерирует из него строку пароля, совместимую с MySQL.
import hashlib, getpass
def mysql_password(p):
return '*' + hashlib.sha1( hashlib.sha1(p).digest() ).hexdigest().upper()
password = getpass.getpass()
print(mysql_password(password))
Затем это можно назначить непосредственно пользователю в MySQL:
SET PASSWORD FOR 'dave'@'localhost' = '*94BDCE...';
Таким образом, в истории консоли / MySQL можно увидеть только хэш пароля. (Это не больше, чем может увидеть любой, у кого есть доступ к mysql.user
стол.)
Так как Федерико Сьерра указывает в комментариях, вы можете использовать mysqladmin password
команда для изменения пароля для любого пользователя, под которым вы можете войти.
Раньше пароль нужно было вводить в командной строке, но, начиная с версии 5.7, если пароль не указан, запрашивается пароль.
password
Новый парольУстановите новый пароль. Это изменяет пароль на Новый пароль для учетной записи, которую вы используете с
mysqladmin
для подключения к серверу. Таким образом, в следующий раз, когда вы вызоветеmysqladmin
(или любой другой клиентской программы), используя ту же учетную запись, вам нужно будет указать новый пароль.[...]
В MySQL 5.7 новый пароль можно опустить после
password
команда. В таком случае,mysqladmin
запрашивает значение пароля, что позволяет не указывать пароль в командной строке. Пропуск значения пароля следует делать только в том случае, если пароль является последней командой наmysqladmin
командная строка. В противном случае в качестве пароля принимается следующий аргумент.
Итак, если вы можете войти в систему как пользователь (т.е. вы знаете пароль пользователя - и вы находитесь на хосте, с которого вам разрешено входить в систему), то вы можете изменить их пароль с помощью:
mysqladmin password -u <user_name> [-p]
например
$ mysqladmin password -u dave -p
Enter password:
New password:
Confirm new password:
Конечно, если у вас есть права root, вы можете сбросить пароль пользователя (и при необходимости изменить его хост), чтобы вы могли войти в систему для этого. Но это связано с риском, поэтому это не идеально.
Сценарий-оболочка на каком-то языке (я бы использовал php и запускал через cli, поскольку это было бы быстрое копирование / вставка из того, что у меня уже есть), который выполняется, затем удаляется или, по крайней мере, снова редактируется, чтобы изменить все пароли на «changeme " или похожие.