MySQL的Root使用者密碼

Moonrush發表於2018-06-14

緣由:最近北京市二環內大興土木,各種挖溝埋線。忽而一紙通令週末斷電,故多年不斷電的伺服器,便令人有了關機後是否還能正常啟動的隱憂。其中一臺較年邁的伺服器中搭載有MySQL資料庫。資料庫內容本屬於外包專案不需要多操心,但時至於此,為了資料安全備份一下,順便檢視下資料庫的結構什麼的,也在情理之中。但無奈的是,部署時間過於久遠,無人清楚root的密碼,由此引發的一系列思考和操作,便記錄於此。

MySQL資料結構

MySQL在安裝的時候會預設構建一個叫mysql的資料庫,其中有名為user的表,其中主要定義了訪問資料庫的使用者名稱密碼以及CURD許可權等。在訪問MySQL的時候,會預設到user表裡驗證當前使用者的資訊是否匹配。

在首次安裝MySQL的時候,預設會產生一個root使用者,密碼為空。許可權固然是最大的,什麼都能改,當然也是非常不安全的。所以一般安裝之處都會給root設定一個密碼。

Table user

Host User Password
localhost root *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
% root *23AE809DDACAF96AF0FD78ED04B6A265E05AA257

從表獲取的*23AE809DDACAF96AF0FD78ED04B6A265E05AA257便是root使用者的密碼,只不過這是加密之後的,也就是說,直接輸入這麼一長串字串,是不正確的。於是乎出現了下面的疑問:

  • 在不知道密碼的前提下,有方法知道root的密碼麼?
  • 在不知道密碼的前提下,有方法訪問資料庫麼?

MySQL加密方式

想要了解提出的疑問,首先還是先了解下MySQL的密文是怎麼來的。
MySQL內建有PASSWORD()函式,目的就是將明文轉換為密文,於是簡單做了個實驗。

1SELECT PASSWORD(`123`)

結果:*23AE809DDACAF96AF0FD78ED04B6A265E05AA257

說明明文123對應的密文就是這串帶*的字串。(所以我就很Lucky的知道了root的密碼
但這依舊不能解決疑問,還是要從原理入手,於是查到了MySQL的加密演算法SHA-1百度百科-SHA-1演算法)。

演算法過程這裡不涉及,但是需要了解的是SHA-1加密演算法有如下特性

  • 不可以從訊息摘要中復原資訊
  • 兩個不同的訊息不會產生同樣的訊息摘要

簡而言之,即使知道了密文,也沒有辦法通過演算法的方式獲取明文。
這簡直就是直接斷了後路…
可事實是Google在2017年時就已經宣佈成功攻破SHA-1加密演算法,只不過破解它需要的造價不是我等窮苦大眾所能接受的。

現在網上也有很多的線上加密解密的工具,例如線上加密解密。但絕大部分在雜湊/雜湊演算法領域,也僅提供加密不提供解密。
所以結論依舊是,沒辦法!

退而求其次,終歸是有辦法讓我們訪問自己伺服器上的資料庫內容的吧?

無密碼MySQL訪問方法

  1. cmd中的mysqlin資料夾下執行下面語句,用於跳過使用者驗證訪問資料庫。
    當然,如果本機有正在執行的mysql的服務需要先停掉。
1mysqlin>mysqld --skip-grant-tables
  1. 然後開啟另外一個cmd,同樣在mysqlin資料夾下執行mysql訪問資料庫。
1mysqlin>mysql
  1. 訪問名為mysql的資料庫。
1mysql>use mysql;
2database changed
  1. 查詢user表中已有的使用者(可以省略)。
1mysql>SELECT Host,User,Password FROM User;
  1. 如果要更改現有使用者的密碼,例如root@localhost
1mysql>UPDATE user SET Password=PASSWORD(`123`) WHERE User=`root` AND Host=`localhost`;
  1. 現有的使用者可能正在被某些應用使用,這種情況下可以只增加一個新的使用者用於檢視資料。
1mysql>INSERT INTO user (Host,User,Password) VALUES (`localhost`,`NewUser`,PASSWORD(`123`));

至此我們便有一個已知密碼的使用者,可以正常通過使用者名稱密碼訪問資料庫了。


擴充套件

SHA-1破解
常用加密方式AESDESSHA-256MD5BASE64

有興趣的請自行擴充套件咯

相關文章