Generování klíčů pro symetrické šifrování
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.
Mohlo by vás také zajímat
-
Webdesign: Jak optimalizovat tlačítka na webu
7. března 2024 -
Gaming na HDR monitoru: Stojí to za to?
12. srpna 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024