1. 程式人生 > >MySQL:密碼加密方式

MySQL:密碼加密方式

我們先來看一下mysql的加密方式:

mysql> select password('abc');
+-------------------------------------------+
| password('abc')                           |
+-------------------------------------------+
| *0D3CED9BEC10A777AEC23CCC353A8C08A633045E |
+-------------------------------------------+

mysql> select
sha1('abc'); +------------------------------------------+ | sha1('abc') | +------------------------------------------+ | a9993e364706816aba3e25717850c26c9cd0d89d | +------------------------------------------+ mysql> select sha1(0xa9993e364706816aba3e25717850c26c9cd0d89d); +
--------------------------------------------------+ | sha1(0xa9993e364706816aba3e25717850c26c9cd0d89d) | +--------------------------------------------------+ | 0d3ced9bec10a777aec23ccc353a8c08a633045e | +--------------------------------------------------+ -- 或者直接用複合函式模擬: mysql> select upper(sha1(
unhex(sha1('abc')))); +------------------------------------------+ | upper(sha1(unhex(sha1('abc')))) | +------------------------------------------+ | 0D3CED9BEC10A777AEC23CCC353A8C08A633045E | +------------------------------------------+

講下hex和unhex兩個函式:
hex的輸出是字串,是輸入內容的16進位制字串表示形式(如字串"0A"是16進位制數0xA的表示形式)。

mysql> select hex(10); --輸入內容是10,輸出是10的16進位制字串:"A"
+---------+
| hex(10) |
+---------+
| A       |
+---------+

mysql> select hex('10'); --字串'10'在記憶體中就是:0x31,0x30(從低地址到高地址,共兩個位元組),hex輸出為字串'3130'
+-----------+
| hex('10') |
+-----------+
| 3130      |
+-----------+

unhex正相反,輸入是字串,輸出是十六進位制數。
mysql> select unhex('31');  --字串"31"經過unhex函式會輸出數字0x31,0x31列印到mysql shell上顯示為字元'1'
+-------------+
| unhex('31') |
+-------------+
| 1           |
+-------------+

mysql> select unhex(0x3331); --16進位制數0x3331實際上是字串"31",原理同上。
+---------------+
| unhex(0x3331) |
+---------------+
| 1             |
+---------------+

sha1函式的輸出是一個字串(實際上是一個160(2進位制)位數的16進位制字串表示形式),unhex將這個字串轉為其實際的數字(也就是那個160位2進位制數),然後對這個數再次做sha1雜湊運算,得到的字串就是mysql密碼加密後的密文。


再看一下我們用shell怎麼模擬mysql對密碼加密的過程:

[[email protected] dir]# echo -n "abc" | sha1sum 
a9993e364706816aba3e25717850c26c9cd0d89d  -
[[email protected] dir]# echo -n "a9993e364706816aba3e25717850c26c9cd0d89d" | xxd -r -ps | sha1sum 
0d3ced9bec10a777aec23ccc353a8c08a633045e  -

xxd命令是檢視二進位制檔案的,詳細使用請參考shell命令的筆記。


如何找出mysql密碼:

mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+

/var/lib/mysql 目錄就是mysql資料檔案的儲存目錄,其中一個數據庫對應一個子資料夾,資料庫資料夾裡有很多檔案,3個檔案對應本資料庫下面的一張表。
如mysql.user表對應的資料檔案為:

[[email protected] dir]# ll -h /var/lib/mysql/mysql/user.*
-rw-rw----. 1 mysql mysql  11K 4月  26 14:16 /var/lib/mysql/mysql/user.frm  #表結構檔案
-rw-rw----. 1 mysql mysql 1004 4月  27 11:06 /var/lib/mysql/mysql/user.MYD  #表資料檔案
-rw-rw----. 1 mysql mysql 2.0K 5月   2 09:51 /var/lib/mysql/mysql/user.MYI  #表索引等資訊檔案

可以檢視二進位制資料檔案(user.MYD)獲取mysql的使用者和加密後的密碼:

[[email protected] dir]# xxd /var/lib/mysql/mysql/user.MYD
0000000: 0500 7000 3f00 0000 0000 0001 7cfb 0ffc  ..p.?.......|...
0000010: 096c 6f63 616c 686f 7374 0472 6f6f 742a  .localhost.root*
0000020: 4444 3141 4343 3539 3346 3438 4443 3935  DD1ACC593F48DC95
0000030: 3932 3130 4138 4135 3234 3735 3838 3739  9210A8A524758879
0000040: 4232 4244 4134 4530 0202 0202 0500 7800  B2BDA4E0......x.
0000050: 4700 0000 0000 0001 34fb 0ffc 1161 6d62  G.......4....amb
0000060: 6172 692e 6d61 7374 6572 2e63 6f6d 0472  ari.master.com.r
0000070: 6f6f 742a 4444 3141 4343 3539 3346 3438  oot*DD1ACC593F48
0000080: 4443 3935 3932 3130 4138 4135 3234 3735  DC959210A8A52475
0000090: 3838 3739 4232 4244 4134 4530 0202 0202  8879B2BDA4E0....
00000a0: 0500 7000 3f00 0000 0000 0002 a8fb 0ffc  ..p.?...........
00000b0: 0931 3237 2e30 2e30 2e31 0472 6f6f 742a  .127.0.0.1.root*
00000c0: 4444 3141 4343 3539 3346 3438 4443 3935  DD1ACC593F48DC95
00000d0: 3932 3130 4138 4135 3234 3735 3838 3739  9210A8A524758879
00000e0: 4232 4244 4134 4530 0202 0202 0500 6a00  B2BDA4E0......j.
...省略n行...

可以用上面的mysql對使用者密碼的加密演算法建立彩虹表,然後破解mysql使用者的密碼。