Crittografa una password come fa mysql


15

Ho creato un utente ... ma ho dimenticato la password

mysql> crea l'utente 'blayo' @ '%' identificato da 'right';

Quale strumento da riga di comando di Linux può crittografare la password nello stesso modo di mysql 5.5?

mysql> seleziona Password, Utente da mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... per essere sicuro di usare quello giusto

$ strumento giusto
* 920018161824B14A1067A69626595E68CB8284CB

2
Perché non puoi semplicemente accedere come amministratore e definire una nuova password per blayo? È decisamente più veloce che passare attraverso trilioni di possibili combinazioni di caratteri per trovare quella giusta.
Nohillside,

Risposte:


13

Bene, il modo banale (forse barare ) sarebbe quello di correre:

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

Questo produrrà una password usando qualunque schema di hashing password utilizzato dalla tua versione di mysql. [ EDIT : aggiunto -NB, che elimina i nomi delle colonne e l'arte della tabella ascii.]


6
E, a portata di mano, questo memorizzerà la tua nuova brillante password in chiaro sia nel tuo registro MySQL che nel registro della cronologia del tuo account Bash.
Craig,

@Craig Per prevenire entrambi, puoi anteporre uno '' (spazio) prima mysqldi nasconderlo dalla cronologia di bash e puoi usarlo SET sql_log_off=ON;prima SELECT ...di nasconderlo dal registro di MySQL.
Murmel,

1
@Murmel grazie per l'aggiornamento! Ovviamente, per impostazione predefinita non registra le password. La sicurezza dovrebbe essere sempre l'impostazione predefinita.
Craig

@Craig Per essere onesti, questo è già stato fatto da mysql (v5.7, l'ultima versione esiste questa funzione, è stata rimossa con v8.0.11 )) su: 1. il lato client (influendo .mysql_history) ignorando tutte le istruzioni corrispondenti *PASSWORD*e 2. lato server per diversi stmts (tranne SELECT). Vedi: Manuale MySQL 5.7 - Password e registrazione e MySQL 5.7 - Manuale - Registrazione client mysql
Murmel

Questo è un buon feedback! Sfortunatamente, ci sono ancora alcune persone che per vari motivi (me compreso) sono ancora bloccati usando le versioni mysql precedenti alla 5.7.
Craig,

12

Alcuni one-liner:

MySQL (potrebbe essere necessario aggiungere -u (utente) -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";'

Rubino :

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

Tutto l'output:

* 920018161824B14A1067A69626595E68CB8284CB


Grazie, ho collegato alla tua risposta in serverfault.com/a/846281/236916
mwfearnley,

@alexjhart Posso ottenere un aggiornamento per il nuovo algoritmo di hashing della password mysql 5.7.8 :)? (forse un piccolo dettaglio su come l'hai scoperto anche tu?)
ThorSummoner,

6

Mi sembra ancora stupefacente che MySQL non si preoccupi di offuscare le password sulla riga di comando e nei registri. E questa è l'unica ragione per cui sto aggiungendo una risposta piuttosto che commentare semplicemente la risposta di @Gilles.

Così, naturalmente, si può solo accedere in MySQL come amministratore e impostare una nuova password per l'utente BLAYO, come @patrix suggerito.

Tuttavia, il modo standard per farlo è usando la funzione password () di MySQL, che prende una password in chiaro come argomento (sul serio?).

Se lo fai, lasci la versione in chiaro della password del tuo utente MySQL nella cronologia di bash e nei tuoi log di MySQL, per un facile recupero in seguito da chiunque riesca ad accedere a quei file di log.

Non sarebbe meglio avere una piccola utility che richiederebbe la password, senza riecheggiarla sullo schermo o nei registri, quindi fornire l'hash risultante compatibile con MySQL?

Quindi, modificando un po 'la risposta di @ Gilles, che ne dici di un piccolo script di shell che utilizza Python, come il seguente. Puoi facilmente modificarlo per eseguire un'istruzione SQL sul tuo database MySQL per impostare la password tutta in una volta. Ma anche senza andare così lontano, basta copiare e incollare l'hash risultante in un'istruzione SQL per aggiornare la tabella degli utenti:

#!/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; di cosa trattava la modifica? Non ha cambiato nulla? ;-)
Craig,

Imponeva l'evidenziazione della sintassi (come indicato nel riepilogo della modifica) e reso evidente dal testo effettivo della modifica.
HalosGhost,

3
Ah quindi. Onestamente non ho realizzato quello che avresti fatto (ovviamente hai aggiunto la <!-- language: lang-bsh -->linea). Maneggevole! Mi piace. Grazie!
Craig,

5

Ancora uno usando la shell:

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

Spiegazione:

  1. echo -n stampa senza interruzioni di riga
  2. sha1sum primo SHA1
  3. xxd -r -p unhex l'hash
  4. sha1sum secondo SHA1
  5. tr '[a-z]' '[A-Z]' converti in maiuscolo
  6. awk '{print "*" $1}' aggiungi lead *

Più dettagli:

Tra 2. e 3. awk '{printf "%s", $1}'potrebbe essere inserito un passaggio facoltativo per la rimozione della riga nuova e del trattino. Ma xxd li ignorerà comunque (grazie a dave_thompson_085).

Inoltre, i passaggi 5 e 6 possono essere eseguiti immediatamente sostituendoli con {print "*" toupper($1)}(Grazie a dave_thompson_085).


1
awkpuò fare la maiuscola, ed emettere un (ultimo) linea incompleta al terminale è scomoda: .. | sha1sum | awk '{print "*" toupper($1)}'. E non devi preoccuparti della BN e persino del trattino sul xxd -r -p, vengono ignorati.
dave_thompson_085,

4

L'hash è sha1 (sha1 (password)) . Dato che non c'è sale (che è un grave difetto di sicurezza), puoi cercare l'hash in un tavolo .

Con solo gli strumenti POSIX plus sha1sumdi GNU coreutils o BusyBox, sha1 (sha1 (password)) è fastidioso da calcolare perché il sha1sumcomando stampa il digest in esadecimale e non esiste uno strumento standard per convertire in 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 ha digest standard nelle sue librerie standard, quindi è un semplice one-liner.

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

O con la password all'interno del one-liner:

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

Adoro questa risposta nello spirito, ma non funziona abbastanza. Quando premo il tasto Invio, continua a leggere l'input invece di continuare. Inoltre, l'ingresso torna allo schermo, il che potrebbe non essere desiderabile. Che ne dici di qualcosa del genere, però? unix.stackexchange.com/a/155583/37401
Craig

@Craig Come leggere l'input interattivo va oltre lo scopo della domanda. Presumo che lo script abbia già la password; di solito è memorizzato in un file, è raro digitare una password del database in modo interattivo. Se si desidera leggere input interattivi, è possibile utilizzare la readshell incorporata per leggere una riga; eseguire stty echoprima se si desidera disattivare l'eco e riattivarlo ssty +echo. In Python, puoi usare il getpassmodulo.
Gilles 'SO- smetti di essere malvagio' il

Sì, lo so ... e abbastanza giusto! Odio la sicurezza orribile più avanti lungo la strada, e la sicurezza di MySQL è piuttosto orribile in generale, quindi ho questa tendenza istintiva a voler iniettare un po 'di conoscenza della sicurezza ogni volta che ne ho la possibilità. ;-)
Craig

1

Se hai creato un utente e hai dimenticato la password, questo è ciò che dovresti fare ed è più facile.

Questo è successo anche a me una dozzina di volte mentre facevo 10 miliardi di cose contemporaneamente. Il modo migliore in cui ho recuperato la mia password è stato:

arrestato completamente il server mysql per primo

rilasciato mysqld_safe --skip-grant-tables &

poi ho effettuato l'accesso come root senza emettere una password, solo mysql -u mysql-user (ti consente di accedere dopo mysqld_safe)

quindi vai alla tabella mysql> utente e aggiorna la password per l'utente

quindi tornare indietro e riavviare mysql

vedi se funziona e facci sapere.


Sembra che sarebbe più per il caso che non è possibile accedere affatto , piuttosto che solo come utente specifico.
mwfearnley,

1

Un altro usa la shell

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

... che genera:

*920018161824B14A1067A69626595E68CB8284CB

0

MySQL 4.1+ utilizza il doppio SHA1

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Questo algoritmo può essere facilmente trasferito in altre lingue. Una differenza è che gli hash delle password nella "seleziona password" iniziano sempre con un carattere "*".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.