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
-
Jak zabezpečit váš chytrý telefon před kybernetickými hrozbami
30. listopadu 2023 -
Souboj na trhu s CPU pro servery: AMD vs. Intel
8. prosince 2023 -
Zabezpečení e-mailů: Jak můžete chránit vaši firemní komunikaci
13. prosince 2023
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024