V jednom z předchozích článků jsem se věnoval základním kryptografickým postupům. Záměrně jsem při tom téměř vynechal problematiku generování klíčů a jejich následné uchovávání, protože jde o problém natolik zásadní, že se mu budu věnovat podrobněji.

Symetrické šifrování v kostce…

Toto téma již probíráno bylo ve zmiňovaném článku Cryptography v .NET – Symmetric a Asymmetric encryption, proto připomenu jen to nejnutnější. Symetrické šifrování funguje tak, že je vždy šifrován určitý blok dat pomocí klíče a v závislosti na bloku předchozím. Aby tedy mohl být šifrován první blok, je zapotřebí inicializační vektor (dále jen IV), který je použit jako nultý blok. Klíč a IV jsou automaticky generovány pro každou instanci třídy symetrického šifrování. Navíc tyto třídy vystavují ještě metody GenerateKey() a GenerateIV().

V praxi se však dají použít i jiné techniky pro práci s klíči a vektory. Jedna z nich využívá techniku hash-algoritmů, pomocí kterých převedeme nějakou tajnou frázi nebo heslo do jejich hešové reprezentace a tu potom zčásti použijeme jako klíč a zbytek necháme pro IV. Je to vcelku rozumné řešení, proto se na něj podívejme zblízka.

Generování klíče a IV pomocí hashing algorithms

Hešovací algoritmy fungují v zásadě tak, že vstup o libovolné délce převedou na jejich hešovou reprezentaci o délce fixní. Třeba SHA256 převede libovolný vstup na sekvenci 256 bitů. Pokud tedy pomocí některého z algoritmů dostupných v .NET Frameworku (SHA1, SHA256, SHA384, SHA512, MACTripleDES a jiné) převedeme jakoukoli tajnou frázi nebo heslo do jejich hešové podoby, vezmeme pak část těchto dat jako klíč (záleží na požadované velikosti klíče) a další část vezmeme pro IV (taktéž záleží na požadované velikosti). Chceme-li tedy generovat klíč a IV, může zde nastíněný postup převeden do kódu vypadat zhruba takhle:

private void HashKey(string heslo)
{
  key = new byte[24];
  IV = new byte[16];
  byte[] bHeslo = Encoding.ASCII.GetBytes(heslo);
  SHA384Managed sha384 = new SHA384Managed();
  sha384.ComputeHash(bHeslo);
  byte[] result = sha384.Hash;
  for(int i=0;i<24;i++)
    key[i] = result[i];
  for(int i=24;i<40;i++)
    IV[i-24] = result[i];
}

V uvedeném kódu předpokládám, že jsme někde na úrovni třídy deklarovali proměnné key a IV typu byte[]. Úvod ukázky převádí řetězcovou (string) hodnotu tajné věty do její hešové reprezentace. Závěrečné dva cykly prochazejí výstup heše po jednotlivých prvcích pole a přesouvá je postupně do klíče a do IV.

Další možností správy klíčů a IV je uložení jejich hodnot do souboru web.config. Ukládání hodnot do tohoto souboru je také relativně bezpečný způsob, protože ASP.NET je nastaveno tak, že není možné tento soubor zobrazit v prohlížeči.

<appSettings>
  <add key=“_klic“ value=“hodnota_klice“ />
  <add key=“_IV“ value=“IV“ />
</appSettings>

Pokud chcete mít svou aplikaci zabezpečenou co nejvíce, určitě je nejvhodnější generovat klíč a IV vždy pro každou příležitost zvlášť. Pak nastává ovšem problém se „skladováním“ klíčů. Nabízí se několik relativně složitých cest, které vždy vedou přes větší počet řádků kódu a vždy s sebou nesou riziko – pokud skladujete někde soukromý klíč, je tu vždy možnost, že se dostane do nepravých rukou. Nebylo by třeba nemožné k šifrovanému textu „připojit“ například na konec klíč a na začátek IV. Při dekryptování byste potom klíč i IV „odloupli“ a dešifrovali. Pokud by však útočníkem byl bývalý zaměstnanec firmy, měl by pozici značně ulehčenu. Žádný způsob není stoprocentní, vždy záleží na konkrétní situaci. V zásadě se musíte snažit útočníka spíše odradit. Když bude váš web víc chráněn než konkurenční, spíše si to rozmyslí.

Nastínil jsem vám zde několik možných způsobů práce s hesly. Osobně se nejvíce přikláním ke způsobu prvnímu, další jsem uvedl spíše na doplnění a pro komplexnost. Netrvdím, že to jsou jediné způsoby, to v žádném případě! To by to měli hackeři moc jednoduché. Pokud si s kódem dostatečně pohrajete a použijete i více algoritmů, máte poměrně velikou šanci na úspěch. Citlivá data se nebojte šifrovat klidně i vícekrát. V žádném případě se však nesnažte vymyslet vlastní algoritmy. Je málo pravděpodobné, že by se vám povedlo vyvinout výkonější a bezpečnější než ty, které knihovna nabízí.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět