为什么mysql密码哈希在内部用星号(星号)保存?

Ans*_*yal 10 mysql mysql-5.5 password

我正在阅读一些 mysql 内部结构,在我的mysqlshell 中浏览 mysql.user 表时,我得到

mysql> select * from mysql.user limit 1 \G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
Run Code Online (Sandbox Code Playgroud)

密码显然是经过哈希处理的,但为什么它以星号(星号)开头?

Ans*_*yal 15

好的,在文档本身中发现了这一点。

这是 mysql 4.1 中引入的更改,以便可以同时支持 16 个字符的早期密码长度和 40 个字符的新密码长度。密码列的长度为 41 个字节(字符),较新的密码将以强制性开头*以识别它们。

文档

4.1 格式的密码哈希总是以“*”字符开头,而 4.1 之前的格式的密码从不。

  • @Rick James 当然可以检查长度,但是有一些参数可以将第一个字符用作“标志”,以允许将来可能仍使用 40 个字符但使用不同算法的更改。 (3认同)

Rol*_*DBA 8

除了以星号开头的密码,这里是PASSWORD() 的算法

SET @plaintextpassword = 'whatever password you want';
SELECT CONCAT('*',UPPER(SHA1(UNHEX(SHA1(@plaintextpassword)))));
Run Code Online (Sandbox Code Playgroud)

例子

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>
Run Code Online (Sandbox Code Playgroud)

我很久以前从MySQL PASSWORD() 中的哈希算法中学到了这个算法