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


9

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

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

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

回答:


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文字を同時にサポートできるようになりました。Passwordカラムは41バイト(文字)になり、新しいパスワードは*それらを識別するために必須で始まります。

ドキュメントから:

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


それも私の推測でした。しかし、それは水を保持しません。長さをチェックして、新しいパスワードと古いパスワードのどちらであるかを確認することもできます。
リックジェームズ

3
@Rick James確かに長さをチェックすることは可能ですが、最初の文字を「フラグ」として使用して、今後40文字でも異なるアルゴリズムを使用する可能性がある変更を許可する引数があります。
モンティハーダー、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.