Зашифруйте пароль так само, як і mysql


15

Я створив користувача ... але забув пароль

mysql> створити користувача 'blayo' @ '%', ідентифікований 'правим';

Який інструмент командного рядка Linux може зашифрувати пароль так само, як це робить mysql 5.5?

mysql> виберіть пароль, користувача з mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | блайо |

... щоб бути впевненим, я використовую правильний

$ інструмент право
* 920018161824B14A1067A69626595E68CB8284CB

2
Чому ви не можете просто увійти як адміністратор і визначити новий пароль для blayo? Це, безумовно, швидше, ніж пробіг через трильйони можливих комбінацій символів, щоб знайти потрібну.
nohillside

Відповіді:


13

Ну, тривіальним (можливо, обманом ) способом було б бігти:

mysql -NBe "select password('right')"

Це створить пароль, використовуючи будь-яку схему хешування паролів, яку використовує ваша версія mysql. [ EDIT : додано -NB, що позбавляється від назв стовпців та таблиці таблиць ascii.]


6
І, що зручно, це збереже ваш новий блискучий новий пароль в чистому тексті як у вашому журналі MySQL, так і в журналі журналу історії ваших рахунків.
Крейг

@Craig Щоб запобігти обом, ви можете додати '' (пробіл) прямо перед тим, mysqlщоб сховати його від історії башів, і ви можете використовувати SET sql_log_off=ON;прямо перед тим, SELECT ...щоб сховати його з журналу MySQL.
Мурмель

1
@Murmel дякую за оновлення! Звичайно, він повинен за замовчуванням не реєструвати паролі. Безпека завжди повинна бути типовою настройкою.
Крейг

@Craig Якщо справедливо, це вже робиться mysql (v5.7, остання версія цієї функції існує, видалено з v8.0.11 )) на: 1. clientide (впливає .mysql_history) ігноруючи всі відповідність заяв *PASSWORD*та 2. на стороні сервера для кілька stmts (крім SELECT). Дивіться: Посібник MySQL 5.7 - Паролі та журнал та MySQL 5.7 - Посібник - Реєстрація клієнтів mysql
Murmel

Це хороший відгук! На жаль, є ще досить багато людей, які з різних причин (включаючи мене) досі застрягли, використовуючи версії mysql, старші за 5.7.
Крейг

12

Деякі однопланові лайнери:

MySQL (може знадобитися додати -u (user) -p):

mysql -NBe "select password('right')"

Пітон :

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


Дякую, я зв’язав вашу відповідь на сервері defaultfault.com/a/846281/236916
mwfearnley

@alexjhart Чи можу я отримати оновлення для нового алгоритму хешування паролів mysql 5.7.8 :)? (можливо, трохи детальніше про те, як ви це також дізналися?)
ThorSummoner

6

Це все ще наштовхує на думку, що MySQL не турбує обдумування паролів у командному рядку та в журналах. І це єдина причина, що я додаю відповідь, а не просто коментую відповідь @Gilles.

Отже, звичайно, ви можете просто увійти в MySQL як адміністратор і встановити новий пароль для вашого користувача blayo, як запропонував @patrix.

Однак стандартний спосіб зробити це за допомогою функції пароля () 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

@HalosGhost; про що було редагувати? Це нічого не змінило? ;-)
Крейг

Це примусово виділило синтаксис (як зазначено в резюме редагування) і стало очевидним фактичним текстом редагування.
HalosGhost

3
Ага, так. Чесно не зрозумів, що ти зробив (ти, очевидно, додав <!-- language: lang-bsh -->рядок). Зручно! Мені це подобається. Спасибі!
Крейг

5

Ще один за допомогою оболонки:

echo -n 'right' | sha1sum | xxd -r -p |\
sha1sum | tr '[a-z]' '[A-Z]' | awk '{printf "*%s", $1}'

Пояснення:

  1. echo -n друк без розриву рядків
  2. sha1sum перший SHA1
  3. xxd -r -p зніміть хеш
  4. sha1sum другий SHA1
  5. tr '[a-z]' '[A-Z]' перетворити у великі регістри
  6. awk '{print "*" $1}' додати ведучий *

Детальніше:

Між 2. та 3. необов'язковий awk '{printf "%s", $1}'крок може бути введений для видалення нових рядків та дефісів. Але xxd їх все одно ігнорує (Завдяки dave_thompson_085).

Крім того, кроки 5 і 6 можна зробити відразу, замінивши їх на {print "*" toupper($1)}(Завдяки dave_thompson_085).


1
awkможе зробити великі літери, і висновок неповної (останню) лінії термінал incovenient: .. | sha1sum | awk '{print "*" toupper($1)}'. І вам не потрібно турбуватися про НЛ та навіть дефіс на xxd -r -p, вони ігноруються.
dave_thompson_085

4

Хеш - sha1 (sha1 (пароль)) . Оскільки солі немає (що є серйозним недоліком безпеки), ви можете шукати хеш у таблиці .

За допомогою лише інструментів POSIX плюс sha1sumGNU 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()'

Я люблю цю відповідь духом, але це не зовсім працює. Коли я натискаю клавішу введення, вона все ще хоче продовжувати вводити читання, а не рухатися далі. Крім того, вхід повторюється на екран, що може виявитися небажаним. Як щодо цього подібного? unix.stackexchange.com/a/155583/37401
Craig

@Craig Як читати інтерактивне введення не виходить за межі питання. Я припускаю, що сценарій вже має пароль; Зазвичай він зберігається у файлі, рідко вводити пароль бази даних інтерактивно. Якщо ви хочете прочитати інтерактивне введення, ви можете використовувати readвбудовану оболонку для читання рядка; запустіть stty echoспочатку, якщо ви хочете вимкнути ехо і ssty +echoповернути його знову. У Python ви можете використовувати getpassмодуль.
Жил 'ТАК - перестань бути злим'

Так, я знаю ... і досить справедливо! Я просто ненавиджу жахливу безпеку далі в дорозі, якою я йду, і безпека MySQL взагалі досить жахлива, тому у мене є така тенденція, коли я хочу ввести трохи розуміння безпеки, де б я не отримав шанс. ;-)
Крейг

1

Якщо ви створили користувача і забули пароль, це вам слід зробити, і це простіше.

Це теж траплялося зі мною десяток разів, поки я робив 10 мільярдів речей одночасно. Найкращий спосіб відновлення пароля:

повністю зупинив сервер mysql спочатку

видано mysqld_safe --skip-grant-table &

потім я ввійшов як root без виходу пароля, просто mysql -u mysql-user (він дозволяє вам увійти після mysqld_safe)

потім перейдіть до таблиці mysql> користувача та оновіть пароль для користувача

потім поверніться та перезапустіть mysql

подивіться, чи це працює, і повідомте нам про це.


Це здається , що було б в тому випадку, ви не можете увійти на всіх , а не тільки як користувач конкретного.
mwfearnley

1

Інший за допомогою оболонки

echo -n 'right' | openssl sha1 -binary | openssl sha1 -hex | \
    awk '{print "*"toupper($0)}'

... яка виводить:

*920018161824B14A1067A69626595E68CB8284CB

0

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

Цей алгоритм можна легко перенести на інші мови. Різниця полягає в тому, що хеші паролів у "виділити пароль" завжди починаються із символу "*".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.