Vimcasts Drew Neils удивительны, смотрят на этого. Это помогает мне, сделал переход от Textmate до Vim
Ну, тривиальное (возможно, обманывающий) путь должно было бы работать:
mysql -NBe "select password('right')"
Это произведет пароль с помощью любой схемы хеширования пароля версия использования mysql. [РЕДАКТИРОВАНИЕ: добавленный-NB, который избавляется от имен столбцов и искусства таблицы ASCII.]
Хеш является sha1 (sha1 (пароль)). С тех пор нет никакой соли (который является серьезным дефектом безопасности), можно искать хеш в таблице.
С просто инструментами POSIX плюс sha1sum
от GNU coreutils или BusyBox, sha1 (sha1 (пароль)) является раздражающим для вычислений потому что sha1sum
команда распечатывает обзор в шестнадцатеричном и нет никакого стандартного инструмента для преобразования в двоичный файл.
awk "$(printf %s 'right' | sha1sum |
sed -e 's/ .*//' -e 's/../, 0x&/g' \
-e 's/^/BEGIN {printf "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"/' \
-e 's/$/; exit}/')" | sha1sum
Python имеет стандартные обзоры в своих стандартных библиотеках, таким образом, это - простая острота.
printf %s 'right' |
python -c 'from hashlib import sha1; import sys; print sha1(sha1(sys.stdin.read()).digest()).hexdigest()'
Или с паролем в остроте:
python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
read
окружите встроенный для чтения строки; выполненный stty echo
сначала, если Вы хотите выключить эхо и ssty +echo
снова включать его. В Python можно использовать getpass
модуль.
– Gilles 'SO- stop being evil'
14.09.2014, 22:49
MySQL 4.1 + использование удваивает SHA1
> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB
> SELECT SHA1(UNHEX(SHA1("right")))
920018161824B14A1067A69626595E68CB8284CB
sh-3.2# php -r 'echo "*" . sha1(sha1("right", TRUE)). "\n";'
*920018161824b14a1067a69626595e68cb8284cb
Этот алгоритм может быть легко портирован на другие языки . Различие - то, что хэши пароля в "избранном пароле" всегда начинаются “*” символ.
Если Вы создали пользователя и забыли пароль, то это то, что Вы должны сделать, и это проще.
Это также происходило со мной дюжину раз, когда я делал 10 миллиардов вещей одновременно. Лучше всего я восстановил свой пароль:
остановил mysql сервер полностью сначала
выдал mysqld_safe -- skip-grant-tables &
затем я вошел в систему как root без выдачи пароля, просто mysql -u mysql-user (он позволяет вам войти после mysqld_safe)
затем зайдите в mysql > таблицу пользователей и обновите пароль пользователя
затем вернитесь и перезапустите mysql
посмотрите, работает ли это, и дайте нам знать.
До сих пор мне кажется, что MySQL не утруждает себя обработкой паролей в командной строке и в логах. И это единственная причина, по которой я добавляю ответ, а не просто комментирую ответ @Gilles.
Так что, конечно, вы могли бы просто войти в MySQL в качестве администратора и установить новый пароль для вашего пользователя blayo, как предложила @patrix.
Однако, стандартный способ сделать это - использовать функцию password() в MySQL, которая воспринимает простой текстовый пароль в качестве аргумента (серьезно?).
Если вы сделаете это, вы оставите простую текстовую версию пароля пользователя MySQL в истории ударов и в логах MySQL для последующего легкого извлечения тем, кому удастся получить доступ к этим лог-файлам.
Не лучше ли иметь небольшую утилиту, которая запрашивает пароль, без эха на экране или в логах, затем предоставить вам полученный MySQL-совместимый хэш?
Итак, немного изменив ответ @Gilles, как насчет небольшого скрипта оболочки, использующего Python, как насчет следующих вещей. Вы можете легко изменить его, чтобы запустить SQL оператор против вашей базы данных MySQL, чтобы установить пароль сразу. Но даже не заходя так далеко, просто скопируйте и вставьте полученный хэш в SQL оператор, чтобы обновить таблицу пользователей:
#!/bin/bash
mysqlpwd=$(/usr/bin/python -c 'from hashlib import sha1; import getpass; print "*" + sha1(sha1(getpass.getpass("New MySQL Password:")).digest()).hexdigest()')
echo $mysqlpwd
Некоторые однострочные:
MySQL (может потребоваться добавить -u (user) -p):
mysql -NBe "select password('right')"
Python :
python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'
Perl :
perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'
PHP :
php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'
Ruby :
ruby -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'
Весь вывод:
* 920018161824B14A1067A69626595E68CB8284CB
Еще одно использование оболочки:
echo -n 'right' | sha1sum | xxd -r -p |\
sha1sum | tr '[a-z]' '[A-Z]' | awk '{printf "*%s", $1}'
Объяснение:
echo -n
печать без разрыва строки sha1sum
первый SHA1 xxd -r -p
распаковать хэш sha1sum
второй SHA1 tr '[az]' '[AZ]'
преобразовать в верхний регистр awk '{print "*" $ 1}'
добавить начало * Подробнее:
Между 2. и 3. необязательный шаг awk '{printf "% s", $ 1}'
может быть установлен для удаления новой строки и дефиса. Но xxd все равно проигнорирует их (спасибо dave_thompson_085).
Кроме того, шаги 5 и 6 можно выполнить сразу, заменив их на {print "*" toupper ($ 1)}
(Спасибо dave_thompson_085).
Другой с использованием оболочки
echo -n 'right' | openssl sha1 -binary | openssl sha1 -hex | \
sed 's/^.* //' | \
awk '{print "*"toupper($0)}'
...который выводит:
*920018161824B14A1067A69626595E68CB8284CB
Один лайнер Python3, на случай, если кому-нибудь пригодится:
python3 -c 'from hashlib import sha1; print(f"""*{sha1(sha1("right".encode()).digest()).hexdigest().upper()}""")'
*920018161824B14A1067A69626595E68CB8284CB