Mengapa kata sandi mysql disimpan secara internal dengan tanda bintang (asterisk)?

9

Saya membaca beberapa internal mysql, ketika melewati tabel mysql.user di mysqlshell saya , saya mendapatkan

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

Kata sandi jelas-jelas di-hash, tetapi mengapa itu dimulai dengan bintang (tanda bintang)?

mu 無
sumber

Jawaban:

8

Selain kata sandi yang dimulai dengan tanda bintang, berikut adalah algoritma untuk PASSWORD ()

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

CONTOH

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>

Saya mempelajari algoritma ini sejak lama dari Hashing Algorithm di MySQL PASSWORD ()

RolandoMySQLDBA
sumber
14

Oke, temukan ini di dokumentasi itu sendiri .

Ini adalah perubahan yang diperkenalkan di mysql 4.1 sehingga panjang kata sandi sebelumnya dari 16 karakter dan panjang kata sandi yang lebih baru dari 40 karakter dapat didukung secara bersamaan. Kolom Kata Sandi dibuat sepanjang 41 byte (karakter), dan kata sandi yang lebih baru akan dimulai dengan wajib *untuk mengidentifikasi mereka.

Dari dokumentasi :

Hash kata sandi dalam format 4.1 selalu dimulai dengan karakter "*", sedangkan kata sandi dalam format pra-4.1 tidak pernah dilakukan.

mu 無
sumber
Itu dugaanku juga. Tapi itu tidak menahan air. Mereka bisa memeriksa panjang untuk melihat apakah itu kata sandi baru vs lama.
Rick James
3
@ Rick James Memang mungkin untuk memeriksa panjangnya, tetapi ada argumen untuk penggunaan karakter pertama sebagai "bendera" untuk memungkinkan perubahan di masa depan yang mungkin masih menggunakan 40 karakter tetapi algoritma yang berbeda.
Monty Harder