Přeskočit na obsah

Secure Hash Algorithm

Z Wikipedie, otevřené encyklopedie

SHA (Secure Hash Algorithm) je rozšířená hašovací funkce, která vytváří ze vstupních dat výstup (otisk) fixní délky. Otisk je též označován jako miniatura, kontrolní součet (v zásadě nesprávné označení), fingerprint, hash (česky někdy psán i jako haš). Jeho hlavní vlastností je, že malá změna na vstupu vede k velké změně na výstupu, tj. k vytvoření zásadně odlišného otisku.

Popis

SHA navrhla organizace NSA (Národní bezpečnostní agentura v USA) a vydal NIST (Národní institut pro standardy v USA) jako americký federální standard (FIPS). SHA je rodina pěti algoritmů: SHA-1, SHA-224, SHA-256, SHA-384 a SHA-512. Poslední čtyři varianty se souhrnně uvádějí jako SHA-2. SHA-1 vytvoří obraz zprávy dlouhý 160 bitů. Čísla u ostatních čtyř algoritmů značí délku výstupního otisku v bitech.

SHA se používá u několika různých protokolů a aplikací, včetně TLS a SSL, PGP, SSH, S/MIME a IPsec, ale i pro kontrolu integrity souborů nebo ukládání hesel. Je považována za nástupce hašovací funkce MD5.

Bezpečnost

Hašovací algoritmy jsou „bezpečné“, pokud je velmi obtížné (tj. se současnými prostředky prakticky nemožné):

  1. najít zprávu, která odpovídá svému otisku
  2. najít dvě rozdílné zprávy, které mají stejný otisk

Bezpečnost SHA-1 byla poněkud zpochybněna kryptografickými odborníky[1], ačkoli nebyly oznámeny žádné útoky na varianty SHA-2. Varianty SHA-2 jsou algoritmicky stejné s algoritmy SHA-1. Proto jsou snahy o vývoj vylepšených hašovacích funkcí[2][3]. Veřejná výběrová soutěž pro novou SHA-3 funkci byla formálně oznámena 2. listopadu 2007 ve Federal Register[4] – "NIST usiluje o zavedení jednoho nebo více nových hašovacích algoritmů pomocí veřejné konkurence stejně jako u vývoje pro Advanced Encryption Standard (AES)[5]." V současnosti (květen 2012) je známo pět finalistů, o vítězi se má rozhodnout do konce roku 2012.

SHA-0 a SHA-1

Původní specifikace algoritmu byla publikována v roce 1993 jako Secure Hash Standard (FIPS PUB 180) vedením americké normalizační agentury NIST. Tato verze je dnes známá jako SHA-0. NSA jí stáhla krátce po vydání a nahradila ji upravenou verzí, vydanou v roce 1995 (FIBS PUB 180-1) obvykle uváděnou jako SHA-1. SHA-1 se liší od SHA-0 pouze jednou bitovou rotací provedenou pomocí jednocestné funkce. Změna byla udělána podle NSA. Oprava vady v původním algoritmu snižuje šifrovací bezpečnost. NSA neposkytla žádné další objasnění nebo vysvětlení, jaká vada byla opravena. Slabé stránky byly následovně ohlášeny v SHA-0 i v SHA-1. SHA-1 se zdá být více obranyschopná proti útokům, to podporuje tvrzení NSA, že změnami stoupá bezpečnost.

SHA-1 (stejně jako SHA-0) vytváří 160 bitový obraz zprávy s maximální délkou 264 - 1 bitů. Je založený na principech, které používal Ronald L. Rivest z Massachusettského technologického institutu (MIT) v návrhu MD4 a MD5 algoritmů.

SHA-2

NIST zveřejnila čtyři další hashovací funkce SHA, které jsou pojmenovány podle své délky (v bitech): SHA-224, SHA-256, SHA-384 a SHA-512. Algoritmy jsou společně označovány jako SHA-2.

Algoritmy byly poprvé zveřejněny v roce 2001 v návrhu standardu FIPS PUB 180-2, který obsahoval i SHA-1 a byl vydán jako oficiální standard v roce 2002. V únoru 2004 bylo zveřejněna změna, která definovala další variantu SHA-224, která odpovídá délkou klíče dvou-klíčovému Triple DES. Tyto varianty jsou patentovány v patentu US 6829355 a Spojené státy je uvolnily k použití bez licenčních poplatků.

SHA-2 není široce používáno i přes lepší zabezpečení (ve srovnání se SHA-1). Důvodem může být nedostatek podpory pro SHA-2 na systémech Windows XP SP2 a starších,[6] nedostatečné vnímání naléhavosti přejít na SHA-2, protože kolize SHA-1 ještě nebyly nalezeny, nebo čekání na standardizaci SHA-3. SHA-256 se používá k ověřování softwarových balíků linuxové distribuce Debian.[7] SHA-256 a SHA-512 jsou navrženy pro použití v DNSSEC. Rovněž datové schránky v České republice používají SHA-2.[8] Podle směrnice NIST mají americké vládní agentury přestat používat SHA-1 po roce 2010. Také dokončení standardizace SHA-3 mohou urychlit odchod od SHA-1.

Dešifrování

Ideální hašovací funkce porušující první výše uvedené kritérium, nalezení zprávy, která koresponduje se svým otiskem, může být použita jako hrubá síla při hledání 2L výpočtů, kde L je velikost bitů v otisku zprávy. Toto se nazývá vzorový útok (preimage attack). Druhé kritérium, nalezení dvou rozdílných zpráv, které mají stejný otisk, nazýváme kolize. Ta vyžaduje jen 2L/2 výpočtů k provedení tzv. narozeninového útoku (birthday attack). Pro pozdější důvody síly hašovací funkce je obvyklé srovnání se symetrickou šifrou o poloviční délce otisku zprávy. Z tohoto důvodu se SHA-1 považuje za hašovací algoritmus se sílou 80 bitů.

Odborníci na dešifrování vytvořili kolizní pár pro SHA-0 a našli algoritmus, který může vytvořit SHA-1 kolizi ve značně méně než ve zmiňovaných 280 výpočtech.

Zdá se, že tento případ rozpoutal častou migraci k silnějším hashům. Některé z aplikací, které používají šifrovací hashe jako heslo paměti, jsou jen minimálně ovlivněny kolizním útokem. Postavení hesla, které použijeme pro účet, vyžaduje vzorový útok a přístup k hashi z originálního hesla, které může a nemusí být triviální. Obrácené šifrovací heslo není možné vytvořit při útoku.

V případě podpisu dokumentu, nemůže útočník jednoduše padělat podpis z již existujícího dokumentu. Útočník by měl vytvořit dva dokumenty, jeden neškodný a druhý škodlivý, a požádat držitele privátního klíče o podpis na neškodném dokumentu. Jsou zde praktické okolnosti, kdy je to možné použít.

Využití funkce SHA-1

Funkce SHA-1 je stále jednou z nejrozšířenějších funkcí pro hashování v různých programovacích jazycích. Využíváme jí například pro hashování hesel uložených v databázi, tak aby nebylo možné zjistit jaké původní heslo uživatel použil.

Jednoduchý příklad za využití HTML a jazyka PHP

Formulář pro přihlášení (formular.html)

<html>
  <head>
    <title>Prihlaseni</title>
  </head>
  <body>
    <form method="post" action="prihlaseni.php">
      Jmeno: <input type="text" name="username" /> <br />
      Heslo: <input type="password" name="password" />   <br />
      <input type="submit" value="Prihlasit" />
    </form>
  </body>
</html>

Skript pro zpracovaní údajů (prihlaseni.php)

<?php
  Define("USERNAME", "Admin"); //předdefinované uživatelské jméno                          
  Define("HASH", "7c4a8d09ca3762af61e59520943dc26494f8941b"); //zahashované heslo
  
  if(!empty($_POST["username"]) AND  !empty($_POST["password"])) {  //zjistíme zda uživatel zadal jméno i heslo
    
    if($_POST["username"] == USERNAME AND sha1($_POST["password"]) == HASH) { //ověříme zda se zadané jméno shoduje s předdefinovaným jménem a zda se shoduje hash zadaného hesla s předdefinovaným hashem; k zahashování zadaného hesla je použita funkce sha1()
      echo "Obsah zabezpečený jménem a heslem.";
      /*
        Sem se dostane uživatel se správnými přístupovými udaji. 
        Můžeme zde nastavit např. session a vytvořit tak nějakou zabezpečenou přihlašovací sekci.
      */
        
    }
    else echo "Špatné uživatelské jméno nebo heslo!";
  } 
?>

Všimněte si, že nikde v kódu není uvedeno předdefinováno heslo, uveden je pouze hash hesla. V tomto příkladu je použito heslo „123456“ (bez uvozovek). Pro další zvýšení ochrany hesla je velmi vhodné při vytváření hashe použít kryptografickou sůl.

Reference

V tomto článku byl použit překlad textu z článku SHA-1 na anglické Wikipedii. V tomto článku byl použit překlad textu z článku SHA na anglické Wikipedii.


Související články

Externí odkazy