Cryptography v .NET – Symmetric a Asymmetric encryption
Na internetu existuje mnoho webů, které by měly určitá svá data chránit před nežádoucími zraky. Praxe je bohužel taková, že velké množství webů uchovává například informace o uživatelích v XML souboru v čistém textu. To není příliš optimální řešení a myslím si, že by stálo za to, dát si tu práci a alespoň se podívat, co nám .NET v tomto směru nabízí.
Kryptografie se používá všude tam, kde je potřeba chránit data, od ukládání uživatelských hesel po šifrování tajných emailů. Záleží jen a jen na vás, co potřebujete chránit. Význam kryptografie je mimořádný především v nezabezpečených sítích, jako je internet. Kdokoli, kdo bude třeba znát adresářovou strukturu vašeho webu, může si například otevřít XML soubor, kde máte uložena hesla uživatelů. Pokud pak budou tato hesla v čistém textu, máte problém. Pokud použijete některý z šifrovacích algoritmů, bude mít útočník přinejmenším více práce hesla získat. Kolik, to záleží především na šifrovacího volbě algoritmu. Pokud použijete dostatečně silné šifrování, většinou se útočník vzdá a raději si najde jinou oběť.
Asymmetric encryption
Asymmetric encryption (nebo také šifrování s veřejným klíčem) využívá k šifrování a dešifrování dvou klíčů – veřejného a privátního (public a private). Veřejný klíč je dostupný všem, jak už z názvu vyplývá, a je používán k zašifrování dat, která mají být poslána majiteli privátního klíče. Privátní klíč se pak používá k dešifrování dat a jeho použití je účinné pouze tehdy, byl-li použit správný veřejný klíč k zašifrování. Tyto algoritmy jsou většinou používány k šifrování menších objemů dat. Framework .NET nám z asymetrických šifer nabízí DSA (Digital Signature Algorithm) a RSA.
Symmetric encryption
Symmetric encryption (nebo také šifrování privátním klíčem) využívá k šifrování a dešifrování pouze jednoho klíče a navíc takzvaný inicializační vektor (IV). Symetrické algoritmy jsou vcelku rychlé a mohou být použity i pro větší objemy dat. Použijeme-li v symetrickém šifrování jeden klíč, bude vstup vždy reprezentován stejným šifrovaným výstupem. Symetrické algoritmy šifrují data po blocích (proto jsou někdy nazývány blokovým šifrováním). V .NET je navíc blok vždy šifrován v závislosti na bloku předchozím – aby bylo tedy možno zašifrovat první blok, je právě zapotřebí inicializačního vektoru. Framework .NET nám nabízí tyto symetrické algoritmy:
- DES šifruje 64-bitové bloky použitím 64-bitového klíče. Tento algoritmus je poněkud zastaralý a nevyhovující. V současné době jsou již počítače natolik výkonné, že dokáží vyhledat všechny možné klíče během relativně krátké doby.
- 3DES (Triple-DES) byl navržen, aby vyřešil bezpečnostní nedostatky klasického DES algoritmu. Tento algoritmus používá taktéž 64-bitový klíč, ale slučuje v sobě tři průběhy klasického DES algoritmu. Text je tedy bezpečněji zašifrován, ale šifrování zabere třikrát více času než klasický DES algoritmus.
- RC2 může mít libovolně veliký klíč v rozmezí od 8 do 64 bitů. RC2 byl navržen jako bezpečnější náhrada algoritmu DES, jenže limit .NET Frameworku je stejně jako u DES 64 bitů, takže jeho jedinou výhodou oproti DES je poněkud vyšší rychlost.
- Rijndael je z uvedeného výčtu nejspolehlivější. Byl navržen a schválen teprve nedávno jako náhrada za již nevyhovující DES algoritmy. Klíč tohoto algoritmu může být veliký 128, 192 nebo 256 bitů.
Myslím, že nyní znáte z kryptografie v .NET Frameworku to nejdůležitější, nyní bych asi měl uvést nějaký příklad. Zkusíme napsat jednoduchou metodu, která nám zašifruje v parametru předaný text pomocí algoritmu Rijndael. Upozorňuji, že všechny šifrovací třídy (RijndaelManaged, RC2 a další) patří do jmenného prostoru System.Security.Cryptography
. Teď tedy příklad použití algoritmu Rijndael:
string RijndaelEncryptor(string text)
{
RijndaelManaged rijndael = new RijndaelManaged();
byte[] key;
byte[] IV;
rijndael.GenerateKey();
rijndael.GenerateIV();
key = rijndael.Key;
IV = rijndael.IV;
ICryptoTransform encryptor = rijndael.CreateEncryptor();
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
byte[] input = Encoding.UTF8.GetBytes(text);
// zapiseme do CryptoStreamu
csEncrypt.Write(input, 0, input.Length);
csEncrypt.FlushFinalBlock();
// prevedeme MemoryStream na string
return (Convert.ToBase64String(msEncrypt.ToArray()));
}
Použitá metoda je poněkud odlehčená, ale jako demonstrace zcela postačuje. Pro náš účel prozatím stačí generovat klíč a inicializační vektor pomocí metod Rijndael.GenerateKey()
a GenerateIV()
, v praxi se však jako klíč a IV někdy používá vybraná fráze, zašifrovaná algoritmem nevyžadující klíč (hash algoritmus, například SHA).
Úvodní část metody nepotřebuje vysvětlení, podívejte se až na řádek ICryptoTransform encryptor = rijndael.CreateEncryptor();
. Tady vytváříme Encryptor. (Pokud bychom chtěli dešifrovat již šifrovaný text, volali bychom metodu CreateDecryptor()
a postup by byl analogický, jen s několika málo rozdíly). Na dalších řádcích už jen vytváříme MemoryStream()
, do kterého naši šifru „vypustíme“, a CryptoStream()
, kterému předáme jako první parametr výstup náš MemoryStream.
Pro důkladnější pochopení funkčnosti jednotlivých metod stačí prostudovat MSDN dokumentaci, ale nemyslím, že by to bylo nutné, použití je intuitivní.
Odkazy, zdroje
- Rijndael Class (MSDN)
- System.Security.Cryptography Namespace (MSDN)
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 -
Vaše pošta může být špatně nastavena – svěřte ji profesionálům
13. července 2023 -
AI v programování: Jak používat GitHub Copilot (část 2)
19. února 2024
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