Cifre una contraseña de la misma manera que mysql

15

He creado un usuario ... pero olvidé la contraseña

mysql> crea el usuario 'blayo' @ '%' identificado por 'right';

¿Qué herramienta de línea de comandos de Linux puede cifrar la contraseña de la misma manera que lo hace mysql 5.5?

mysql> seleccione Contraseña, Usuario de mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... para estar seguro de que uso el correcto

$ herramienta derecha
* 920018161824B14A1067A69626595E68CB8284CB
Philippe Blayo
fuente
2
¿Por qué no puede simplemente iniciar sesión como administrador y definir una nueva contraseña blayo? Eso es definitivamente más rápido que correr a través de billones de combinaciones de personajes posibles para encontrar la correcta.
nohillside
Por favor, no publicar la misma pregunta a varios sitios Pila de cambio . La versión DBA también ha sido respondida, lo cual es una pérdida de esfuerzo.
Gilles 'SO- deja de ser malvado'

Respuestas:

13

Bueno, la forma trivial (tal vez trampa ) sería correr:

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

Esto producirá una contraseña usando cualquier esquema de hash de contraseña que use su versión de mysql. [ EDITAR : agregado -NB, que elimina los nombres de columna y el arte de la tabla ascii.]

jsbillings
fuente
66
Y, de manera práctica, esto almacenará su nueva y brillante contraseña en texto claro tanto en su registro de MySQL como en el registro del historial de su cuenta bash.
Craig
@Craig Para evitar ambas cosas, puede anteponer un '' (espacio) justo antes mysqlde ocultarlo del historial de bash y puede usarlo SET sql_log_off=ON;justo antes SELECT ...para ocultarlo del registro de MySQL.
Murmel
1
@Murmel gracias por la actualización! Por supuesto, debería ser predeterminado para no registrar contraseñas. La seguridad siempre debe ser la configuración predeterminada.
Craig
@Craig Para ser justos, esto ya lo hizo mysql (v5.7, la última versión que existe esta función, se eliminó con v8.0.11 )) en: 1. el lado del cliente (que afecta .mysql_history) ignorando todas las declaraciones que coinciden *PASSWORD*y 2. el lado del servidor para varios stmts (excepto SELECT). Ver: MySQL 5.7 Manual - Contraseñas y registro y MySQL 5.7 - Manual - mysql Client Logging
Murmel
Esa es una buena respuesta! Desafortunadamente, todavía hay algunas personas que, por diversas razones (incluido yo mismo), todavía estamos atrapados usando versiones de MySQL anteriores a 5.7.
Craig
12

Algunas frases:

MySQL (puede requerir que agregue -u (usuario) -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";'

Rubí :

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

Toda la salida:

* 920018161824B14A1067A69626595E68CB8284CB

alexjhart
fuente
Gracias, he vinculado a su respuesta en serverfault.com/a/846281/236916
mwfearnley
@alexjhart ¿Puedo obtener una actualización para el nuevo algoritmo de hash de contraseña de mysql 5.7.8 :)? (¿
Tal
6

Todavía me sorprende que MySQL no se moleste en ofuscar contraseñas en la línea de comandos y en los registros. Y esa es la única razón por la que agrego una respuesta en lugar de solo comentar la respuesta de @Gilles.

Entonces, por supuesto, puede iniciar sesión en MySQL como administrador y establecer una nueva contraseña para su usuario de blayo, como sugirió @patrix.

Sin embargo, la forma estándar de hacerlo es mediante el uso de la función de contraseña () de MySQL, que toma una contraseña de texto sin formato como argumento (¿en serio?).

Si hace eso, deja la versión de texto sin formato de la contraseña de su usuario de MySQL en su historial de bash y en sus registros de MySQL, para que la recupere fácilmente más adelante quienquiera que logre acceder a esos archivos de registro.

¿No sería mejor tener una pequeña utilidad que solicite la contraseña, sin hacerla eco en la pantalla o en los registros, y luego proporcionarle el hash resultante compatible con MySQL?

Entonces, modificando la respuesta de @ Gilles solo un poco, ¿qué tal un pequeño script de shell que usa Python, como el siguiente? Puede modificar esto fácilmente para ejecutar una instrucción SQL en su base de datos MySQL para establecer la contraseña de una vez. Pero incluso sin ir tan lejos, simplemente copie y pegue el hash resultante en una instrucción SQL para actualizar la tabla de usuarios:

#!/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
fuente
@HalosGhost; ¿De qué se trataba la edición? ¿No cambió nada? ;-)
Craig
Impuso el resaltado de sintaxis (como se indica en el resumen de edición) y se hizo evidente por el texto real de la edición.
HalosGhost
3
Ah! entonces. Honestamente, no me di cuenta de lo que había hecho (obviamente agregó la <!-- language: lang-bsh -->línea). ¡Práctico! Me gusta. ¡Gracias!
Craig
5

Uno más usando el shell:

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

Explicación:

  1. echo -n imprimir sin salto de línea
  2. sha1sum primer SHA1
  3. xxd -r -p deshacer el hash
  4. sha1sum segundo SHA1
  5. tr '[a-z]' '[A-Z]' convertir a mayúsculas
  6. awk '{print "*" $1}' agregar líder *

Más detalles:

Entre 2. y 3. se awk '{printf "%s", $1}'podría insertar un paso opcional para la eliminación de líneas nuevas y guiones. Pero xxd los ignorará de todos modos (Gracias a dave_thompson_085).

Además, los pasos 5 y 6 se pueden hacer de inmediato reemplazándolos con {print "*" toupper($1)}(Gracias a dave_thompson_085).

Murmel
fuente
1
awkpuede hacer el mayúscula, y dar salida a una (última) línea incompleta a la terminal es un inconveniente: .. | sha1sum | awk '{print "*" toupper($1)}'. Y no necesita preocuparse por la NL e incluso el guión en el xxd -r -p, son ignorados.
dave_thompson_085
4

El hash es sha1 (sha1 (contraseña)) . Como no hay sal (que es un grave defecto de seguridad), puede buscar el hash en una tabla .

Con solo las herramientas POSIX plus sha1sumde GNU coreutils o BusyBox, es molesto calcular sha1 (sha1 (contraseña)) porque el sha1sumcomando imprime el resumen en hexadecimal y no hay una herramienta estándar para convertir a binario.

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 tiene resúmenes estándar en sus bibliotecas estándar, por lo que es una línea simple.

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

O con la contraseña dentro del one-liner:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
Gilles 'SO- deja de ser malvado'
fuente
Me encanta esta respuesta en espíritu, pero no funciona del todo. Cuando presiono la tecla Intro, todavía quiere seguir leyendo la entrada en lugar de seguir adelante. Además, la entrada vuelve a la pantalla, lo que puede no ser deseable. ¿Qué tal algo como esto, sin embargo? unix.stackexchange.com/a/155583/37401
Craig
@Craig Cómo leer la entrada interactiva está más allá del alcance de la pregunta. Supongo que el script ya tiene la contraseña; generalmente se almacena en un archivo, es raro escribir una contraseña de base de datos de forma interactiva. Si desea leer la entrada interactiva, puede usar el readshell incorporado para leer una línea; ejecute stty echoprimero si desea desactivar el eco y ssty +echovolver a activarlo. En Python, puedes usar el getpassmódulo.
Gilles 'SO- deja de ser malvado'
Sí, lo sé ... y justo! Simplemente odio la seguridad horrible a medida que avanzo en el camino, y la seguridad de MySQL es bastante horrible en general, por lo que tengo esta tendencia instintiva a querer inyectar un poco de información de seguridad cada vez que tengo la oportunidad. ;-)
Craig
1

Si creó un usuario y olvidó la contraseña, esto es lo que debe hacer y es más fácil.

Esto también me sucedió una docena de veces mientras hacía 10 mil millones de cosas a la vez. La mejor manera de recuperar mi contraseña fue:

detuvo el servidor mysql completamente primero

emitió mysqld_safe --skip-grant-tables &

luego inicié sesión como root sin emitir una contraseña, solo mysql -u mysql-user (te deja entrar después de mysqld_safe)

luego vaya a la tabla mysql> user y actualice la contraseña para el usuario

luego regrese y reinicie mysql

A ver si eso funciona y háganos saber.

unixmiah
fuente
Parece que sería más para el caso de que no pueda iniciar sesión en absoluto , en lugar de solo como un usuario específico.
mwfearnley
1

Otro usando el caparazón

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

... que produce:

*920018161824B14A1067A69626595E68CB8284CB
Chris Martin
fuente
0

MySQL 4.1+ usa SHA1 doble

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Este algoritmo se puede portar fácilmente a otros idiomas. La diferencia es que los hashes de contraseña en la "contraseña seleccionada" siempre comienzan con un carácter "*".

Diogo Nechtan
fuente