咱們先來看一下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密碼加密後的密文。sql
再看一下咱們用shell怎麼模擬mysql對密碼加密的過程:shell
[root@ambari dir]# echo -n "abc" | sha1sum a9993e364706816aba3e25717850c26c9cd0d89d - [root@ambari 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表對應的數據文件爲:加密
[root@ambari 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的用戶和加密後的密碼:spa
[root@ambari 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用戶的密碼。code