Přehled šifrování, digitálních podpisů a hashovacích algoritmů v .NET

Tento článek obsahuje přehled metod šifrování a postupů podporovaných rozhraním .NET, včetně manifestů ClickOnce.

Úvod do kryptografie

Veřejné sítě, jako je internet, neposkytují způsob zabezpečené komunikace mezi entitami. Komunikace přes takové sítě je náchylná ke čtení nebo úpravě neoprávněnými třetími stranami. Kryptografie pomáhá chránit data před zobrazením, poskytuje způsoby, jak zjistit, jestli byla data upravena, a pomáhá poskytovat zabezpečený způsob komunikace přes jinak nezabezpečené kanály. Data je například možné šifrovat pomocí kryptografického algoritmu, přenášeného v šifrovaném stavu a později dešifrována zamýšlenou stranou. Pokud třetí strana zachytí šifrovaná data, bude obtížné je dešifrovat.

V .NET třídy v System.Security.Cryptography oboru názvů spravují mnoho podrobností kryptografie za vás. Některé jsou obálky pro implementace operačního systému, zatímco jiné jsou čistě spravované implementace. Abyste mohli tyto třídy používat, nemusíte být odborníkem na kryptografii. Když vytvoříte novou instanci jedné z tříd šifrovacích algoritmů, klíče se automaticky vygenerují pro snadné použití a výchozí vlastnosti jsou co nejbezpečnější a nejbezpečnější.

Kryptografické primitivy

V typické situaci, kdy se používá kryptografie, komunikují dvě strany (Alice a Bob) přes nezabezpečený kanál. Alice a Bob chtějí zajistit, aby jejich komunikace zůstala nesrozumitelná pro každého, kdo by mohl poslouchat. Alice a Bob jsou navíc ve vzdálených umístěních, alice musí zajistit, aby informace, které obdrží od Boba, nebyly během přenosu změněny. Kromě toho musí zajistit, aby informace skutečně pocházejí od Boba, a ne od někoho, kdo zosobní Boba.

Kryptografie se používá k dosažení následujících cílů:

  • Důvěrnost: Pomáhá chránit identitu nebo data uživatele před čtením.

  • Integrita dat: Pomáhá chránit data před změnami.

  • Ověřování: Aby se zajistilo, že data pocházejí z konkrétní strany.

  • Neodmítnutí: Chcete-li zabránit tomu, aby určitá strana odepřela, že odeslala zprávu.

K dosažení těchto cílů můžete použít kombinaci algoritmů a postupů označovaných jako kryptografické primitivy k vytvoření kryptografického schématu. Následující tabulka uvádí kryptografické primitivy a jejich použití.

Kryptografické primitivy Používání
Šifrování tajných klíčů (symetrická kryptografie) Provede transformaci dat, aby se zabránilo jejich čtení třetími stranami. Tento typ šifrování používá k šifrování a dešifrování dat jeden sdílený tajný klíč.
Šifrování veřejného klíče (asymetrická kryptografie) Provede transformaci dat, aby se zabránilo jejich čtení třetími stranami. Tento typ šifrování používá pár veřejného a privátního klíče k šifrování a dešifrování dat.
Kryptografické podepisování Pomáhá ověřit, že data pocházejí od konkrétní strany vytvořením digitálního podpisu, který je pro tuto stranu jedinečný. Tento proces také používá funkce hash.
Kryptografické hodnoty hash Mapy data z libovolné délky do sekvence bajtů s pevnou délkou. Hodnoty hash jsou statisticky jedinečné; Jiná dvoubajtů sekvence nebude hashovat stejnou hodnotu.

Šifrování tajných klíčů

Šifrovací algoritmy tajných klíčů používají k šifrování a dešifrování dat jeden tajný klíč. Klíč musíte zabezpečit před přístupem neoprávněnými agenty, protože každá strana, která klíč obsahuje, může ho použít k dešifrování dat nebo šifrování vlastních dat a deklarace, že pochází od vás.

Šifrování tajných klíčů se také označuje jako symetrické šifrování, protože stejný klíč se používá k šifrování a dešifrování. Šifrovací algoritmy tajných klíčů jsou velmi rychlé (ve srovnání s algoritmy veřejného klíče) a jsou vhodné pro provádění kryptografických transformací u velkých datových proudů dat. Asymetrické šifrovací algoritmy, jako je RSA, jsou matematicky omezené v tom, kolik dat může šifrovat. Symetrické šifrovací algoritmy obvykle tyto problémy nemají.

Typ algoritmu tajného klíče označovaného jako bloková šifra se používá k šifrování jednoho bloku dat najednou. Blokové šifry, jako je ŠIFROVÁNÍ DAT (DES), TripleDES a Advanced Encryption Standard (AES), kryptograficky transformují vstupní blok n bajtů na výstupní blok šifrovaných bajtů. Pokud chcete šifrovat nebo dešifrovat posloupnost bajtů, musíte to blokovat blokem. Protože n je malý (8 bajtů pro DES a TripleDES; 16 bajtů [výchozí], 24 bajtů nebo 32 bajtů pro AES), musí být datové hodnoty větší než n zašifrovány po jednom bloku. Aby bylo možné zpracovat hodnoty dat, které jsou menší než n , musí být rozbalené na n .

Jedna jednoduchá forma blokové šifry se nazývá režim elektronického kódu (ECB). Režim ECB není považován za bezpečný, protože k inicializaci prvního bloku prostého textu nepoužívá inicializační vektor. Pro daný tajný klíč k jednoduchý blok šifry bloku, který nepoužívá inicializační vektor, zašifruje stejný vstupní blok prostého textu do stejného výstupního bloku šifrování. Proto pokud máte ve vstupním streamu prostého textu duplicitní bloky, budete mít ve výstupním streamu šifrového textu duplicitní bloky. Tyto duplicitní výstupy blokují upozornění neautorizovaných uživatelů na slabé šifrování, které algoritmy mohly být použity, a možné režimy útoku. Režim šifry ECB je proto poměrně zranitelný vůči analýze a v konečném důsledku je klíčovým zjišťováním.

Třídy blokové šifry, které jsou k dispozici v knihovně základních tříd, používají výchozí režim řetězení označovaný jako řetězení bloků šifer (CBC), i když toto výchozí nastavení můžete změnit, pokud chcete.

Šifry CBC řeší problémy spojené s šiframi ECB pomocí inicializačního vektoru (IV) k zašifrování prvního bloku prostého textu. Každý další blok prostého textu prochází bitové operace OR (XOR) s předchozím blokem šifrovaného textu před šifrováním. Každý blok šifry je proto závislý na všech předchozích blocích. Při použití tohoto systému nelze použít běžné hlavičky zpráv, které mohou být známé neoprávněnému uživateli ke zpětnému analýzu klíče.

Jedním ze způsobů, jak ohrozit data zašifrovaná pomocí šifry CBC, je provést vyčerpávající vyhledávání všech možných klíčů. V závislosti na velikosti klíče, který se používá k šifrování, je tento druh vyhledávání velmi časově náročný pomocí i nejrychlejších počítačů, a proto je neproveditelný. Větší velikosti klíčů je obtížnější dešifrovat. I když šifrování neznamená teoreticky nemožné, aby nežádoucí osoba načetla šifrovaná data, zvyšuje náklady na to. Pokud trvá tři měsíce, než se provede vyčerpávající vyhledávání, aby se načetla data, která jsou smysluplná jen několik dní, je vyčerpávající metoda vyhledávání nepraktická.

Nevýhodou šifrování tajných klíčů je, že předpokládá, že se dvě strany dohodly na klíči a IV a předaly své hodnoty. IV není považován za tajný a lze jej přenést v prostém textu se zprávou. Klíč však musí být tajný před neoprávněnými uživateli. Kvůli těmto problémům se šifrování tajných klíčů často používá společně s šifrováním veřejného klíče k privátní komunikaci hodnot klíče a IV.

Za předpokladu, že Alice a Bob jsou dvě strany, které chtějí komunikovat přes nezabezpečený kanál, mohou použít šifrování tajných klíčů takto: Alice a Bob souhlasí s použitím jednoho konkrétního algoritmu (například AES) s konkrétním klíčem a IV. Alice vytvoří zprávu a vytvoří síťový stream (třeba pojmenovaný kanál nebo síťový e-mail), na kterém se má zpráva odeslat. Dále zašifruje text pomocí klíče a IV a pošle zašifrovanou zprávu a IV Bobovi přes intranet. Bob obdrží šifrovaný text a dešifruje ho pomocí IV a dříve odsouhlasil klíč. Pokud je přenos zachycen, průsečík nemůže obnovit původní zprávu, protože nezná klíč. V tomto scénáři musí zůstat tajný pouze klíč. Ve skutečném scénáři generuje Alice nebo Bob tajný klíč a k přenosu tajného klíče (symetrického) klíče druhé straně používá šifrování veřejného klíče (asymetrického). Další informace o šifrování veřejného klíče najdete v další části.

.NET poskytuje následující třídy, které implementují šifrovací algoritmy tajných klíčů:

  • Aes

  • HMACSHA256HMACSHA384 a HMACSHA512. (Jedná se o technicky tajné algoritmy klíče, protože představují kódy ověřování zpráv vypočítané pomocí kryptografické hashovací funkce v kombinaci s tajným klíčem. Viz hodnoty hash, dále v tomto článku.)

Šifrování veřejného klíče

Šifrování veřejného klíče používá privátní klíč, který musí být tajný před neoprávněnými uživateli a veřejným klíčem, který může být veřejně přístupný komukoli. Veřejný klíč a privátní klíč jsou matematicky propojené; data zašifrovaná pomocí veřejného klíče je možné dešifrovat pouze pomocí privátního klíče a data podepsaná pomocí privátního klíče je možné ověřit pouze pomocí veřejného klíče. Veřejný klíč lze zpřístupnit komukoli; slouží k šifrování dat, která se mají posílat do správce privátního klíče. Kryptografické algoritmy veřejného klíče se také označují jako asymetrické algoritmy, protože jeden klíč je nutný k šifrování dat a k dešifrování dat se vyžaduje jiný klíč. Základní kryptografické pravidlo zakazuje opakované použití klíčů a oba klíče by měly být pro každou komunikační relaci jedinečné. Asymetrické klíče jsou ale v praxi obecně dlouhodobé.

Dva strany (Alice a Bob) můžou používat šifrování veřejného klíče následujícím způsobem: Alice vygeneruje pár veřejného a privátního klíče. Pokud Chce Bob poslat Alice zašifrovanou zprávu, požádá ji o její veřejný klíč. Alice pošle Bobovi svůj veřejný klíč přes nezabezpečenou síť a Bob tento klíč použije k zašifrování zprávy. Bob pošle zašifrovanou zprávu alici a dešifruje ji pomocí svého privátního klíče. Pokud Bob obdržel klíč Alice přes nezabezpečený kanál, jako je veřejná síť, Bob je otevřený pro útok man-in-the-middle. Proto musí Bob ověřit u Alice, že má správnou kopii jejího veřejného klíče.

Během přenosu veřejného klíče Alice může neoprávněný agent klíč zachytit. Kromě toho může stejný agent zachycovat zašifrovanou zprávu od Boba. Agent však nemůže zprávu dešifrovat pomocí veřejného klíče. Zprávu lze dešifrovat pouze pomocí privátního klíče Alice, který nebyl přenášen. Alice nepoužívá svůj privátní klíč k zašifrování zprávy odpovědi Bobovi, protože by zprávu mohl dešifrovat kdokoli s veřejným klíčem. Pokud Alice chce poslat zprávu zpět Bobovi, požádá Boba o svůj veřejný klíč a zašifruje zprávu pomocí daného veřejného klíče. Bob pak zprávu dešifruje pomocí přidruženého privátního klíče.

V tomto scénáři Alice a Bob používají k přenosu tajného (symetrického) klíče šifrování veřejného klíče a šifrování tajných klíčů pro zbytek své relace.

Následující seznam nabízí porovnání mezi kryptografickými algoritmy veřejného a tajného klíče:

  • Kryptografické algoritmy veřejného klíče používají pevnou velikost vyrovnávací paměti, zatímco kryptografické algoritmy tajných klíčů používají vyrovnávací paměť s proměnlivou délkou.

  • Algoritmy veřejného klíče nelze použít ke zřetězování dat do datových proudů způsobem, jakým mohou algoritmy tajných klíčů být zašifrovány, protože lze zašifrovat pouze malé množství dat. Asymetrické operace proto nepoužívají stejný model streamování jako symetrické operace.

  • Šifrování veřejného klíče má mnohem větší prostor klíčů (rozsah možných hodnot klíče) než šifrování tajných klíčů. Šifrování veřejného klíče je proto méně náchylné k vyčerpávajícím útokům, které zkouší všechny možné klíče.

  • Veřejné klíče se dají snadno distribuovat, protože nemusí být zabezpečené, pokud existuje nějaký způsob ověření identity odesílatele.

  • Některé algoritmy veřejného klíče (například RSA a DSA, ale ne Diffie-Hellman) je možné použít k vytvoření digitálních podpisů k ověření identity odesílatele dat.

  • Algoritmy veřejného klíče jsou ve srovnání s algoritmy tajných klíčů velmi pomalé a nejsou navržené k šifrování velkých objemů dat. Algoritmy veřejného klíče jsou užitečné jenom pro přenos velmi malých objemů dat. Šifrování veřejného klíče se obvykle používá k šifrování klíče a IV, které má algoritmus tajných klíčů používat. Po přenosu klíče a IV se pro zbytek relace použije šifrování tajných klíčů.

.NET poskytuje následující třídy, které implementují algoritmy veřejného klíče:

RSA umožňuje šifrování i podepisování, ale DSA se dá použít jenom k podepisování. DSA není tak zabezpečená jako RSA a doporučujeme RSA. Diffie-Hellman lze použít pouze pro generování klíčů. Obecně platí, že algoritmy veřejného klíče jsou ve svých použitích omezenější než algoritmy privátního klíče.

Digitální podpisy

Algoritmy veřejného klíče lze použít také k vytvoření digitálních podpisů. Digitální podpisy ověřují identitu odesílatele (pokud důvěřujete veřejnému klíči odesílatele) a pomáhají chránit integritu dat. Když použijete veřejný klíč vygenerovaný Alice, může příjemce dat Alice ověřit, že ji Alice odeslala porovnáním digitálního podpisu s daty Alice a veřejným klíčem Alice.

Pokud chcete k digitálnímu podepsání zprávy použít kryptografii veřejného klíče, Alice nejprve na zprávu použije algoritmus hash, který vytvoří hodnotu hash zprávy. Hodnota hash zprávy je kompaktní a jedinečná reprezentace dat. Alice pak zprávu zašifruje svým soukromým klíčem, aby vytvořila svůj osobní podpis. Po přijetí zprávy a podpisu Bob dešifruje podpis pomocí veřejného klíče Alice k obnovení hodnoty hash zprávy a hash zprávy pomocí stejného algoritmu hash, který Alice použila. Pokud hodnota hash zprávy, kterou Bob vypočítá přesně odpovídá hodnotě hash zprávy přijaté od Alice, Bob si je jistý, že zpráva pochází od vlastníka soukromého klíče a že data nebyla změněna. Pokud Bob věří, že Alice je vlastníkem soukromého klíče, ví, že zpráva přišla od Alice.

Poznámka:

Podpis může ověřit kdokoli, protože veřejný klíč odesílatele je běžný znalost a obvykle je součástí formátu digitálního podpisu. Tato metoda nezachovává tajemství zprávy; aby zpráva byla tajná, musí být také šifrovaná.

.NET poskytuje následující třídy, které implementují algoritmy digitálního podpisu:

Hodnoty hash

Algoritmy hash mapují binární hodnoty libovolné délky na menší binární hodnoty pevné délky, označované jako hodnoty hash. Hodnota hash je číselná reprezentace části dat. Pokud zatřidíte odstavec prostého textu a změníte dokonce i jedno písmeno odstavce, následná hodnota hash vytvoří jinou hodnotu. Pokud je hodnota hash kryptograficky silná, její hodnota se výrazně změní. Pokud se například změní jeden bit zprávy, může silná funkce hash vytvořit výstup, který se liší o 50 procent. Mnoho vstupních hodnot může hashovat stejnou výstupní hodnotu. Je však výpočetně neproveditelné najít dva odlišné vstupy, které hashují stejnou hodnotu.

Dvě strany (Alice a Bob) můžou k zajištění integrity zpráv použít funkci hash. Vyberou algoritmus hash, který podepíše zprávy. Alice napíše zprávu a pak pomocí vybraného algoritmu vytvoří hodnotu hash této zprávy. Pak by postupovali podle jedné z následujících metod:

  • Alice odešle zprávu ve formátu prostého textu a hashovanou zprávu (digitální podpis) Bobovi. Bob přijme a zatřidí zprávu a porovná jeho hodnotu hash s hodnotou hash, kterou obdržel od Alice. Pokud jsou hodnoty hash identické, zpráva nebyla změněna. Pokud hodnoty nejsou identické, zpráva byla změněna poté, co ji Alice napsala.

    Tato metoda bohužel nezřídí pravost odesílatele. Každý může zosobnit Alice a poslat zprávu Bobovi. K podepsání zprávy můžou použít stejný hashovací algoritmus a bob zjistí, že zpráva odpovídá jeho podpisu. Toto je jedna forma útoku man-in-the-middle. Další informace naleznete v tématu Příklad zabezpečené komunikace CNG (Cryptography Next Generation).

  • Alice pošle Bobovi zprávu ve formátu prostého textu přes nezabezpečený veřejný kanál. Odešle zatřiďovanou zprávu Bobovi přes zabezpečený privátní kanál. Bob obdrží zprávu ve formátu prostého textu, zatřidí ji a porovná hodnotu hash s soukromě vyměňovanou hodnotou hash. Pokud se hodnoty hash shodují, Bob zná dvě věci:

    • Zpráva nebyla změněna.

    • Odesílatel zprávy (Alice) je autentický.

    Aby tento systém fungoval, musí Alice skrýt původní hodnotu hash od všech stran kromě Boba.

  • Alice pošle Bobovi zprávu ve formátu prostého textu přes nezabezpečený veřejný kanál a umístí zatřiďovanou zprávu na veřejně zobrazitelný web.

    Tato metoda zabraňuje manipulaci se zprávami tím, že brání komukoli v úpravě hodnoty hash. I když zprávu a její hodnotu hash může číst kdokoli, hodnota hash může být změněna pouze Alice. Útočník, který chce zosobnit Alice, by vyžadoval přístup k webu Alice.

Žádné z předchozích metod nezabrání někomu číst zprávy Alice, protože jsou přenášeny ve formátu prostého textu. Úplné zabezpečení obvykle vyžaduje digitální podpisy (podepisování zpráv) a šifrování.

.NET poskytuje následující třídy, které implementují algoritmy hash:

.NET také poskytuje MD5 a SHA1. Zjistili jsme ale, že algoritmy MD5 a SHA-1 jsou nezabezpečené a místo toho se doporučuje algoritmus SHA-2. SHA-2 zahrnuje SHA256, SHA384 a SHA512.

Generování náhodných čísel

Generování náhodných čísel je nedílnou součástí mnoha kryptografických operací. Kryptografické klíče musí být například co nejvíce náhodné, aby bylo možné je reprodukovat. Kryptografické generátory náhodných čísel musí generovat výstup, který je výpočetně neproveditelný pro předpověď s pravděpodobností, která je lepší než jedna polovina. Proto jakákoli metoda predikce dalšího výstupního bitu nesmí fungovat lépe než náhodné odhadování. Třídy v .NET používají generátory náhodných čísel ke generování kryptografických klíčů.

Třída RandomNumberGenerator je implementace algoritmu generátoru náhodných čísel.

Manifesty ClickOnce

Následující třídy kryptografie umožňují získat a ověřit informace o podpisech manifestu pro aplikace nasazené pomocí technologie ClickOnce:

Kromě toho následující třídy poskytují konkrétní informace o podpisu:

Třídy CNG (Cryptography Next Generation)

Třídy CNG (Cryptography Next Generation) poskytují spravovaný obálka kolem nativních funkcí CNG. (CNG je náhrada za CryptoAPI.) Tyto třídy mají jako součást jejich názvů "Cng". Centrální třída obálky CNG je klíčovou CngKey třídou kontejneru, která abstrahuje úložiště a použití klíčů CNG. Tato třída umožňuje bezpečně uložit pár klíčů nebo veřejný klíč a odkazovat na něj pomocí jednoduchého názvu řetězce. Třída podpisu založená na ECDsaCng elipse křivky a ECDiffieHellmanCng třída šifrování mohou používat CngKey objekty.

Třída CngKey se používá pro celou řadu dalších operací, včetně otevření, vytváření, odstraňování a exportu klíčů. Poskytuje také přístup k podkladovému popisovači klíče, který se má použít při přímém volání nativních funkcí.

.NET také zahrnuje celou řadu podpůrných tříd CNG, například tyto:

Viz také