V druhém pokračování miniseriálu o šifrování dat se podíváme na hašovací funkce, jejich význam a použití a nakonec si budete moci vyzkoušet, jak dlouho trvá prolomení MD5 haše.
V minulém díle jsme si ukázali způsob, jak zakódovat text do nečitelné podoby nebo jej přímo zašifrovat symetrickým algoritmem, jakým je například známý TripleDES či RijnDael za pomoci hesla. V dnešním pokračování našeho miniseriálu o základech kryptografie se podíváme na hašování dat a ukážeme si algoritmus pro jeho prolomení. Kód v dnešním článku slouží pouze k ukázce toho, jak jednoduše by mohl útočný algoritmus vypadat, v praxi se totiž používají složitější mechanizmy a zapojují se výkonnější počítače nebo rovnou superpočítače, které testují sílu kryptografických metod a systémů.
Jak na hašování
Hašování slouží k jednosměrnému zakódování množiny bajtů. Výsledkem tohoto procesu je relativně malé hexadecimální číslo, které je pro tuto množinu bajtů unikátní a představuje její „otisk prstu“, což je základní podmínkou všech kvalitních hašovacích algoritmů. Jako uživatel tedy mohu mít jistotu, že po transformaci sekvence X dostanu výsledek Y a neexistuje žádná jiná sekvence bajtů, se kterou bych dostal stejný výsledek Y. Tento jev se nazývá kolizí a každá hašovací funkce se s tímto problémem potýká. Hašování se používá nejčastěji při archivaci hesel v databázi. Pokud útočník získá databázi obsahující zahašovaná hesla, získá tím pouze neúčelnou změť znaků. Naopak, pokud se vlastník hesla pokusí přihlásit, je zadané heslo zahašováno a následně porovnáno s heslem z databáze. Pokud jsou stejné, znamená to, že je zadané heslo správně.
Výpočet MD5 otisku slova bobik v našem programu
Dalším možným použitím hašování je ověření totožnosti dvou objemných bloků dat, kde neporovnáváme jednotlivé bloky, ale pouze jejich hašový kód. K hašování slouží řada algoritmů, my se podíváme na hašování pomocí toho nejznámějšího – MD5. V prostředí Microsoft .NET Frameworku k tomu slouží třída MD5 ze jmenného prostoru System.Security.Cryptography a takto vypadá její použití pro výpočet hašového kódu ze řetězce:
public string CalculateMD5Hash(string input)
{
// Výpočet MD5 haše ze vstupu
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
// Převod pole bajtů na hexadecimální číslo
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}
Za jak dlouho prolomíte hash
Následují algoritmus slouží k rozlousknutí zahašovaného textu.
Známe MD5 hash a délku původního hesla (4 znaky)
Výsledek je odhalen během minuty
public string MD5CrackAlgorithm(string[] alphabet, string md5hash, int lenght)
{
Random rand = new Random();
string result = "";
while (true)
{
for (int x = 0; x < lenght; x++)
{
result += alphabet[rand.Next(0, alphabet.Length )];
}
if (md5hash == CalculateMD5Hash(result))
return result;
result = "";
}
}
Pro zjištění, jak dlouho trvala určitá operace slouží třída systém.Diagnostics.StopWatch:
Stopwatch sw = new Stopwatch();
sw.Start();
NějakáOperace();
sw.Stop();
MessageBox(“Operace trvala: “ + sw.Elapsed.ToString());
Jelikož je hašování jednosměrné, nemělo by jít rozlousknout jinak než takzvanou. “hrubou silou”, kdy se zkouší veškeré kombinace písmen o určité délce zahašovat a porovnat s originálem. Nento úkon je však velice pomalý, což je patrné i z následujícítabulkyčasů zaznamenaných na obyčejném počítači:
Počet znaků | Doba prolomení |
3 | 1 s |
4 | 40 s |
5 | 30 minut |
6 | den |
7 | měsíc |
8 | 2 roky |
Zde je vidět, že k prolomení haše obyčejného hesla o délce sedmi znaků by bylo zapotřebí 1 měsíc výpočetního výkonu na běžném počítači, což je dostatečná doba na to, aby odradila většinu možných útočníků.
LACAL Lausanne PlayStation Lab: sen každého herního pařana
Do výpočtu se tak často zapojují superpočítače, na kterých se testuje například síla nejrůznějších šifrovacích metod, u kterých se používá hašování. O takovém pokusu jsme ostatně psali již na začátku letošního roku, kdy jistá mezinárodní skupina použila několik desítek do sítě zapojených PlayStationů, aby zkonstruovala alternativní obsah, který měl stejný MD5 hash – otisk prstů. Podařilo se jim tedy vypočítat kolizi, o které jsme psali v úvodu. Jelikož byl v tomto případě MD5 otisk součástí elektronického podpisu, respektive důvěryhodného SSL certifikátu, inženýrům se podařilo vyrobit alternativní a platný SSL certifikát, který ovšem daná autorita nikdy nevydala. Prolomení haše a jeho kolize je tak poměrně závažný bezpečnostní systém i s ohledem na skutečnost, že superpočítačový výkon je stále dostupnější především ve formě velmi výkonných cloud-computingových webových hostingů.
A to je vše. Nakonec si hašování a jeho prolomování můžete sami vyzkoušet, ke stažení totiž opět nabízíme zdrojové kódy včetně projektu pro Visual Studio 2008 (Express Edition) a spustitelný program.
Mareš, Amadeo: 1001 tipů a triků pro C#
Nestačí vám náš seriál? Pořiďte si knihu jeho autora, ve které vás seznámí s tisícovkou programovacích tipů a technik.Díky velkému počtu tipů, návodů, triků a rad kniha poslouží při každé příležitosti. Kdykoli si nevíte rady, stačí nalistovat příslušnou stranu a problém okamžitě vyřešit. Tipy a triky míří především na začínající programátory; užitečné rady tu ovšem najdou i pokročilejší vývojáři a ostřílení znalci. SOučástí publikace je i přiložené DVD, na kterém najdete bezplatné vývojové prostředí Visual C#, databázový server a především všechny zdrojové kódy z knihy, takže je budete moci okamžitě použít.Webové stránky knihy.