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

2021-10-18 11:30:17 字數 1692 閱讀 6419

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

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

- 密碼的認證過程

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

mysql中儲存的認證資訊

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

*0d3ced9bec10a777aec23ccc353a8c08a633045e

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

stage2hash = sha1(sha1(密碼))

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

mysql的密碼認證過程

伺服器傳送scramble到客戶端

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

key = sha1(scramble|stage2hash)

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

客戶端傳送加密的stage1hash到伺服器

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

key = sha1(scramble|stage2hash)

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

stage1hash = sha1(密碼)

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

密文 = xor(key, stage1hash)

伺服器解密stage1hash,並檢查有效性

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

stage1hash =  xor(key, 密文)

接著通過stage1hash生成stage2hash

stage2hash = sha1(stage1hash)

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

mysql的密碼認證的安全性

伺服器上的stage2hash被盜

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

網路被監聽

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

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

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

mysql設定或者修改新密碼

mysql預設密碼為空,如何設定新密碼或者忘記密碼後找回密碼呢?開啟mysql安裝目錄下的my.ini配置檔案 我這裡是my.ini,可能名字不一樣沒關係只要.ini格式的檔案就行 末尾新增 skip grant tables,儲存後退出。重啟mysql服務後,輸入mysql uroot p,此時直...

mysql8更新密碼不成功

表現為按照官方文件 中的說明b.3.3.2.3 resetting the root password generic instructions 執行alter user root localhost identified by mynewpass 還是不能成功更改 進入mysql docker 發...