Criptografar uma senha da mesma forma que o mysql

15

Eu criei um usuário ... mas esqueci a senha

mysql> crie usuário 'blayo' @ '%' identificado por 'right';

Qual ferramenta de linha de comando do Linux pode criptografar a senha da mesma forma que o mysql 5.5?

mysql> selecione Senha, Usuário em mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... para ter certeza de usar o caminho certo

$ ferramenta certa
* 920018161824B14A1067A69626595E68CB8284CB
Philippe Blayo
fonte
2
Por que você não pode simplesmente fazer login como administrador e definir uma nova senha blayo? Isso é definitivamente mais rápido do que percorrer trilhões de combinações de caracteres possíveis para encontrar a correta.
nohillside
Por favor, não postar a mesma pergunta a vários sites Pilha de câmbio . A versão DBA também foi respondida, o que é um desperdício de esforço.
Gilles 'SO- stop be evil' em

Respostas:

13

Bem, a maneira trivial (talvez trapaceira ) seria executar:

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

Isso produzirá uma senha usando qualquer esquema de hash de senha que sua versão do mysql use. [ EDIT : adicionado -NB, que elimina os nomes das colunas e a arte da tabela ascii.]

jsbillings
fonte
6
E, facilmente, isso armazenará sua nova e brilhante senha em texto não criptografado, tanto no seu registro MySQL quanto no histórico do bash.
Craig
@Craig Para impedir os dois, você pode acrescentar um '' (espaço) logo antes mysqlde ocultá-lo do histórico do bash e usá-lo SET sql_log_off=ON;imediatamente antes SELECT ...de ocultá-lo do log do MySQL.
Murmel
1
@ Murmel obrigado pela atualização! Obviamente, deve ter como padrão não registrar senhas. Segurança sempre deve ser a configuração padrão.
Craig
@ Craig Para ser justo, isso já é feito pelo mysql (v5.7, a última versão dessa função, foi removida com a v8.0.11 )) em: 1. clientside (afetando .mysql_history) ignorando todas as instruções correspondentes *PASSWORD*e 2. serverside for várias stmts (exceto SELECT). Veja: MySQL 5.7 Manual - Senhas e Log e MySQL 5.7 - Manual - MySQL Client Logging
Murmel
Esse é um bom feedback! Infelizmente, ainda existem algumas pessoas que, por várias razões (inclusive eu), ainda estão presas usando versões mysql anteriores à 5.7.
22419 Craig
12

Alguns one-liners:

MySQL (pode exigir que você adicione -u (usuário) -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";'

Ruby :

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

Toda saída:

* 920018161824B14A1067A69626595E68CB8284CB

alexjhart
fonte
Obrigado, eu tenho ligado a sua resposta em serverfault.com/a/846281/236916
mwfearnley
@alexjhart Posso obter uma atualização para o novo algoritmo de hash de senha do mysql 5.7.8 :)? (talvez um pequeno detalhe de como você descobriu isso também?)
ThorSummoner
6

Ainda me parece que o MySQL não se incomoda em ocultar senhas na linha de comando e nos logs. E essa é a única razão pela qual estou adicionando uma resposta em vez de apenas comentar na resposta do @Gilles.

Então, é claro, você pode simplesmente acessar o MySQL como administrador e definir uma nova senha para o usuário blayo, como sugerido pelo @patrix.

No entanto, a maneira padrão de fazer isso é usando a função password () do MySQL, que leva uma senha de texto sem formatação como argumento (sério?).

Se você fizer isso, você deixará a versão em texto sem formatação da senha do usuário do MySQL no histórico do bash e nos logs do MySQL, para recuperação fácil posteriormente por quem conseguir acessar esses arquivos de log.

Não seria melhor ter um pequeno utilitário que solicitasse a senha, sem ecoá-la na tela ou nos seus logs, e depois fornecer o hash compatível com o MySQL resultante?

Então, modificando um pouco a resposta de @ Gilles, que tal um pequeno script de shell que usa Python, como o seguinte. Você pode facilmente modificar isso para executar uma instrução SQL no banco de dados MySQL para definir a senha de uma só vez. Mas mesmo sem ir tão longe, basta copiar e colar o hash resultante em uma instrução SQL para atualizar a tabela de usuários:

#!/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
fonte
@HalosGhost; sobre o que era a edição? Não mudou nada? ;-)
Craig
Ele reforçou o destaque da sintaxe (conforme observado no resumo da edição) e ficou óbvio pelo texto real da edição.
precisa saber é o seguinte
3
Ah sim. Honestamente, não percebi o que você tinha feito (você obviamente adicionou a <!-- language: lang-bsh -->linha). Handy! Eu gosto disso. Obrigado!
Craig
5

Mais um usando o shell:

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

Explicação:

  1. echo -n imprimir sem quebra de linha
  2. sha1sum primeiro SHA1
  3. xxd -r -p unhex o hash
  4. sha1sum segundo SHA1
  5. tr '[a-z]' '[A-Z]' converter para maiúsculas
  6. awk '{print "*" $1}' adicione os principais *

Mais detalhes:

Entre 2. e 3. uma awk '{printf "%s", $1}'etapa opcional pode ser inserida para remoção de nova linha e hífen. Mas o xxd os ignorará mesmo assim (obrigado a dave_thompson_085).

Além disso, as etapas 5 e 6 podem ser executadas de uma só vez, substituindo-as por {print "*" toupper($1)}(Graças a dave_thompson_085).

Murmel
fonte
1
awkpode fazer o maiúscula, e produzir uma linha incompleta (última) ao terminal é incovenient: .. | sha1sum | awk '{print "*" toupper($1)}'. E você não precisa se preocupar com o NL e até o hífen no xxd -r -p, eles são ignorados.
Dave_thompson_085
4

O hash é sha1 (sha1 (senha)) . Como não há sal (que é uma falha grave de segurança), você pode procurar o hash em uma tabela .

Com apenas as ferramentas POSIX, mais sha1sumdo GNU coreutils ou BusyBox, o sha1 (sha1 (senha)) é irritante de calcular porque o sha1sumcomando imprime o resumo em hexadecimal e não há ferramenta padrão para converter em binário.

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

O Python possui resumos padrão em suas bibliotecas padrão, por isso é uma linha única.

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

Ou com a senha dentro da linha única:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
Gilles 'SO- parar de ser mau'
fonte
Eu amo essa resposta em espírito, mas não está funcionando direito. Quando pressiono a tecla Enter, ele ainda quer continuar lendo as entradas em vez de seguir em frente. Além disso, a entrada faz eco novamente na tela, o que pode não ser desejável. Mas que tal algo assim? unix.stackexchange.com/a/155583/37401
Craig
@ Craig Como ler a entrada interativa está além do escopo da questão. Presumo que o script já tenha a senha; normalmente é armazenado em um arquivo, é raro digitar uma senha de banco de dados interativamente. Se você quiser ler a entrada interativa, poderá usar o readshell interno para ler uma linha; execute stty echoprimeiro se quiser desativar o eco e ssty +echoligá-lo novamente. No Python, você pode usar o getpassmódulo
Gilles 'SO- stop be evil'
Sim, eu sei ... e justo! Eu odeio segurança horrível quanto mais adiante, e a segurança do MySQL é bastante horrível em geral, então eu tenho essa tendência instintiva de querer injetar um pouco de visão de segurança sempre que possível. ;-)
Craig
1

Se você criou um usuário e esqueceu a senha, é isso que você deve fazer e é mais fácil.

Isso também aconteceu comigo uma dúzia de vezes enquanto eu fazia 10 bilhões de coisas ao mesmo tempo. A melhor maneira de recuperar minha senha foi:

parou o servidor mysql completamente primeiro

mysqld_safe emitido - skip-grant-tables &

então entrei como root sem emitir uma senha, apenas mysql -u mysql-user (permite entrar após o mysqld_safe)

então vá para a tabela mysql> user e atualize a senha do usuário

então volte e reinicie o mysql

veja se isso funciona e deixe-nos saber.

unixmiah
fonte
Isto parece que seria mais para o caso que você não pode entrar em tudo , em vez de apenas como um usuário específico.
mwfearnley
1

Outro usando o shell

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

... que produz:

*920018161824B14A1067A69626595E68CB8284CB
Chris Martin
fonte
0

O MySQL 4.1+ usa o SHA1 duplo

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Esse algoritmo pode ser facilmente portado para outros idiomas. A diferença é que os hashes de senha na "senha de seleção" sempre começam com um caractere "*".

Diogo Nechtan
fonte