緣由:最近北京市二環內大興土木,各種挖溝埋線。忽而一紙通令週末斷電,故多年不斷電的伺服器,便令人有了關機後是否還能正常啟動的隱憂。其中一臺較年邁的伺服器中搭載有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訪問方法
- 在
cmd
中的mysqlin
資料夾下執行下面語句,用於跳過使用者驗證訪問資料庫。
當然,如果本機有正在執行的mysql
的服務需要先停掉。
1mysqlin>mysqld --skip-grant-tables
- 然後開啟另外一個
cmd
,同樣在mysqlin
資料夾下執行mysql
訪問資料庫。
1mysqlin>mysql
- 訪問名為
mysql
的資料庫。
1mysql>use mysql;
2database changed
- 查詢
user
表中已有的使用者(可以省略)。
1mysql>SELECT Host,User,Password FROM User;
- 如果要更改現有使用者的密碼,例如
root@localhost
。
1mysql>UPDATE user SET Password=PASSWORD(`123`) WHERE User=`root` AND Host=`localhost`;
- 現有的使用者可能正在被某些應用使用,這種情況下可以只增加一個新的使用者用於檢視資料。
1mysql>INSERT INTO user (Host,User,Password) VALUES (`localhost`,`NewUser`,PASSWORD(`123`));
至此我們便有一個已知密碼的使用者,可以正常通過使用者名稱密碼訪問資料庫了。
擴充套件
SHA-1
破解
常用加密方式AES
,DES
,SHA-256
,MD5
,BASE64
有興趣的請自行擴充套件咯