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


9

我正在阅读一些mysql内部知识,当通过我的mysqlshell中的mysql.user表时,我得到了

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

密码显然是散列的,但是为什么要以星号(星号)开头?

Answers:


8

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

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

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>

我很早以前从MySQL PASSWORD()中的哈希算法中学到了该算法


14

好的,可以在文档本身中找到有关此内容的信息

这是mysql 4.1中引入的一项更改,因此可以同时支持16个字符的较早密码长度和40个字符的较新密码长度。“密码”列的长度为41个字节(字符),并且较新的密码将以强制性的开头*来标识它们。

文档中

4.1格式的密码哈希始终以“ *”字符开头,而4.1之前的格式则永远不会。


那也是我的猜测。但是它不容纳水。他们可以检查长度,以查看它是新密码还是旧密码。
里克·詹姆斯

3
@Rick James当然可以检查长度,但是有一些参数可以将第一个字符用作“标志”,以允许将来可能仍使用40个字符但使用不同算法的更改。
Monty Harder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.