自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談 MySQL 新的身份驗(yàn)證插件 caching_sha2_password

數(shù)據(jù)庫 MySQL
mysql_native_password 作為 MySQL 5.6/5.7 的默認(rèn)密碼插件 。其優(yōu)點(diǎn)是它支持 challenge-response (挑戰(zhàn)應(yīng)答方式),這是非??斓尿?yàn)證機(jī)制,無需在網(wǎng)絡(luò)中發(fā)送實(shí)際密碼,并且不需要加密的連接。

介紹

從 MySQL 8.0.4 開始,MySQL 默認(rèn)身份驗(yàn)證插件從 mysql_native_password?  改為 caching_sha2_password? 。相應(yīng)地,libmysqlclient? 也使用 caching_sha2_password 作為默認(rèn)的身份驗(yàn)證機(jī)制。

起因

在這之前 MySQL 5.6/5.7 使用的默認(rèn)密碼插件是 mysql_native_password。mysql_native_password? 的特點(diǎn)是不需要加密的連接。該插件驗(yàn)證速度特別快,但是不夠安全,因?yàn)椋琺ysql_native_password 使用的是于 SHA1 算法,NIST(美國國家標(biāo)準(zhǔn)與技術(shù)研究院)在很早之前就已建議停止使用 SHA1 算法,因?yàn)?SHA1 和其他哈希算法(例如 MD5)容易被破解。

其實(shí)從 MySQL 5.6 開始就引入了更安全的認(rèn)證機(jī)制:ha256_password 認(rèn)證插件。它使用一個(gè)加鹽密碼(salted password)進(jìn)行多輪 SHA256 哈希(數(shù)千輪哈希,暴力破解更難),以確保哈希值轉(zhuǎn)換更安全。但是,建立安全連接和多輪 hash 加密很耗費(fèi)時(shí)間。雖然安全性更高,但是驗(yàn)證速度不夠快。

改進(jìn)

MySQL 試圖結(jié)合二者的優(yōu)點(diǎn)。于是在 MySQL-8.0.3  引入了一個(gè)新的身份驗(yàn)證插件 caching_sha2_password? ,作為sha256_password?的代替方案,在sha256_password? 的基礎(chǔ)上進(jìn)行了改進(jìn)補(bǔ)上了短板,既解決安全性問題又解決性能問題。與此同時(shí) sha256_password?將退出時(shí)代的浪潮。MySQL 預(yù)計(jì)在未來版本中將其刪除。使用 sha256_password? 進(jìn)行身份驗(yàn)證的 MySQL 賬戶建議轉(zhuǎn)為 caching_sha2_password。

結(jié)果

因?yàn)槟J(rèn)身份驗(yàn)證機(jī)制的更改,大家在使用 MySQL 8.0? 時(shí)候出現(xiàn)了很多相關(guān)的問題。網(wǎng)上的大部分教程都是教人改回mysql_native_password?驗(yàn)證方式  mysql_native_password?。但是筆者認(rèn)為,MySQL 更改默認(rèn)插件是為了更好的安全性考慮。如果有 MySQL 服務(wù)要公網(wǎng)上使用,建議還是盡量使用 caching_sha2_password作為認(rèn)證插件。

示例:使用舊版本客戶端連接時(shí)報(bào)錯(cuò):

shell> mysql -uroot -p
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded

具體機(jī)制分析

mysql_native_password

mysql_native_password? 作為 MySQL 5.6/5.7 的默認(rèn)密碼插件 。其優(yōu)點(diǎn)是它支持 challenge-response (挑戰(zhàn)應(yīng)答方式),這是非??斓尿?yàn)證機(jī)制,無需在網(wǎng)絡(luò)中發(fā)送實(shí)際密碼,并且不需要加密的連接。

客戶端連接MySQL實(shí)例時(shí),首先需要從服務(wù)器端獲得一個(gè)20字節(jié)的隨機(jī)數(shù)。

此外,mysql_native_password? 使用了新的哈希算法進(jìn)行認(rèn)證校驗(yàn)。對于用戶的原始密碼,通過SHA1(SHA1(password))兩次哈希計(jì)算結(jié)果保存在 mysql.user? 表的 authentication_string 列中。其中用戶密碼通過哈希計(jì)算后保存,沒有加鹽(salt)。

通過上述這樣的處理,MySQL數(shù)據(jù)庫本身已然非常安全。然而,隨著時(shí)間的推移,目前存在以下兩種潛在風(fēng)險(xiǎn):

  • SHA1哈希算法也已經(jīng)變得比較容易破解。
  • 相同的密碼擁有相同的哈希值。

SHA1、MD5等之前的哈希算法都已然不再安全,更為安全的SHA256、SHA512哈希算法也已推出。作為數(shù)據(jù)存儲(chǔ)最終承載者,應(yīng)該使用更新的加密機(jī)制機(jī)制。

caching_sha2_password

在cache_sha2_password密碼認(rèn)證機(jī)制下,其改進(jìn)如下所示:

  • 保存在authentication_string 中的哈希值為加鹽后的值,即使兩個(gè)不同用戶的密碼相同,保存在計(jì)算機(jī)中的哈希值也不同。
  • 哈希算法升級為了更為安全SHA256算法。
  • 哈希算法的round? 次數(shù)從原來的兩次,提升為了5000次,round次數(shù)越多,每次計(jì)算哈希值的代價(jià)越大,破解難度也就越大。
  • 用TLS的加密或RSA密鑰傳輸方式從客戶端將密碼傳送到服務(wù)端。

caching_sha2_password 通訊過程解析

對于大多數(shù)連接嘗試,當(dāng)密碼的哈希值有緩存在內(nèi)存中時(shí),它的驗(yàn)證是基于 SHA256 的challenge-response?機(jī)制(與 mysql_native_password? 中基于 SHA1 的challenge-response機(jī)制相比更快),下圖演示了在有哈希緩存時(shí)的驗(yàn)證流程。

圖片

 challenge-response 的認(rèn)證模式

從圖中我們看到,客戶端對密碼進(jìn)行多重哈希加密生成 Scramble 發(fā)送給服務(wù)端, 服務(wù)端檢查內(nèi)存的緩存(memory cache)中是否存在該條目。當(dāng)值在緩存中存在證明本次連接合法,服務(wù)器會(huì)告訴客戶端快速認(rèn)證成功:發(fā)送 fast_auth_success 包到客戶端,并且發(fā)送確認(rèn)報(bào)文。然后服務(wù)器就可以和客戶端正常通信了。

當(dāng)沒有這種緩存時(shí),caching_sha2_password? 需要使用安全連接(SSL/STL)進(jìn)行密碼交換。考慮到用戶更改和 FLUSH PRIVILEGES? 操作頻率比較低,所以在大多數(shù)情況下,使用的都是基于challenge-response的身份驗(yàn)證,不用建立安全連接。這省去了建立安全連接需要耗費(fèi)的資源。下圖總結(jié)了完整的驗(yàn)證流程。

圖片

從圖中我們看到,服務(wù)器在收到 Scramble 后,發(fā)現(xiàn)緩存中沒有對應(yīng)的值,服務(wù)器會(huì)告訴客戶端,要建立安全連接使用完整的身份驗(yàn)證流程:發(fā)送 perform_full_authentication 包到客戶端,之后客戶端接收服務(wù)器的公鑰(公鑰文件如果已存在就省去這個(gè)步驟)。如果安全連接(SSL/STL)已經(jīng)建立基于 ,則可以直接發(fā)送明文密碼到服務(wù)端。如果沒有安全連接,客戶端就會(huì) 向服務(wù)端發(fā)起獲取公鑰的請求(或者指定服務(wù)端公鑰文件),使用公鑰加密密碼,發(fā)送到服務(wù)端。服務(wù)器通過 SHA256 算法計(jì)算得到哈希值,判斷是否用戶認(rèn)證通過,通過則發(fā)送 OK 包到客戶端。然后服務(wù)器就可以和客戶端正常通信了。

這里詳細(xì)解釋一下 RSA 非對稱加密的通信過程:

首先先明確一個(gè)概念:非對稱加密算法中,有兩個(gè)密鑰:公鑰和私鑰。如果用公鑰進(jìn)行加密,只有對應(yīng)的私鑰才能解密;反之亦然。

RSA 密鑰交換過程:

1.服務(wù)器生成一對密鑰并將公鑰向其他方公開(以明文發(fā)送給客戶端)。

2.客戶端使用服務(wù)器的公鑰對密碼進(jìn)行加密后發(fā)送給服務(wù)器。

3.服務(wù)器用對應(yīng)的私鑰對加密信息進(jìn)行解密。

因?yàn)榭蛻舳擞霉€加密的信息只能用服務(wù)器的私鑰解密,所以這個(gè)連接過程可以視為加密通信。

圖片

需要注意的地方

默認(rèn)身份驗(yàn)證插件的更改意味著:

在 MySQL 8.0.4 之后創(chuàng)建的所有新用戶將默認(rèn)使用 caching_sha2_password 作為身份驗(yàn)證插件。

mysql> SELECT USER,PLUGIN FROM mysql.`user` ;
+------------------+-----------------------+
| USER | PLUGIN |
+------------------+-----------------------+
| root | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
+------------------+-----------------------+
6 rows in set (0.06 sec)

libmysqlclient? 默認(rèn)使用 caching_sha2_password,可以通過手動(dòng)修改切換到其他的身份驗(yàn)證插件。

  • 使用 caching_sha2_password 插件的客戶端,連接到服務(wù)器時(shí),不會(huì)使用名為密碼。密碼傳輸是如何進(jìn)行的取決于是否使用安全連接或 RSA 對密碼加密:
  • 如果連接是安全的,可以不使用 RSA 密鑰。適用于使用 TLS 加密的 TCP 連接,以及 Unix 套接字文件和共享內(nèi)存連接。密碼以明文格式發(fā)送,但不能被竊聽,因?yàn)檫B接是安全的。

如果連接不是安全的,可以使用 RSA 密鑰對。適用于未使用 TLS 加密的 TCP 連接和 named-pipe 連接。RSA 僅用于客戶端和服務(wù)器之間的密碼交換,防止密碼被截取。當(dāng)服務(wù)器接收到使用公鑰加密的密碼后,它使用私鑰解密。一個(gè)隨機(jī)字符串用在加密中,防止重放攻擊(repeat attacks)。

在 MySQL 8.0.3 以上版本中。默認(rèn)自動(dòng)完成  RSA 密鑰對進(jìn)行密碼交換。

關(guān)于主從復(fù)制

如果用于復(fù)制的用戶使用了 caching_sha2_password身份驗(yàn)證插件,并且沒有啟用安全連接( 在group_replication_recovery 啟用SSL支持),MySQL 將使用 RSA 密鑰對進(jìn)行密碼的交換,可以把主節(jié)點(diǎn)的公鑰手動(dòng)拷貝到從節(jié)點(diǎn)的服務(wù)器中,也可以設(shè)置成:自動(dòng)為請求加入組的節(jié)點(diǎn)提供公鑰。

復(fù)制本身是支持加密的連接。在 MySQL 8.0.4中,添加了復(fù)制對 RSA 加密的支持。

CHANGE MASTER? 可以通過以下個(gè)參數(shù)來啟用基于 caching_sha2_password RSA 密鑰來交換密碼:

 指定 RSA 公鑰路徑
- MASTER_PUBLIC_KEY_PATH ="key_file_path"

#從服務(wù)端獲取 RSA 公鑰
- GET_MASTER_PUBLIC_KEY = {0 | 1}

Group Replication 可以通過以下個(gè)參數(shù)來啟用基于caching_sha2_password RSA 密鑰來交換密碼:

#指定 RSA 公鑰路徑
––group-replication-recovery-public-key-path
#從服務(wù)端獲取 RSA 公鑰
––group-replication-recovery-get-public-key

數(shù)據(jù)庫升級

數(shù)據(jù)庫升級到 MySQL 8.0.4 會(huì)怎樣?

在升級之前創(chuàng)建的用戶,身份認(rèn)證插件不會(huì)更改。在升級之后創(chuàng)建的用戶默認(rèn)使用 aching_sha2_password?身份驗(yàn)證插件。除非使用 --default-authentication-plugin 手動(dòng)指定認(rèn)證插件插件。因?yàn)椴粫?huì)更改升級前已有用戶。因此,使用升級后依然可以用舊版本的客戶端連接這些用戶。

相應(yīng)地,libmysqlclient? 支持 mysql_options() C API?函數(shù)的 MYSQL_DEFAULT_AUTH? 選項(xiàng)。(對于 MySQL 包中可用的基于 libmysqlclient 的客戶端工具,可以用 ––default-auth 命令行選項(xiàng)達(dá)到相同的目的。)

建議使用 cache_sha2_password? 因?yàn)樗踩?。并且升?nbsp;libmysqlclient 到 MySQL 8.0.4 或更高版本,以便支持新的身份驗(yàn)證插件。

參考資料

[MySQL 8.0.4 : New Default Authentication Plugin]

 caching_sha2_password]https://dev.mysql.com/blog-archive/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password

[得物技術(shù)淺談MySQL 8.0:新的身份驗(yàn)證插件]

https://segmentfault.com/a/1190000040733952

[MySQL 8.0密碼認(rèn)證機(jī)制升級,不知道可能導(dǎo)致業(yè)務(wù)不可用!!]

https://mp.weixin.qq.com/s/jfoH6D8NfoaNN7eexbzKGA

[組復(fù)制安裝部署 | 全方位認(rèn)識 MySQL 8.0 Group Replication]

https://mp.weixin.qq.com/s/sydu0alXDECcHm5GNMvtdA

責(zé)任編輯:武曉燕 來源: GreatSQL社區(qū)
相關(guān)推薦

2010-11-03 16:07:38

DB2身份驗(yàn)證

2010-09-06 11:24:47

CHAP驗(yàn)證PPP身份驗(yàn)證

2025-04-25 07:00:00

身份驗(yàn)證CISO無密碼

2010-07-17 00:57:52

Telnet身份驗(yàn)證

2023-08-07 07:53:51

2012-04-10 09:36:58

2017-09-01 12:38:20

windows服務(wù)器windows 200

2020-08-23 09:04:04

SSH身份驗(yàn)證FIDO2 USB

2011-02-21 10:54:45

2013-07-21 18:32:13

iOS開發(fā)ASIHTTPRequ

2018-06-25 08:46:03

2012-10-23 16:12:35

2010-11-30 15:31:38

SharePoint Kerberos

2009-04-09 23:44:08

軟件身份驗(yàn)證用戶

2010-07-19 17:30:47

2022-10-31 10:00:00

2021-07-19 10:10:15

身份驗(yàn)證漏洞Windows Hel

2012-02-20 09:55:41

ibmdw

2025-01-14 08:13:11

2021-08-27 10:40:49

GitHubGitLinux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號