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 se data změnila, a pomáhá zajistit zabezpečený způsob komunikace přes jinak nezabezpečené kanály. Data lze například š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ího algoritmu, klíče se automaticky vygenerují, aby se usnadnilo 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á tím, kdo by mohl poslouchat. Navíc, protože Alice a Bob jsou ve vzdálených umístěních, Alice musí zajistit, aby informace, které od Boba obdrží, 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 tím, aby se změnila.

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

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

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

Kryptografická primitiva Použití
Šifrování tajných klíčů (symetrická kryptografie) Provede transformaci dat, aby se zabránilo č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 čtení třetími stranami. Tento typ šifrování používá pár veřejného/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 danou stranu jedinečný. Tento proces také používá funkce hash.
Kryptografické hodnoty hash Mapy data z libovolné délky na sekvenci bajtů s pevnou délkou. Hodnoty hash jsou statisticky jedinečné; Jiná dvoubajtů sekvence nebude hashovat stejnou hodnotu.

šifrování Secret-Key

Š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, ji může použít k dešifrování dat nebo šifrování vlastních dat a deklarace, která pochází od vás.

Šifrování tajných klíčů se označuje také 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é na množství dat, která můžou šifrovat. Algoritmy symetrického šifrování obvykle tyto problémy nemají.

Typ algoritmu tajného klíče, který se nazývá bloková šifra, se používá k šifrování jednoho bloku dat najednou. Blokové šifry, jako je DES (Data Encryption Standard), TripleDES a Advanced Encryption Standard (AES), kryptograficky transformují vstupní blok n bajtů na výstupní blok šifrovaných bajtů. Pokud chcete zašifrovat nebo dešifrovat posloupnost bajtů, musíte to blokovat blokem. Vzhledem k tomu, ž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 šifry. Pokud tedy 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ýstupní bloky upozorňují neoprávněné uživatele na slabé šifrování používané algoritmy, které 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 nakonec klíčovému zjišťování.

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

Šifry CBC překonat problémy spojené s šiframi ECB pomocí inicializačního vektoru (IV) k š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 k zpětnému analýzu klíče použít běžné hlavičky zpráv, které by mohly být známé neoprávněným uživatelům.

Jedním ze způsobů, jak ohrozit data zašifrovaná šifrou 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í dokonce nejrychlejších počítačů a je proto neproveditelný. Větší velikosti klíčů jsou obtížnější dešifrovat. I když šifrování znemožňuje teoreticky nežádoucí osobu načíst zašifrovaná data, zvyšuje to náklady na to. Pokud načtení dat, které je smysluplné jen několik dní, trvá tři měsíce, než provede vyčerpávající vyhledávání, je nepraktické.

Nevýhodou šifrování tajných klíčů je, že předpokládá, že se dvě strany dohodly na klíči a IV a oznámily své hodnoty. IV není považován za tajný a lze jej přenést ve formátu prostého textu se zprávou. Klíč ale musí být tajný kód 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 soukromé komunikaci hodnot klíče a IV.

Za předpokladu, že Alice a Bob jsou dvěma stranami, které chtějí komunikovat přes nezabezpečený kanál, můžou používat š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ý datový proud (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 Alice nebo Bob vygenerují tajný klíč a k přenosu tajného klíče do druhé strany používá šifrování veřejného klíče (asymetrického) šifrování. Další informace o šifrování veřejného klíče najdete v další části.

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

  • Aes

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

šifrování Public-Key

Šifrování veřejného klíče používá privátní klíč, který musí být uchovaný před neoprávněnými uživateli a veřejným klíčem, který je možné zpřístupnit 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, která jsou podepsaná privátním klíčem, lze ověřit pouze pomocí veřejného klíče. Veřejný klíč lze zpřístupnit komukoli; používá se k šifrování dat, která se mají odesílat hlídači 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 jedinečné pro každou komunikační relaci. V praxi jsou však asymetrického klíče obecně dlouhodobé.

Dva strany (Alice a Bob) můžou používat šifrování veřejného klíče následujícím způsobem: Nejprve Alice vygeneruje dvojici veřejného/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 použije tento klíč k zašifrování zprávy. Bob pošle zašifrovanou zprávu Alice 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 zachycovat klíč. 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ý se nepřenesl. Alice nepoužívá svůj privátní klíč k zašifrování zprávy odpovědi Bobovi, protože ji může dešifrovat kdokoli s veřejným klíčem. Pokud Alice chce poslat zprávu zpátky 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í svého přidruženého privátního klíče.

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

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

  • 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ů tak, jak můžou algoritmy tajných klíčů obsahovat, protože je možné šifrovat jenom malé objemy 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 snadno distribuují, protože nemusí být zabezpečené, pokud existuje nějaký způsob, jak ověřit identitu 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, aby ho používal algoritmus tajného klíče. 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ích klíčů.

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. Pomocí veřejného klíče vygenerovaného Alice může příjemce dat Alice ověřit, že ho 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 k vytvoření hodnoty 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 hashuje zprávu pomocí stejného algoritmu hash, který použil Alice. Pokud hodnota hash zprávy, kterou Bob vypočítá přesně odpovídá hodnotě hash zprávy přijaté od Alice, Bob je si jisti, ž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 pochází z 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é zašifrovaná.

.NET poskytuje následující třídy, které implementují algoritmy digitálních podpisů:

Hodnoty hash

Algoritmy hash mapují binární hodnoty libovolné délky na menší binární hodnoty pevné délky, které se označují jako hodnoty hash. Hodnota hash je číselná reprezentace části dat. Pokud hashujete odstavec prostého textu a změníte dokonce jedno písmeno odstavce, následující 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 vytvoří hodnotu hash této zprávy pomocí vybraného algoritmu. 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 obdrží zprávu a hashuje ji a porovná hodnotu hash s hodnotou hash, kterou obdržel od Alice. Pokud jsou hodnoty hash stejné, 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 neuklá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 všichni Bob můžou určit, že zpráva odpovídá jeho podpisu. Jedná se o jednu formu ú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řiďuje ji a porovná hodnotu hash se soukromě vyměněnou 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 prostého textu přes nezabezpečený veřejný kanál a umístí hashovanou zprávu na svůj veřejně zobrazitelný web.

    Tato metoda zabraňuje manipulaci se zprávami tím, že brání komukoli v úpravě hodnoty hash. Přestože 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. Algoritmy MD5 a SHA-1 se ale zjistily jako nezabezpečené a místo toho se doporučuje 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ý, aby předpověděl 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í kryptografické třídy 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í specifické informace o podpisu:

Třídy CNG (Cryptography Next Generation)

Třídy CNG (Cryptography Next Generation) poskytují spravovaný obálku kolem nativních funkcí CNG. (CNG je náhradou za CryptoAPI.) Tyto třídy mají jako součást svých jmen "Cng". Central to the CNG wrapper class is the CngKey key container class, which abstracts the storage and use of CNG keys. 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 ECDiffieHellmanCng založená na tři tečky a ECDsaCng třída šifrování mohou používat CngKey objekty.

Třída CngKey se používá pro řadu dalších operací, včetně otevírání, 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é obsahuje celou řadu podpůrných tříd CNG, například následující:

Viz také