1. 程式人生 > >密碼攻擊之基於字典和彩虹表的密碼攻擊

密碼攻擊之基於字典和彩虹表的密碼攻擊

一、撞庫攻擊

最近經常聽到撞庫攻擊的有關新聞,撞庫就是黑客通過收集網際網路已洩露的使用者和密碼資訊,生成對應的字典表,嘗試批量登陸其他網站後,得到一系列可以登入的使用者。作為一個小白,我先從破解口令雜湊值的嘗試入手。

二、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!!!