Verschlüsseln Sie ein Passwort genauso wie mysql

15

Ich habe einen Benutzer angelegt, aber das Passwort vergessen

mysql> erstelle Benutzer 'blayo' @ '%' identifiziert mit 'right';

Welches Linux-Kommandozeilen-Tool kann das Passwort genauso verschlüsseln wie mysql 5.5?

mysql> wähle Passwort, Benutzer von mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... um sicher zu gehen, dass ich die richtige benutze

$ tool richtig
* 920018161824B14A1067A69626595E68CB8284CB
Philippe Blayo
quelle
2
Warum können Sie sich nicht einfach als Administrator anmelden und ein neues Passwort für festlegen blayo? Das ist definitiv schneller, als Billionen möglicher Zeichenkombinationen zu durchsuchen, um die richtige zu finden.
Nohillside
Bitte nicht schreiben die gleiche Frage auf mehrere Stapel Exchange - Standorte . Die DBA-Version wurde ebenfalls beantwortet, was eine Verschwendung von Aufwand ist.
Gilles 'SO- hör auf böse zu sein'

Antworten:

13

Nun, der triviale (vielleicht betrügerische ) Weg wäre:

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

Dies erzeugt ein Passwort unter Verwendung des von Ihrer Version von mysql verwendeten Passwort-Hashing-Schemas. [ EDIT : hinzugefügt -NB, die Kunst der Beseitigung der Spaltennamen und ASCII - Tabelle erhält.]

jsbillings
quelle
6
Und dabei wird Ihr glänzendes neues Passwort sowohl in Ihrem MySQL-Protokoll als auch in Ihrem Bash-Kontoprotokoll als Klartext gespeichert.
Craig
@Craig Um beides zu verhindern, können Sie ein '' (Leerzeichen) voranstellen, bevor Sie mysqles aus dem Bash-Verlauf ausblenden, und Sie können es SET sql_log_off=ON;direkt vor dem verwenden SELECT ..., um es aus dem MySQL-Protokoll auszublenden.
Murmel
1
@Murmel danke für das Update! Natürlich sollte standardmäßig kein Kennwort protokolliert werden. Sicherheit sollte immer die Standardeinstellung sein.
Craig
@Craig fair zu sein, ist dies bereits durch mysql getan (v5.7, besteht die letzte Version dieser Funktion, mit entfernt wurde v8.0.11 )) am 1. Clientside (betrifft .mysql_history) alle Anweisungen ignoriert passende *PASSWORD*und 2. server für mehrere stmts (außer SELECT). Siehe: MySQL 5.7 - Handbuch - Passwörter und Protokollierung und MySQL 5.7 - Handbuch - MySQL-Client-Protokollierung
Murmel
Das ist ein gutes Feedback! Leider gibt es immer noch einige Leute, die aus verschiedenen Gründen (ich eingeschlossen) immer noch mit MySQL-Versionen stecken bleiben, die älter als 5.7 sind.
Craig
12

Einige Einzeiler:

MySQL (möglicherweise müssen Sie -u (Benutzer) -p hinzufügen):

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'

Alle Ausgaben:

* 920018161824B14A1067A69626595E68CB8284CB

alexjhart
quelle
Vielen Dank, ich habe auf Ihre Antwort in serverfault.com/a/846281/236916
mwfearnley
@alexjhart Kann ich ein Update für den neuen Passwort-Hashing-Algorithmus für mysql 5.7.8 bekommen :)? (Vielleicht ein kleines Detail darüber, wie Sie das herausgefunden haben?)
ThorSummoner
6

Es macht mich immer noch wahnsinnig, dass es MySQL nichts ausmacht, Passwörter in der Befehlszeile und in Protokollen zu verschleiern. Und das ist der einzige Grund, warum ich eine Antwort hinzufüge, anstatt nur die Antwort von @Gilles zu kommentieren.

Also, natürlich, Sie könnten einfach als Administrator bei MySQL anmelden und ein neues Kennwort für Ihren blayo-Benutzer festlegen, wie von @patrix vorgeschlagen.

Die Standardmethode hierfür ist jedoch die Verwendung der Funktion password () von MySQL, die ein Klartext-Passwort als Argument verwendet (ernst gemeint?).

Wenn Sie dies tun, belassen Sie die Klartext-Version Ihres MySQL-Benutzerpassworts in Ihrem Bash-Verlauf und in Ihren MySQL-Protokollen, damit jeder, der Zugriff auf diese Protokolldateien hat, später darauf zugreifen kann.

Wäre es nicht besser, ein kleines Dienstprogramm zu haben, das Sie zur Eingabe des Kennworts auffordert, ohne es auf dem Bildschirm oder in Ihren Protokollen wiederzugeben, und dann den resultierenden MySQL-kompatiblen Hash bereitzustellen?

Wenn Sie also die Antwort von @ Gilles ein wenig ändern, wie wäre es mit einem kleinen Shell-Skript, das wie folgt Python verwendet. Sie können dies leicht ändern, um eine SQL-Anweisung für Ihre MySQL-Datenbank auszuführen und das Kennwort gleichzeitig festzulegen. Aber auch ohne dies zu tun, kopieren Sie den resultierenden Hash und fügen Sie ihn in eine SQL-Anweisung ein, um die Benutzertabelle zu aktualisieren:

#!/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
Craig
quelle
@HalosGhost; Worum ging es bei der Bearbeitung? Es hat sich nichts geändert? ;-)
Craig
Es erzwang die Syntaxhervorhebung (wie in der Bearbeitungszusammenfassung angegeben) und machte dies durch den tatsächlichen Text der Bearbeitung deutlich.
HalosGhost
3
Ach so. Ehrlich gesagt wusste nicht, was Sie getan hatten (Sie haben offensichtlich die <!-- language: lang-bsh -->Zeile hinzugefügt ). Praktisch! Ich mag das. Vielen Dank!
Craig
5

Noch eine mit der Shell:

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

Erläuterung:

  1. echo -n Ohne Zeilenumbruch drucken
  2. sha1sum erste SHA1
  3. xxd -r -p enthexe den Hash
  4. sha1sum zweiter SHA1
  5. tr '[a-z]' '[A-Z]' in Großbuchstaben konvertieren
  6. awk '{print "*" $1}' führend hinzufügen *

Mehr Details:

Zwischen 2. und 3. kann ein optionaler awk '{printf "%s", $1}'Schritt zum Entfernen von Zeilenumbrüchen und Bindestrichen eingefügt werden. Aber xxd wird sie trotzdem ignorieren (Danke an dave_thompson_085).

Außerdem können die Schritte 5 und 6 sofort ausgeführt werden, indem sie durch {print "*" toupper($1)}(Dank an dave_thompson_085) ersetzt werden.

Murmeln
quelle
1
awktun , um die Großbuchstaben können, und zum Ausgeben eines unvollständigen (letzten) Zeile Terminal ist incovenient: .. | sha1sum | awk '{print "*" toupper($1)}'. Und Sie brauchen sich keine Sorgen um die NL und sogar den Bindestrich auf der zu machen xxd -r -p, sie werden ignoriert.
Dave_thompson_085
4

Der Hash ist sha1 (sha1 (Passwort)) . Da es kein Salz gibt (was eine gravierende Sicherheitslücke darstellt), können Sie den Hash in einer Tabelle nachschlagen .

Mit nur POSIX-Tools plus sha1sumvon GNU coreutils oder BusyBox ist sha1 (sha1 (password)) lästig zu berechnen, da der sha1sumBefehl den Digest hexadezimal ausgibt und es kein Standard-Tool gibt, das in Binärdaten konvertiert werden kann.

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 verfügt in seinen Standardbibliotheken über Standardauszüge, sodass es sich um einen einfachen Einzeiler handelt.

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

Oder mit dem Passwort im Einzeiler:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
Gilles 'SO - hör auf böse zu sein'
quelle
Ich liebe diese Antwort im Geiste, aber sie funktioniert nicht ganz. Wenn ich die Eingabetaste drücke, möchte es weiterhin Eingaben lesen, anstatt weiterzumachen. Außerdem wird die Eingabe wieder auf dem Bildschirm angezeigt, was möglicherweise nicht wünschenswert ist. Wie wäre es aber mit so etwas? unix.stackexchange.com/a/155583/37401
Craig
@Craig Das Lesen interaktiver Eingaben liegt außerhalb des Rahmens der Frage. Ich gehe davon aus, dass das Skript bereits das Passwort hat; In der Regel wird es in einer Datei gespeichert. In seltenen Fällen wird ein Datenbankkennwort interaktiv eingegeben. Wenn Sie interaktive Eingaben lesen möchten, können Sie die readeingebaute Shell verwenden, um eine Zeile zu lesen. Führen Sie stty echozuerst aus, wenn Sie das Echo ausschalten und ssty +echowieder einschalten möchten . In Python können Sie das getpassModul verwenden.
Gilles 'SO- hör auf böse zu sein'
Ja, ich weiß ... und fair genug! Ich hasse einfach schreckliche Sicherheit, je weiter ich auf dem Weg dahin bin, und MySQL-Sicherheit ist im Allgemeinen ziemlich schrecklich. Deshalb neige ich dazu, ein wenig Sicherheitseinblick zu geben, wo immer ich die Chance dazu habe. ;-)
Craig
1

Wenn Sie einen Benutzer erstellt und das Kennwort vergessen haben, sollten Sie dies tun und es ist einfacher.

Das ist mir auch ein Dutzend Mal passiert, als ich 10 Milliarden Dinge gleichzeitig gemacht habe. Der beste Weg, mein Passwort wiederherzustellen, war:

stoppte den MySQL-Server vollständig zuerst

mysqld_safe --skip-grant-tables & ausgegeben

dann habe ich mich als root angemeldet ohne ein Passwort zu vergeben, nur mysql -u mysql-user (es lässt dich nach mysqld_safe rein)

Gehen Sie dann zur Tabelle mysql> user und aktualisieren Sie das Kennwort für den Benutzer

dann gehe zurück und starte mysql neu

Sehen Sie nach, ob das funktioniert, und lassen Sie es uns wissen.

unixmiah
quelle
Dies scheint eher der Fall zu sein, dass Sie sich überhaupt nicht anmelden können , als nur als bestimmter Benutzer.
Mwfearnley
1

Ein anderer mit der Shell

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

... welche Ausgänge:

*920018161824B14A1067A69626595E68CB8284CB
Chris Martin
quelle
0

MySQL 4.1+ verwendet doppeltes SHA1

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Dieser Algorithmus kann problemlos in andere Sprachen portiert werden. Ein Unterschied besteht darin, dass Kennwort-Hashes im Feld "Kennwort auswählen" immer mit einem "*" beginnen.

Diogo Nechtan
quelle