Por que os hashes de senha do mysql são salvos internamente com uma estrela (asterisco)?

9

Eu estava lendo alguns internos do mysql. Ao percorrer a tabela mysql.user no meu mysqlshell, recebo

mysql> select * from mysql.user limit 1 \G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

A senha está obviamente com hash, mas por que começa com a estrela (asterisco)?

mu 無
fonte

Respostas:

8

Além da senha que começa com um asterisco, aqui está o algoritmo para PASSWORD ()

SET @plaintextpassword = 'whatever password you want';
SELECT CONCAT('*',UPPER(SHA1(UNHEX(SHA1(@plaintextpassword)))));

EXEMPLO

mysql> SET @plaintextpassword = 'whatever password you want';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT UPPER(SHA1(UNHEX(SHA1(@plaintextpassword)))) PWD_CREATION;
+------------------------------------------+
| PWD_CREATION                             |
+------------------------------------------+
| D09AF2704D843A5E4E84362830C7EC1CEA40DF8A |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT PASSWORD(@plaintextpassword) PWD_FUNCTION;
+-------------------------------------------+
| PWD_FUNCTION                              |
+-------------------------------------------+
| *D09AF2704D843A5E4E84362830C7EC1CEA40DF8A |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql>

Eu aprendi esse algoritmo há muito tempo com o Hashing Algorithm no MySQL PASSWORD ()

RolandoMySQLDBA
fonte
14

Ok, encontrei sobre isso na própria documentação .

Esta foi uma alteração introduzida no mysql 4.1 para que os comprimentos de senha anteriores de 16 caracteres e os mais recentes de 40 caracteres pudessem ser suportados simultaneamente. A coluna Senha tinha 41 bytes (caracteres) e as senhas mais recentes começavam com a obrigatoriedade *de identificá-las.

A partir da documentação :

Os hashes de senha no formato 4.1 sempre começam com um caractere "*", enquanto as senhas no formato anterior à 4.1 nunca.

mu 無
fonte
Esse foi o meu palpite também. Mas não retém água. Eles poderiam ter verificado o comprimento para ver se era nova vs senha antiga.
Rick James
3
@ Rick James Certamente é possível verificar o comprimento, mas existem argumentos para o uso do primeiro caractere como uma "bandeira" para permitir alterações futuras que ainda possam usar 40 caracteres, mas com um algoritmo diferente.
Monty mais duro