Mysql

MySQL 使用者密碼與 authentication_string

  • December 5, 2018

我執行以下命令:

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 |
+-------------------------------------------+

根據頁面

mysql.user 表

在最底部:

plugin列為空時,MariaDB 預設使用mysql_native_passwordmysql_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列中額外添加密碼雜湊。

引用自:https://dba.stackexchange.com/questions/211604