Zaszyfruj hasło w taki sam sposób, jak robi to mysql


15

Utworzyłem użytkownika ... ale zapomniałem hasła

mysql> utwórz użytkownika „blayo” @ „%” identyfikowany przez „prawo”;

Które narzędzie wiersza poleceń systemu Linux może szyfrować hasło w taki sam sposób, jak robi to mysql 5.5?

mysql> wybierz Hasło, Użytkownik z mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... aby mieć pewność, że użyję właściwego

$ narzędzie w prawo
* 920018161824B14A1067A69626595E68CB8284CB

2
Dlaczego nie możesz się zalogować jako administrator i zdefiniować nowego hasła blayo? Jest to zdecydowanie szybsze niż przeglądanie bilionów możliwych kombinacji postaci, aby znaleźć właściwą.
nohillside

Odpowiedzi:


13

Cóż, trywialny (być może oszukańczy ) sposób polegałby na uruchomieniu:

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

Spowoduje to wygenerowanie hasła przy użyciu dowolnego schematu haszowania haseł używanego przez twoją wersję mysql. [ EDYCJA : dodano -NB, który pozbywa się nazw kolumn i grafiki tabeli ascii.]


6
Dzięki temu Twoje nowe hasło będzie przechowywane w postaci jawnego tekstu zarówno w dzienniku MySQL, jak i w dzienniku historii konta bash.
Craig

@Craig Aby zapobiec obu, możesz wstawić „spację” tuż przed, mysqlaby ukryć go przed historią bash, i możesz użyć SET sql_log_off=ON;tuż przed, SELECT ...aby ukryć go w dzienniku MySQL.
Murmel

1
@Murmel dzięki za aktualizację! Oczywiście powinno domyślnie nie rejestrować haseł. Bezpieczeństwo powinno zawsze być ustawieniem domyślnym.
Craig

@Craig Aby być uczciwym, jest to już zrobione przez mysql (v5.7, ostatnia wersja ta funkcja istnieje, została usunięta z v8.0.11 )) na: 1. kliencie (wpływając .mysql_history) ignorując wszystkie instrukcje pasujące *PASSWORD*i 2. po stronie serwera dla kilka stmts (oprócz SELECT). Patrz: Podręcznik MySQL 5.7 - Hasła i rejestrowanie oraz MySQL 5.7 - Podręcznik - Logowanie klienta mysql
Murmel

To dobra opinia! Niestety, wciąż istnieje sporo osób, które z różnych powodów (w tym ja) nadal utknęły przy użyciu wersji mysql starszych niż 5.7.
Craig

12

Niektóre liniowce:

MySQL (może wymagać dodania -u (użytkownik) -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";'

Rubin :

ruby -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'

Wszystkie dane wyjściowe:

* 920018161824B14A1067A69626595E68CB8284CB


Dzięki, podłączyłem się do twojej odpowiedzi na serverfault.com/a/846281/236916
mwfearnley

@alexjhart Czy mogę uzyskać aktualizację nowego algorytmu mieszania haseł mysql 5.7.8 :)? (może trochę szczegółów na temat tego, jak się tego dowiedziałeś?)
ThorSummoner

6

Nadal zastanawia mnie, że MySQL nie zawraca sobie głowy zaciemnianiem haseł w wierszu poleceń i dziennikach. I to jest jedyny powód, dla którego dodaję odpowiedź zamiast komentować odpowiedź @Gilles.

Oczywiście, że mógłbyś po prostu zalogować się jako administrator MySQL i ustawić nowe hasło dla blayo użytkownika, jak @patrix sugerowane.

Jednak standardowym sposobem na to jest użycie funkcji hasła () MySQL, która traktuje hasło w postaci zwykłego tekstu jako argument (poważnie?).

Jeśli to zrobisz, pozostawiasz wersję tekstową hasła użytkownika MySQL w swojej historii bash i w logach MySQL, w celu późniejszego łatwego wyszukiwania przez każdego, kto uzyska dostęp do tych plików dziennika.

Czy nie byłoby lepiej mieć małe narzędzie, które pytałoby o hasło, bez echa na ekranie lub w dziennikach, a następnie zapewnia wynikowy skrót zgodny z MySQL?

Tak więc, modyfikując nieco odpowiedź @ Gilles, co powiesz na mały skrypt powłoki korzystający z Pythona, jak poniżej. Możesz to łatwo zmodyfikować, aby uruchomić instrukcję SQL w bazie danych MySQL i ustawić hasło jednocześnie. Ale nawet nie posuwając się tak daleko, po prostu skopiuj i wklej wynikowy skrót do instrukcji SQL, aby zaktualizować tabelę użytkowników:

#!/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; o czym była ta edycja? Nic to nie zmieniło? ;-)
Craig

Wymusiło wyróżnianie składni (jak zauważono w podsumowaniu edycji) i stało się oczywiste dzięki samemu tekstowi edycji.
HalosGhost

3
Ah, więc. Szczerze mówiąc, nie zdawałem sobie sprawy z tego, co zrobiłeś (oczywiście dodałeś <!-- language: lang-bsh -->linię). Poręczny! Lubię to. Dzięki!
Craig

5

Jeszcze jeden za pomocą powłoki:

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

Wyjaśnienie:

  1. echo -n drukuj bez podziału linii
  2. sha1sum pierwszy SHA1
  3. xxd -r -p unhex hash
  4. sha1sum drugi SHA1
  5. tr '[a-z]' '[A-Z]' przekonwertować na wielkie litery
  6. awk '{print "*" $1}' dodaj wiodące *

Więcej szczegółów:

Między 2. a 3. można wprowadzić opcjonalny awk '{printf "%s", $1}'krok do usuwania znaku nowej linii i łącznika. Ale xxd i tak je zignoruje (dzięki dave_thompson_085).

Ponadto krok 5 i 6 można wykonać jednocześnie, zastępując je {print "*" toupper($1)}(Dzięki dave_thompson_085).


1
awkMożna wykonać wielkie litery i wyprowadzania niekompletny (ostatniej linii) do zacisku jest niewygodna: .. | sha1sum | awk '{print "*" toupper($1)}'. I nie musisz się martwić o NL, a nawet myślnik xxd -r -p, są one ignorowane.
dave_thompson_085,

4

Skrót to sha1 (sha1 (hasło)) . Ponieważ nie ma soli (co jest poważną wadą bezpieczeństwa), możesz sprawdzić skrót w tabeli .

Z tylko narzędziami POSIX plus sha1sumz GNU coreutils lub BusyBox, sha1 (sha1 (hasło)) jest denerwujące w obliczeniach, ponieważ sha1sumpolecenie wypisuje skrót w systemie szesnastkowym i nie ma standardowego narzędzia do konwersji na binarne.

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 ma standardowe skróty w swoich standardowych bibliotekach, więc jest to prosty jednowierszowy.

printf %s 'right' |
python -c 'from hashlib import sha1; import sys; print sha1(sha1(sys.stdin.read()).digest()).hexdigest()'

Lub z hasłem w jednej linijce:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'

Uwielbiam tę odpowiedź w duchu, ale nie całkiem działa. Kiedy nacisnę klawisz Enter, nadal chce czytać dane wejściowe zamiast iść dalej. Ponadto sygnał wejściowy powraca do ekranu, co może nie być pożądane. A może coś takiego? unix.stackexchange.com/a/155583/37401
Craig

@Craig Jak czytać interaktywne dane wejściowe, wykraczają poza zakres pytania. Zakładam, że skrypt ma już hasło; zazwyczaj jest przechowywany w pliku, rzadko interaktywnie wpisuje hasło do bazy danych. Jeśli chcesz czytać interaktywne dane wejściowe, możesz użyć readwbudowanej powłoki, aby odczytać wiersz; uruchom stty echonajpierw, jeśli chcesz wyłączyć echo i ssty +echowłączyć je ponownie. W Pythonie możesz użyć getpassmodułu.
Gilles „SO- przestań być zły”

Tak, wiem ... i dość uczciwie! Po prostu nienawidzę okropnego bezpieczeństwa w dalszej części drogi, a bezpieczeństwo MySQL jest ogólnie dość okropne, więc mam skłonność do szarpania kolanami, aby chcieć wprowadzić trochę wglądu w bezpieczeństwo, gdziekolwiek mam szansę. ;-)
Craig

1

Jeśli stworzyłeś skrzynkę użytkownika i zapomniałeś hasła, powinieneś to zrobić i jest to łatwiejsze.

Zdarzyło mi się to również kilkanaście razy, gdy robiłem 10 miliardów rzeczy naraz. Najlepszym sposobem na odzyskanie hasła było:

najpierw całkowicie zatrzymał serwer mysql

wydano mysqld_safe --skip-grant-tables &

następnie zalogowałem się jako root bez wydawania hasła, po prostu mysql -u mysql-user (pozwala ci się zalogować po mysqld_safe)

następnie przejdź do tabeli mysql> użytkownika i zaktualizuj hasło użytkownika

następnie wróć i ponownie uruchom mysql

sprawdź, czy to działa, i daj nam znać.


Wydaje się, że byłoby bardziej dla przypadku, że nie można zalogować się w ogóle , a nie tylko jako użytkownik konkretnego.
mwfearnley

1

Kolejny za pomocą powłoki

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

... które wyjścia:

*920018161824B14A1067A69626595E68CB8284CB

0

MySQL 4.1+ używa podwójnego SHA1

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

> SELECT SHA1(UNHEX(SHA1("right")))
920018161824B14A1067A69626595E68CB8284CB

sh-3.2# php -r 'echo "*" . sha1(sha1("right", TRUE)). "\n";'
*920018161824b14a1067a69626595e68cb8284cb

Ten algorytm można łatwo przenieść na inne języki. Różnica polega na tym, że skróty hasła w „wybierz hasło” zawsze zaczynają się od znaku „*”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.