緣由:最近北京市二環內大興土木,各種挖溝埋線。忽而一紙通令周末斷電,故多年不斷電的服務器,便令人有了關機后是否還能正常啟動的隱憂。其中一台較年邁的服務器中搭載有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
中的mysql\bin
文件夾下執行下面語句,用於跳過用戶驗證訪問數據庫。
當然,如果本機有正在運行的mysql
的服務需要先停掉。
1mysql\bin>mysqld --skip-grant-tables
- 然后打開另外一個
cmd
,同樣在mysql\bin
文件夾下執行mysql
訪問數據庫。
1mysql\bin>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
有興趣的請自行擴展咯