Crypter un mot de passe de la même manière que mysql

15

J'ai créé un utilisateur ... mais j'ai oublié le mot de passe

mysql> créer l'utilisateur 'blayo' @ '%' identifié par 'right';

Quel outil de ligne de commande Linux peut crypter le mot de passe de la même manière que mysql 5.5?

mysql> sélectionnez Mot de passe, Utilisateur dans mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... pour être sûr d'utiliser le bon

$ tool right
* 920018161824B14A1067A69626595E68CB8284CB
Philippe Blayo
la source
2
Pourquoi ne pouvez-vous pas simplement vous connecter en tant qu'administrateur et définir un nouveau mot de passe pour blayo? C'est définitivement plus rapide que de parcourir des milliers de milliards de combinaisons de caractères possibles pour trouver la bonne.
nohillside
Veuillez ne pas publier la même question sur plusieurs sites Stack Exchange . La version DBA a également été répondue, ce qui est un gaspillage d'effort.
Gilles 'SO- arrête d'être méchant'

Réponses:

13

Eh bien, la façon la plus banale (peut-être de tricher ) serait d'exécuter:

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

Cela produira un mot de passe en utilisant le schéma de hachage de mot de passe utilisé par votre version de mysql. [ EDIT : ajout de -NB, qui supprime les noms des colonnes et l'art du tableau ascii.]

jsbillings
la source
6
De plus, cela stockera votre nouveau mot de passe brillant en texte clair à la fois dans votre journal MySQL et dans votre journal d'historique de compte bash.
Craig
@Craig Pour éviter les deux, vous pouvez ajouter un '' (espace) juste avant le mysqlpour le cacher de l'historique bash et vous pouvez utiliser SET sql_log_off=ON;juste avant le SELECT ...pour le cacher du journal MySQL.
Murmel
1
@Murmel merci pour la mise à jour! Bien sûr, il devrait par défaut ne pas enregistrer les mots de passe. La sécurité doit toujours être le paramètre par défaut.
Craig
@Craig Pour être honnête, cela est déjà fait par mysql (v5.7, la dernière version de cette fonction existe, a été supprimée avec la v8.0.11 )) sur: 1. côté client (affectant .mysql_history) en ignorant toutes les instructions correspondant *PASSWORD*et 2. côté serveur pour plusieurs stmts (sauf SELECT). Voir: Manuel MySQL 5.7 - Mots de passe et journalisation et MySQL 5.7 - Manuel - Journalisation client mysql
Murmel
C'est une bonne rétroaction! Malheureusement, il y a encore pas mal de gens qui, pour diverses raisons (moi y compris), sont toujours bloqués en utilisant des versions de mysql antérieures à 5.7.
Craig
12

Quelques one-liners:

MySQL (peut nécessiter que vous ajoutiez -u (utilisateur) -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";'

Rubis :

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

Toutes les sorties:

* 920018161824B14A1067A69626595E68CB8284CB

alexjhart
la source
Merci, j'ai lié à votre réponse dans serverfault.com/a/846281/236916
mwfearnley
@alexjhart Puis-je obtenir une mise à jour pour le nouvel algorithme de hachage de mot de passe mysql 5.7.8 :)? (peut-être aussi un petit détail sur la façon dont vous avez découvert cela?)
ThorSummoner
6

Cela me fait toujours penser que MySQL ne dérange pas de masquer les mots de passe sur la ligne de commande et dans les journaux. Et c'est la seule raison pour laquelle j'ajoute une réponse plutôt que de simplement commenter la réponse @Gilles.

Donc, bien sûr, vous pouvez simplement vous connecter à MySQL en tant qu'administrateur et définir un nouveau mot de passe pour votre utilisateur blayo, comme l'a suggéré @patrix.

Cependant, la façon standard de le faire est d'utiliser la fonction password () de MySQL, qui prend un mot de passe en texte brut comme argument (sérieusement?).

Si vous faites cela, vous laissez la version en clair du mot de passe de votre utilisateur MySQL dans votre historique bash et dans vos journaux MySQL, pour une récupération facile plus tard par quiconque parvient à accéder à ces fichiers journaux.

Ne serait-il pas préférable d'avoir un petit utilitaire qui demanderait le mot de passe, sans l'écho à l'écran ou à vos journaux, puis vous fournirait le hachage compatible MySQL résultant?

Donc, en modifiant un peu la réponse de @ Gilles, que diriez-vous d'un petit script shell qui utilise Python, comme le suivant. Vous pouvez facilement modifier cela pour exécuter une instruction SQL sur votre base de données MySQL pour définir le mot de passe en une seule fois. Mais même sans aller aussi loin, copiez et collez simplement le hachage résultant dans une instruction SQL pour mettre à jour la table des utilisateurs:

#!/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
la source
@HalosGhost; quel était le montage? Ça n'a rien changé? ;-)
Craig
Il a imposé la coloration syntaxique (comme indiqué dans le résumé de l'édition) et rendu évident par le texte réel de l'édition.
HalosGhost
3
Ah donc. Honnêtement, je ne savais pas ce que vous aviez fait (vous avez évidemment ajouté la <!-- language: lang-bsh -->ligne). Pratique! Je l'aime. Merci!
Craig
5

Un de plus en utilisant le shell:

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

Explication:

  1. echo -n imprimer sans saut de ligne
  2. sha1sum premier SHA1
  3. xxd -r -p décoiffer le hachage
  4. sha1sum deuxième SHA1
  5. tr '[a-z]' '[A-Z]' convertir en majuscules
  6. awk '{print "*" $1}' ajouter un interligne *

Plus de détails:

Entre 2. et 3. une awk '{printf "%s", $1}'étape facultative pourrait être introduite pour la suppression des sauts de ligne et des traits d'union. Mais xxd les ignorera quand même (Merci à dave_thompson_085).

De plus, les étapes 5 et 6 peuvent être effectuées {print "*" toupper($1)}simultanément en les remplaçant par (Merci à dave_thompson_085).

Murmel
la source
1
awkpeut faire la majuscule, et délivrer en sortie une ligne incomplète (dernier) à la borne est incovenient: .. | sha1sum | awk '{print "*" toupper($1)}'. Et vous n'avez pas à vous soucier de la NL et même du trait d'union xxd -r -p, ils sont ignorés.
dave_thompson_085
4

Le hachage est sha1 (sha1 (mot de passe)) . Puisqu'il n'y a pas de sel (ce qui est un grave défaut de sécurité), vous pouvez rechercher le hachage dans une table .

Avec seulement les outils POSIX plus sha1sumde GNU coreutils ou BusyBox, sha1 (sha1 (mot de passe)) est ennuyeux à calculer car la sha1sumcommande imprime le résumé en hexadécimal et il n'y a pas d'outil standard pour convertir en binaire.

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 a des résumés standard dans ses bibliothèques standard, c'est donc un simple liner.

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

Ou avec le mot de passe à l'intérieur du one-liner:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
Gilles 'SO- arrête d'être méchant'
la source
J'adore cette réponse dans l'esprit, mais elle ne fonctionne pas tout à fait. Lorsque j'appuie sur la touche Entrée, il souhaite toujours continuer à lire l'entrée au lieu de continuer. De plus, l'entrée retentit à l'écran, ce qui n'est peut-être pas souhaitable. Mais qu'en est-il de quelque chose comme ça? unix.stackexchange.com/a/155583/37401
Craig
@Craig Comment lire une entrée interactive dépasse le cadre de la question. Je suppose que le script a déjà le mot de passe; il est généralement stocké dans un fichier, il est rare de taper un mot de passe de base de données de manière interactive. Si vous souhaitez lire une entrée interactive, vous pouvez utiliser le readshell intégré pour lire une ligne; exécutez d' stty echoabord si vous souhaitez désactiver l'écho et ssty +echole réactiver. En Python, vous pouvez utiliser le getpassmodule.
Gilles 'SO- arrête d'être méchant'
Ouais, je sais ... et assez juste! Je déteste horriblement la sécurité plus loin sur la route, et la sécurité MySQL est assez horrible en général, j'ai donc cette tendance instable à vouloir injecter un peu de sécurité chaque fois que j'en ai l'occasion. ;-)
Craig
1

Si vous avez créé un utilisateur et oublié le mot de passe, c'est ce que vous devez faire et c'est plus facile.

Cela m'est également arrivé une douzaine de fois alors que je faisais 10 milliards de choses à la fois. La meilleure façon de récupérer mon mot de passe était:

arrêté le serveur mysql complètement en premier

a publié mysqld_safe --skip-grant-tables &

puis je me suis connecté en tant que root sans émettre de mot de passe, juste mysql -u mysql-user (il vous laisse entrer après mysqld_safe)

puis allez dans la table mysql> user et mettez à jour le mot de passe de l'utilisateur

puis revenez en arrière et redémarrez mysql

voir si cela fonctionne et faites le nous savoir.

unixmiah
la source
Il semble que ce serait plus pour le cas où vous ne pouvez pas vous connecter du tout , plutôt que simplement en tant qu'utilisateur spécifique.
mwfearnley
1

Un autre utilisant la coquille

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

... qui produit:

*920018161824B14A1067A69626595E68CB8284CB
Chris Martin
la source
0

MySQL 4.1+ utilise le double SHA1

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Cet algorithme peut être facilement porté dans d'autres langues. Une différence est que les hachages de mot de passe dans le "mot de passe sélectionné" commencent toujours par un caractère "*".

Diogo Nechtan
la source