MySQL原生密碼認證

2021-09-12 03:34:31 字數 1549 閱讀 6918

基於密碼的身份認證包括了兩個部分:

- 伺服器端認證資訊的儲存

- 密碼的認證過程

基於密碼的身份認證有乙個原則:僅使用人知道密碼。密碼不能被儲存在認證伺服器中,在認證過程中也不能通過網路明文傳輸。因為儲存的資訊可能被竊取或者濫用,網路可能被監聽。這些安全隱患都可能導致密碼的洩露。下面我們看看mysql是如何做密碼認證的。

mysql的mysql.user表中有password欄位,其中儲存的資訊是用來做密碼認證的。當查詢這個欄位時看到如下格式的字串:

*0d3ced9bec10a777aec23ccc353a8c08a633045e

這個字元是什麼呢?它是通過雜湊演算法sha1計算出來的密碼的雜湊值。sha1的雜湊值長20位元組,轉換成十六進製制的字串長40位元組。前面有乙個固定的*總共佔41位元組。這個雜湊值是呼叫兩次sha1雜湊演算法算出來的雜湊值,**中稱為stage2hash。

stage2hash = sha1(sha1(密碼))

從stage2hash是無法推導出密碼的。即便這個雜湊值被盜了,不知道使用者的密碼仍然無法認證成功。

mysql的密碼認證過程

當客戶端的連線初始化完成或者收到客戶端的com_change_user命令後,伺服器會傳送乙個隨機的字串給客戶端。這個隨機的字元竄**中稱作scramble。它是用來產生乙個一次性加密秘鑰的。

key = sha1(scramble|stage2hash)

客戶端和伺服器之間通過這個秘鈅來加密傳輸認證資訊。

客戶端將收到的scramble和stage2hash一起再次進行雜湊,產生出的雜湊值用作加密秘鑰。因為stage2hash並沒有在網路上傳輸,只有伺服器和客戶端知道,所以產生的秘鑰也只有伺服器和客戶端知道。

key = sha1(scramble|stage2hash)

接著將stage1hash加密後,傳送給伺服器。stage1hash是將密碼用sha1雜湊一次後產生的雜湊值。

stage1hash = sha1(密碼)

加密的演算法很簡單,就是乙個xor操作。將key和stage1hash逐字節做xor的操作。

密文 = xor(key, stage1hash)

解密也很簡單,就是將密文與key做xor操作。

stage1hash =  xor(key, 密文)

接著通過stage1hash生成stage2hash

stage2hash = sha1(stage1hash)

然後將產生的stage2hash和mysql.user中儲存的雜湊值進行比對,如果相同則認證成功,否則失敗。

mysql的密碼認證的安全性

由於盜取人不知道使用者密碼就無法產生正確的stage1hash,因此在伺服器比對stage2hash時會出錯。 

通過網路傳輸的只有scramble隨機字串和加密的stage1hash。因為每次使用的秘鑰都不同,所以監聽者沒辦法獲取stage1hash或者利用這個加密的stage1hash進行認證。要想獲取到stage1hash,監聽者必須同時盜取了伺服器上儲存的stage2hash才行。本質上來說,伺服器認證的是stage1hash。如果攻擊者獲取了stage1hash,就如同獲取了使用者的密碼一樣。

mysql新密碼認證 MySQL原生密碼認證

基於密碼的身份認證包括了兩個部分 伺服器端認證資訊的儲存 密碼的認證過程 基於密碼的身份認證有乙個原則 僅使用人知道密碼。密碼不能被儲存在認證伺服器中,在認證過程中也不能通過網路明文傳輸。因為儲存的資訊可能被竊取或者濫用,網路可能被監聽。這些安全隱患都可能導致密碼的洩露。下面我們看看mysql是如何...

mysql新密碼認證 MySQL原生密碼認證

基於密碼的身份認證包括了兩個部分 伺服器端認證資訊的儲存 密碼的認證過程 基於密碼的身份認證有乙個原則 僅使用人知道密碼。密碼不能被儲存在認證伺服器中,在認證過程中也不能通過網路明文傳輸。因為儲存的資訊可能被竊取或者濫用,網路可能被監聽。這些安全隱患都可能導致密碼的洩露。下面我們看看mysql是如何...

mysql 密碼驗證 MYSQL 密碼認證方式

mysql 在認證的過程中,客戶端並不將mysql登入密碼傳輸到服務端進行驗證,在client連線到服務端後,服務端隨機生成乙個公鑰,然後將公鑰發給client端,client端利用公鑰 登入密碼生成乙個新的隨機串,然後將新的串發往服務端。服務端check字串反解析,具體過程如下 server pu...