Como posso alterar uma senha de usuário do MySQL sem digitá-la visivelmente no console?

3

Eu vi vários métodos para definir senhas no MySQL, por exemplo, coisas como:

GRANT USAGE ON db.* to 'dave'@'localhost' IDENTIFIED BY 'supersecretpassword');
SET PASSWORD [FOR 'dave'@'localhost'] = PASSWORD('reallysecretpassword');
UPDATE mysql.user SET PASSWORD=PASSWORD('confidentialpassword') WHERE user='dave' AND host='localhost';

Mas eles parecem envolver a digitação clara da senha como parte de um comando SQL, o que gera paranóia sobre coisas como se ela acaba no histórico de comandos SQL ou se alguém está olhando por cima do meu ombro ou pode espiar minha rolagem de terminal.

Existe alguma maneira que eu possa fazer com que o MySQL me avise para fornecer a senha sem que ela seja exibida na tela (da mesma forma que o Unix faz com passwd )?

    
por mwfearnley 17.04.2017 / 18:36

3 respostas

1

O algoritmo de hash de senha é bastante simples e pode ser replicado em outras linguagens de programação.

De acordo com link , no MySQL 4.1 e superior, o PASSWORD função leva o (binário) SHA1 da seqüência de senha, duas vezes, em seguida, retorna que como uma seqüência de caracteres hex precedida por um asterisco.

Por exemplo, no SQL:

> SELECT PASSWORD('test'), SHA1(UNHEX(SHA1('test')));
+-------------------------------------------+------------------------------------------+
| PASSWORD('test')                          | SHA1(UNHEX(SHA1('test')))                |
+-------------------------------------------+------------------------------------------+
| *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | 94bdcebe19083ce2a1f959fd02f964c7af4cfc29 |
+-------------------------------------------+------------------------------------------+

Usar o código do MySQL no console derrota o propósito, mas aqui está um script Python bastante simples que solicita uma senha e gera uma string de senha compatível com o MySQL a partir dele.

import hashlib, getpass

def mysql_password(p):
    return '*' + hashlib.sha1( hashlib.sha1(p).digest() ).hexdigest().upper()

password = getpass.getpass()

print(mysql_password(password))

Isso pode ser atribuído diretamente a um usuário no MySQL:

SET PASSWORD FOR 'dave'@'localhost' = '*94BDCE...';

Portanto, é apenas o hash de senha que é visto no histórico do console / MySQL. (Não é mais do que pode ser visto por qualquer pessoa com acesso à tabela mysql.user .)

    
por 24.04.2017 / 18:57
0

Como Federico Sierra aponta nos comentários, você pode usar o comando mysqladmin ' password para mudar a senha para qualquer usuário que você possa logar como.

Anteriormente, a senha tinha que ser fornecida na linha de comando, mas a partir de 5.7, se a senha for omitida, ela solicitará uma.

Na documentação do mysqladmin :

password new_password

Set a new password. This changes the password to new_password for the account that you use with mysqladmin for connecting to the server. Thus, the next time you invoke mysqladmin (or any other client program) using the same account, you will need to specify the new password.

[...]

In MySQL 5.7, the new password can be omitted following the password command. In this case, mysqladmin prompts for the password value, which enables you to avoid specifying the password on the command line. Omitting the password value should be done only if password is the final command on the mysqladmin command line. Otherwise, the next argument is taken as the password.

Portanto, se você souber a senha de um usuário - e estiver em um host do qual tenha permissão para fazer login -, poderá alterar sua senha com:

mysqladmin -u <user_name> [-p] password

por exemplo,

$ mysqladmin -u dave -p password
Enter password: 
New password: 
Confirm new password: 

Se você tiver os privilégios certos, é possível alterar a senha inicial e o host do usuário para permitir o login. Mas isso vem com seus próprios riscos, por isso não é o ideal.

Observação: estou respondendo a minha própria pergunta aqui, mas não vou marcá-la como aceita, pois não estou satisfeito de que essa seja uma maneira geralmente segura de alterar a senha de um usuário.

    
por 22.04.2017 / 17:30
0

Um script wrapper em algum idioma (eu usaria php e rodaria via cli pois seria uma cópia / colagem rápida de coisas que eu já tenho) que é executado, então deletado, ou pelo menos editado novamente para mudar todas as senhas para "mudar" ou similar.

    
por 22.04.2017 / 18:47