Staňte se programátorem: Prolomení MD5

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ě.

md5 hash.png
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.

pepa.png
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í
31 s
440 s
530 minut
6den
7měsíc
82 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ů.

playstation.png playstation.png
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#

c_kniha_mares.pngNestačí 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.

Diskuze (22) Další článek: Na Aukru opět řádil podvodník

Témata článku: , , , , , , , , , , , , , , , , , ,