Criptografa uma senha da mesma maneira que o mysql faz

12

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

mysql> create user 'blayo'@'%' identified by 'right';

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

mysql> select Password,User from mysql.user
------------------------------------------+-------+
*920018161824B14A1067A69626595E68CB8284CB | blayo |

... para ter certeza de usar o caminho certo

$ tool right
*920018161824B14A1067A69626595E68CB8284CB
    
por Philippe Blayo 06.08.2012 / 22:07

8 respostas

13

Bem, o caminho trivial (talvez batota ) seria rodar:

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

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

    
por 06.08.2012 / 22:13
9

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 a saída:

*920018161824B14A1067A69626595E68CB8284CB

    
por 07.10.2015 / 19:58
6

Ainda meio que me surpreende que o MySQL não se incomode em ofuscar 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 sobre a resposta do @Gilles.

Então, é claro, você poderia apenas se conectar ao MySQL como administrador e definir uma nova senha para seu usuário blayo, conforme sugerido pelo @patrix.

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

Se você fizer isso, você deixará a versão de texto simples da senha do seu usuário MySQL no seu histórico bash e em seus logs do MySQL, para fácil recuperação mais tarde 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 logs, e fornecer o hash compatível com o MySQL resultante?

Então, modificando um pouco a resposta do @Gilles, que tal um pequeno shell script que usa o Python, como o seguinte? Você poderia facilmente modificar isso para executar uma instrução SQL em seu 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
    
por 14.09.2014 / 21:31
4

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

Com apenas as ferramentas POSIX mais sha1sum do GNU coreutils ou BusyBox, sha1 (sha1 (senha)) é irritante para calcular porque o comando sha1sum imprime o resumo em hexadecimal e não existe uma 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

Python possui digests padrão em suas bibliotecas padrão, portanto, é um simples liner.

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

Ou com a senha dentro do one-liner:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
    
por 07.08.2012 / 02:34
4

Mais uma 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 print sem linebreak
  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}' add leading *

Mais detalhes:

Entre 2. e 3. uma etapa awk '{printf "%s", $1}' opcional pode ser inserida para remoção de nova linha e hífens. Mas xxd irá ignorá-los de qualquer maneira (Obrigado a dave_thompson_085).

Além disso, os passos 5 e 6 podem ser feitos de uma só vez, substituindo-os por {print "*" toupper($1)} (Obrigado a dave_thompson_085).

    
por 05.12.2015 / 23:53
1

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

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

parou completamente o servidor mysql

publicou mysqld_safe --skip-grant-tables &

então eu entrei como root sem emitir uma senha, apenas mysql -u mysql-user (deixa você entrar depois do mysqld_safe)

depois vá para o mysql > tabela de usuários e atualizar a senha para o usuário

depois volte e reinicie o mysql

veja se isso funciona e nos informe.

    
por 15.09.2014 / 07:01
1

Outro usando o shell

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

... o que gera:

*920018161824B14A1067A69626595E68CB8284CB
    
por 25.09.2017 / 19:59
0

O MySQL 4.1+ usa o dobro de SHA1

> 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 transferido para outros idiomas. A diferença é que os hashes de senha na "senha de seleção" sempre começam com um caractere "*".

    
por 07.08.2012 / 02:29