MySQL 使用者密碼與 authentication_string
我執行以下命令:
CREATE USER 'dbuser'@'%' IDENTIFIED BY PASSWORD('mypass'); CREATE USER 'dbuserx'@'%' IDENTIFIED BY PASSWORD('mypass'); SET PASSWORD FOR 'dbuser'@'%' = PASSWORD('mypass');
這導致:
MariaDB [(none)]> select host, user, password,authentication_string from mysql.user; +------------------+---------+-------------------------------------------+-------------------------------------------+ | host | user | password | authentication_string | +------------------+---------+-------------------------------------------+-------------------------------------------+ | % | dbuser | | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | | % | dbuserx | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | | +------------------+---------+-------------------------------------------+-------------------------------------------+
這合適嗎?我讀到預設情況下 MariaDB 中有 PAM,但為什麼使用者創建從一開始就沒有儲存密碼
authentication_string
?有人可以解釋其中的區別和可能的問題嗎?
瑪麗亞數據庫 10.3
您的所有
CREATE USER
語法都是“向後”的。在“本機密碼”方案中:mysql> CREATE USER 'se211604p'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'; Query OK, 0 rows affected (0.00 sec) mysql> CREATE USER 'se211604m'@'localhost' IDENTIFIED BY 'mypass'; Query OK, 0 rows affected (0.00 sec) mysql> select user, host, password from user where user like 'se2%'; +-----------+-----------+-------------------------------------------+ | user | host | password | +-----------+-----------+-------------------------------------------+ | se211604p | localhost | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | | se211604m | localhost | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | +-----------+-----------+-------------------------------------------+ mysql> SELECT PASSWORD('mypass'); +-------------------------------------------+ | PASSWORD('mypass') | +-------------------------------------------+ | *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | +-------------------------------------------+
根據頁面
在最底部:
當plugin列為空時,MariaDB 預設使用mysql_native_password或 mysql_old_password外掛驗證帳戶。它根據密碼列的值中使用的散列來決定哪個。當沒有設置密碼或使用 4.1 密碼雜湊(長度為 41 個字元)時,MariaDB 使用mysql_native_password外掛。mysql_old_password 外掛用於 4.1 之前的密碼雜湊(長度為 16 個字元)。
MariaDB 還支持使用替代身份驗證外掛。當給定帳戶的外掛列不為空時,MariaDB 使用它來驗證連接嘗試。然後,特定外掛使用Password列或 authentication_string列的值對使用者進行身份驗證。
可能有也可能沒有 PAM(可插入身份驗證模組)身份驗證。存在許多實現,請參閱:
例如:
SELECT user, host, CONCAT(SUBSTR(password,1,5),':',LENGTH(password)) AS pass, CONCAT(SUBSTR(authentication_string,1,5),':',LENGTH(authentication_string)) AS auth, plugin FROM user;
給
+---------------+------------+----------+----------+-----------------------+ | user | host | pass | auth | plugin | +---------------+------------+----------+----------+-----------------------+ | root | % | *687E:41 | *667F:41 | mysql_native_password | | joe.bloggs | % | *E123:41 | *E1E9:41 | mysql_native_password | | chloe.price | % | *FFA0:41 | :0 | | | max.caulfield | % | *981D:41 | :0 | | | doge | % | *A6B1:41 | :0 | | +---------------+------------+----------+----------+-----------------------+
最後三個使用者沒有配置外掛,因此列密碼的值很重要。由於其中的值是長度為 41 的字元串(實際上是最大值,該列的類型為
char(41)
),因此使用了mysql_native_password外掛。前兩個使用者使用mysql_native_password外掛強制認證。未指定該外掛是從密碼列還是從authentication_string列獲取輸入,以防它需要更大的靈活性;這取決於實施!由於authentication_string是 type
TEXT
,其中可能有很多外掛特定的東西,從SHA-2雜湊長於 41 個字元到可能整個證書鏈。在本例中,似乎不需要在authentication_string列中額外添加密碼雜湊。