Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

Generování klíčů pro symetrické šifrování

21. 09. 2004 | Radek Jícha | ASP.NET | Komentáře: 0

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.


Reklama


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Diskuse (počet komentářů: 0)

Buďte prvním návštěvníkem, který přidá nový komentář.

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.