web-dev-qa-db-ja.com

mysqlパスワードハッシュが内部的にスター(アスタリスク)で保存されるのはなぜですか?

いくつかのmysqlの内部を読んでいましたが、my mysqlシェルのmysql.userテーブルを通過すると、

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

パスワードは明らかにハッシュ化されていますが、なぜスター(アスタリスク)で始まるのですか?

9
mu 無

アスタリスクで始まるパスワードに加えて、これが 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()のハッシュアルゴリズム から学びました

7
RolandoMySQLDBA

わかりました、これについて ドキュメント自体 で見つかりました。

これはmysql 4.1で導入された変更であり、以前のパスワードの長さ16文字と新しいパスワードの長さ40文字を同時にサポートできるようになりました。 Password列は41バイト(文字)になり、新しいパスワードはそれらを識別するために必須の*で始まります。

ドキュメント から:

4.1形式のパスワードハッシュは常に「*」文字で始まりますが、4.1より前の形式のパスワードは決して始まりません。

14
mu 無