密碼攻擊之基於字典和彩虹表的密碼攻擊
一、撞庫攻擊
最近經常聽到撞庫攻擊的有關新聞,撞庫就是黑客通過收集網際網路已洩露的使用者和密碼資訊,生成對應的字典表,嘗試批量登陸其他網站後,得到一系列可以登入的使用者。作為一個小白,我先從破解口令雜湊值的嘗試入手。
二、Hash函式的特點
雜湊函式:把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。數學表述為:h = H(M) ,其中H( )--單向雜湊函式,M--任意長度明文,h--固定長度雜湊值。
程式實現如下:(來自百度百科)
// 說明:Hash函式(即雜湊函式)在程式設計中的應用目標 ------ 把一個物件通過某種轉換機制對應到一個 //size_t型別(即unsigned long)的整型值。 // 而應用Hash函式的領域主要是 hash表(應用非常廣)、密碼等領域。 // 實現說明: // ⑴、這裡使用了函式物件以及泛型技術,使得對所有型別的物件(關鍵字)都適用。 // ⑵、常用型別有對應的偏特化,比如string、char*、各種整形等。 // ⑶、版本可擴充套件,如果你對某種型別有特殊的需要,可以在後面實現專門化。 // ⑷、以下實現一般放在標頭檔案中,任何包含它的都可使用hash函式物件。 //------------------------------------實現------------------------------------------------ #include <string> using std::string; inlinesize_thash_str(const char* s) { unsigned long res = 0; for (; *s; ++s) res = 5 * res + *s; returnsize_t(res); } template <class Key> struct hash { size_toperator () (const Key& k) const; }; // 一般的物件,比如:vector< queue<string> >;的物件,需要強制轉化 template < class Key > size_thash<Key>::operator () (const Key& k) const { size_tres = 0; size_tlen = sizeof(Key); const char* p = reinterpret_cast<const char*>(&k); while (len--) { res = (res<<1)^*p++; } return res; } // 偏特化 template<> size_thash< string >::operator () (const string& str) const { return hash_str(str.c_str()); } typedef char* PChar; template<> size_thash<PChar>::operator () (const PChar& s) const { return hash_str(s); } typedef const char* PCChar; template<> size_thash<PCChar>::operator () (const PCChar& s) const { return hash_str(s); } template<> size_t hash<char>::operator () (const char& x) const { return x; } template<> size_t hash<unsigned char>::operator () (const unsigned char& x) const { return x; } template<> size_t hash<signed char>::operator () (const signed char& x) const { return x; } template<> size_t hash<short>::operator () (const short& x) const { return x; } template<> size_t hash<unsigned short>::operator () (const unsigned short& x) const { return x; } template<> size_t hash<int>::operator () (const int& x) const { return x; } template<> size_t hash<unsigned int>::operator () (const unsigned int& x) const { return x; } template<> size_t hash<long>::operator () (const long& x) const { return x; } template<> size_t hash<unsigned long>::operator () (const unsigned long& x) const { return x; } // 使用說明: // // ⑴、使用時首先由於是泛型,所以要加上關鍵字型別。 // // ⑵、其次要有一個函式物件,可以臨時、區域性、全域性的,只要在作用域就可以。 // // ⑶、應用函式物件作用於對應型別的物件。 //----------------------- hash函式使用舉例 ------------------------- #include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> vstr⑵; vstr[0] = "sjw"; vstr[1] = "suninf"; hash<string> strhash; // 區域性函式物件 cout << " Hash value: " << strhash(vstr[0]) << endl; cout << " Hash value: " << strhash(vstr[1]) << endl; cout << " Hash value: " << hash< vector<string> >() (vstr) << endl; cout << " Hash value: " << hash<int>() (100) << endl; // hash<int>() 臨時函式物件 return 0; }
雜湊函式最大的特點就是單向性(one-way),由明文計算雜湊值是極其容易的,但從雜湊值推得明文在計算上不可行。而hash函式的抵抗強碰撞性和抵抗弱碰撞性,是目前的兩個突破點。
破解口令雜湊值即從這裡進行嘗試。
三、基於彩虹表的雜湊值破解攻擊
1.首先來個題外話,根據口令設定中對字元的要求設定可用字符集和字元數量,假設目前只支援英文字母大小寫和阿拉伯數字0123456789,先基於使用字元生成使用者口令詞典。
使用crunch工具,它的基本語法是 crunch [minimum length] [maximum length] [character set] [options]
-o:這個選項允許你指定輸出列表的檔名稱和位置
-b:這個選項允許你指定每個檔案的最大位元組數。大小可以以 KB/MB/GB 來指定,並且必須和-o START觸發器一起使用。
-t:這個選項允許你指定所使用的模式。
-l:在使用-t選項時,這個選項允許你將一些字元標識為佔位符(@,%,^)
現在要做的是:執行命令來在桌面上建立密碼列表,它最少8 個字母,最大 10 個字元,並且使用字符集ABCDEFGabcdefg0123456789。
crunch 8 10 ABCDEFGabcdefg0123456789 –o /root/Desktop/ generatedCrunch.txt
使用如下指令:crunch 4 5 ABCDEFGabcdefg0123456789 –o /root/Desktop/ generatedCrunch.txt
可使用nano開啟檔案
也可直接開啟。
就這樣,我們使用了Crunch 來生成密碼字典列表。
2.使用彩虹表 rainbowcrack
使用rtgen工具生成彩虹表,具體操作如下圖所示:
指令和選項整理詳細內容參照官方文件:http://project-rainbowcrack.com/documentation.htm
彩虹表生成完畢需要2-7個小時,最後生成.rt檔案。
為簡化實驗資料量,僅用數字生成雜湊值,1-4位:
花費時間約2.5小時。檔案大小為536.9MB。
為了方便使用彩虹表,可以進行排序:
再次嘗試:
基於彩虹表進行雜湊值的破解:
可知該雜湊值破解結果為2342.
使用6666生成雜湊值:
e9510081ac30ffa83f10b68cde1cac07
執行之後:
Yes!!!