Omówienie szyfrowania, podpisów cyfrowych i algorytmów skrótów na platformie .NET

Ten artykuł zawiera omówienie metod szyfrowania i praktyk obsługiwanych przez platformę .NET, w tym manifestów Technologii ClickOnce.

Wprowadzenie do kryptografii

Sieci publiczne, takie jak Internet, nie zapewniają bezpiecznej komunikacji między jednostkami. Komunikacja za pośrednictwem takich sieci jest podatna na odczytywanie lub nawet modyfikowanie przez nieautoryzowane osoby trzecie. Kryptografia pomaga chronić dane przed wyświetlaniem, zapewnia sposoby wykrywania, czy dane zostały zmodyfikowane, i pomaga zapewnić bezpieczny sposób komunikacji za pośrednictwem innych niezabezpieczonych kanałów. Na przykład dane mogą być szyfrowane przy użyciu algorytmu kryptograficznego, przesyłanego w stanie zaszyfrowanym, a następnie odszyfrowywane przez inną osobę. Jeśli inna firma przechwytuje zaszyfrowane dane, trudno będzie odszyfrować.

Na platformie .NET klasy w System.Security.Cryptography przestrzeni nazw zarządzają wieloma szczegółami kryptografii. Niektóre są otokami implementacji systemu operacyjnego, podczas gdy inne są wyłącznie implementacjami zarządzanymi. Nie musisz być ekspertem w zakresie kryptografii, aby korzystać z tych klas. Podczas tworzenia nowego wystąpienia jednej z klas algorytmów szyfrowania klucze są generowane automatycznie w celu ułatwienia użycia, a domyślne właściwości są tak bezpieczne, jak to możliwe.

Kryptograficzne elementy pierwotne

W typowej sytuacji, w której jest używana kryptografia, dwie strony (Alice i Bob) komunikują się za pośrednictwem niezabezpieczonego kanału. Alice i Bob chcą zapewnić, że ich komunikacja pozostaje niezrozumiała przez każdego, kto może słuchać. Ponadto, ponieważ Alice i Bob znajdują się w odległych lokalizacjach, Alicja musi upewnić się, że informacje, które otrzymuje od Boba, nie zostały zmodyfikowane przez nikogo podczas transmisji. Ponadto musi upewnić się, że informacje naprawdę pochodzą z Boba, a nie od kogoś, kto personifikuje Boba.

Kryptografia służy do osiągnięcia następujących celów:

  • Poufność: Aby chronić tożsamość użytkownika lub dane przed odczytywaniem.

  • Integralność danych: aby chronić dane przed zmianą.

  • Uwierzytelnianie: aby upewnić się, że dane pochodzą z określonej firmy.

  • Odrzucenie: aby uniemożliwić określonej stronie odrzucenie, odmawiając wysłania wiadomości.

Aby osiągnąć te cele, można użyć kombinacji algorytmów i praktyk znanych jako kryptograficzne typy pierwotne w celu utworzenia schematu kryptograficznego. W poniższej tabeli wymieniono kryptograficzne elementy pierwotne i ich zastosowania.

Kryptograficzny pierwotny Używanie
Szyfrowanie klucza tajnego (kryptografia symetryczna) Wykonuje transformację danych, aby uniemożliwić ich odczytywanie przez inne firmy. Ten typ szyfrowania używa jednego wspólnego klucza tajnego do szyfrowania i odszyfrowywania danych.
Szyfrowanie klucza publicznego (kryptografia asymetryczna) Wykonuje transformację danych, aby uniemożliwić ich odczytywanie przez inne firmy. Ten typ szyfrowania używa pary kluczy publicznych/prywatnych do szyfrowania i odszyfrowywania danych.
Podpisywanie kryptograficzne Pomaga sprawdzić, czy dane pochodzą z określonej firmy, tworząc podpis cyfrowy unikatowy dla tej strony. Ten proces używa również funkcji skrótu.
Skróty kryptograficzne Mapy dane z dowolnej długości do sekwencji bajtów o stałej długości. Skróty są statystycznie unikatowe; inna sekwencja dwu bajtów nie będzie zawierać skrótu do tej samej wartości.

Szyfrowanie kluczy tajnych

Algorytmy szyfrowania kluczy tajnych używają jednego klucza tajnego do szyfrowania i odszyfrowywania danych. Należy zabezpieczyć klucz przed dostępem przez nieautoryzowanych agentów, ponieważ każda strona, która ma klucz, może użyć go do odszyfrowywania danych lub szyfrowania własnych danych, twierdząc, że pochodzi od Ciebie.

Szyfrowanie klucza tajnego jest również nazywane szyfrowaniem symetrycznym, ponieważ ten sam klucz jest używany do szyfrowania i odszyfrowywania. Algorytmy szyfrowania kluczy tajnych są bardzo szybkie (w porównaniu z algorytmami kluczy publicznych) i dobrze nadają się do wykonywania przekształceń kryptograficznych na dużych strumieniach danych. Algorytmy szyfrowania asymetrycznego, takie jak RSA, są ograniczone matematycznie w ilości danych, które mogą szyfrować. Algorytmy szyfrowania symetrycznego zwykle nie mają tych problemów.

Typ algorytmu klucza tajnego nazywany szyfrem blokowym służy do szyfrowania jednego bloku danych naraz. Blokuj szyfry, takie jak Data Encryption Standard (DES), TripleDES i Advanced Encryption Standard (AES) kryptograficznie przekształcają blok wejściowy n bajtów w blok wyjściowy zaszyfrowanych bajtów. Jeśli chcesz zaszyfrować lub odszyfrować sekwencję bajtów, musisz go zablokować według bloku. Ponieważ n jest mały (8 bajtów dla des i TripleDES; 16 bajtów [wartość domyślna], 24 bajty lub 32 bajty dla AES), wartości danych większe niż n muszą być szyfrowane pojedynczo. Aby można było przetwarzać wartości danych mniejsze niż n , należy je rozszerzyć do n .

Jedną z prostych form szyfrowania blokowego jest tryb elektronicznego podręcznika (EBC). Tryb EBC nie jest uważany za bezpieczny, ponieważ nie używa wektora inicjowania do inicjowania pierwszego bloku zwykłego tekstu. W przypadku danego klucza tajnego k prosty szyfr blokowy, który nie używa wektora inicjowania, będzie szyfrować ten sam blok wejściowy zwykłego tekstu w tym samym bloku wyjściowym szyfrowania. W związku z tym, jeśli masz zduplikowane bloki w strumieniu wejściowym zwykłego tekstu, będziesz mieć zduplikowane bloki w strumieniu szyfrowania wyjściowego. Te zduplikowane dane wyjściowe blokują alerty nieautoryzowanych użytkowników do słabego szyfrowania, które mogły zostać zastosowane, oraz możliwych trybów ataku. Tryb szyfrowania EBC jest zatem dość podatny na analizę i ostatecznie kluczowe odnajdywanie.

Klasy szyfrowania bloków, które są dostępne w bibliotece klas bazowych, używają domyślnego trybu łańcucha nazywanego łańcuchem bloków szyfrowania (CBC), chociaż można zmienić tę wartość domyślną, jeśli chcesz.

Szyfry CBC pokonują problemy związane z szyframi EBC przy użyciu wektora inicjalizacji (IV) w celu zaszyfrowania pierwszego bloku zwykłego tekstu. Każdy kolejny blok zwykłego tekstu przechodzi bitowo wyłączną operację OR (XOR) z poprzednim blokiem szyfrowania tekstu przed jego zaszyfrowanie. Każdy blok szyfrowania jest zatem zależny od wszystkich poprzednich bloków. Gdy ten system jest używany, typowe nagłówki komunikatów, które mogą być znane nieautoryzowanemu użytkownikowi, nie mogą być używane do odtwarzania klucza.

Jednym ze sposobów naruszenia bezpieczeństwa danych zaszyfrowanych za pomocą szyfrowania CBC jest przeprowadzenie wyczerpującego wyszukiwania każdego możliwego klucza. W zależności od rozmiaru klucza, który jest używany do szyfrowania, tego rodzaju wyszukiwanie jest bardzo czasochłonne przy użyciu nawet najszybszych komputerów i dlatego jest niewykonalne. Większe rozmiary kluczy są trudniejsze do odszyfrowania. Chociaż szyfrowanie nie sprawia, że teoretycznie niemożliwe jest, aby atakujący pobierał zaszyfrowane dane, zwiększa to koszty. Jeśli wykonanie wyczerpującego wyszukiwania trwa trzy miesiące w celu pobrania danych zrozumiałych tylko przez kilka dni, wyczerpująca metoda wyszukiwania jest niepraktyczna.

Wadą szyfrowania kluczy tajnych jest to, że zakłada, że dwie strony uzgodniły klucz i IV i przekazały swoje wartości. Iv nie jest uważany za wpis tajny i może być przesyłany w postaci zwykłego tekstu z wiadomością. Jednak klucz musi być tajny przed nieautoryzowanymi użytkownikami. Ze względu na te problemy szyfrowanie klucza tajnego jest często używane razem z szyfrowaniem kluczy publicznych w celu prywatnego komunikowania wartości klucza i IV.

Zakładając, że Alice i Bob są dwiema stronami, które chcą komunikować się za pośrednictwem niezabezpieczonego kanału, mogą używać szyfrowania kluczy tajnych w następujący sposób: Alice i Bob zgadzają się na użycie jednego określonego algorytmu (na przykład AES) z określonym kluczem i IV. Alicja tworzy komunikat i tworzy strumień sieciowy (być może nazwany potok lub sieć e-mail), na którym ma być wysyłana wiadomość. Następnie szyfruje tekst przy użyciu klucza i IV oraz wysyła zaszyfrowaną wiadomość i IV do Boba za pośrednictwem intranetu. Bob odbiera zaszyfrowany tekst i odszyfrowuje go przy użyciu iv i wcześniej uzgodnionego klucza. Jeśli transmisja jest przechwycona, przechwytujący nie może odzyskać oryginalnego komunikatu, ponieważ nie znają klucza. W tym scenariuszu tylko klucz musi pozostać tajny. W rzeczywistym scenariuszu Alice lub Bob generuje klucz tajny i używa szyfrowania klucza publicznego (asymetrycznego) do transferu klucza tajnego (symetrycznego) do innej strony. Aby uzyskać więcej informacji na temat szyfrowania kluczy publicznych, zobacz następną sekcję.

Platforma .NET udostępnia następujące klasy, które implementują algorytmy szyfrowania kluczy tajnych:

  • Aes

  • HMACSHA256, HMACSHA384 i HMACSHA512. (Są to technicznie algorytmy kluczy tajnych, ponieważ reprezentują kody uwierzytelniania komunikatów obliczane przy użyciu funkcji skrótu kryptograficznego połączonej z kluczem tajnym. Zobacz Wartości skrótu, w dalszej części tego artykułu).

Szyfrowanie klucza publicznego

Szyfrowanie klucza publicznego używa klucza prywatnego, który musi być tajny przed nieautoryzowanymi użytkownikami i kluczem publicznym, który można upublicznić wszystkim osobom. Klucz publiczny i klucz prywatny są matematycznie połączone; dane zaszyfrowane przy użyciu klucza publicznego można odszyfrować tylko przy użyciu klucza prywatnego, a dane podpisane za pomocą klucza prywatnego można zweryfikować tylko przy użyciu klucza publicznego. Klucz publiczny można udostępnić wszystkim; służy do szyfrowania danych, które mają być wysyłane do opiekuna klucza prywatnego. Algorytmy kryptograficzne klucza publicznego są również nazywane algorytmami asymetrycznymi, ponieważ jeden klucz jest wymagany do szyfrowania danych, a inny klucz jest wymagany do odszyfrowania danych. Podstawowa reguła kryptograficzna uniemożliwia ponowne użycie klucza, a oba klucze powinny być unikatowe dla każdej sesji komunikacji. Jednak w praktyce klucze asymetryczne są zwykle długotrwałe.

Dwie strony (Alice i Bob) mogą używać szyfrowania klucza publicznego w następujący sposób: Najpierw Alicja generuje parę kluczy publicznych/prywatnych. Jeśli Bob chce wysłać Alicję zaszyfrowaną wiadomość, prosi ją o jej klucz publiczny. Alice wysyła Bobowi swój klucz publiczny za pośrednictwem niezabezpieczonej sieci, a Bob używa tego klucza do szyfrowania wiadomości. Bob wysyła zaszyfrowaną wiadomość do Alice i odszyfrowuje ją przy użyciu jej klucza prywatnego. Jeśli Bob otrzymał klucz Alice za pośrednictwem niezabezpieczonego kanału, takiego jak sieć publiczna, Bob jest otwarty na atak typu man-in-the-middle. W związku z tym Bob musi sprawdzić z Alice, że ma poprawną kopię swojego klucza publicznego.

Podczas przesyłania klucza publicznego Alicji nieautoryzowany agent może przechwycić klucz. Ponadto ten sam agent może przechwycić zaszyfrowaną wiadomość od Boba. Jednak agent nie może odszyfrować komunikatu przy użyciu klucza publicznego. Wiadomość można odszyfrować tylko przy użyciu klucza prywatnego Alicji, który nie został przesłany. Alice nie używa swojego klucza prywatnego do szyfrowania wiadomości odpowiedzi do Boba, ponieważ każda osoba mająca klucz publiczny może odszyfrować tę wiadomość. Jeśli Alice chce wysłać wiadomość z powrotem do Boba, prosi Boba o jego klucz publiczny i szyfruje jej wiadomość przy użyciu tego klucza publicznego. Następnie Bob odszyfrowuje wiadomość przy użyciu skojarzonego klucza prywatnego.

W tym scenariuszu Alice i Bob używają szyfrowania klucza publicznego (asymetrycznego) do transferu klucza tajnego (symetrycznego) i używania szyfrowania klucza tajnego w pozostałej części sesji.

Poniższa lista zawiera porównania między algorytmami kryptograficznymi klucza publicznego i klucza tajnego:

  • Algorytmy kryptograficzne klucza publicznego używają stałego rozmiaru buforu, podczas gdy algorytmy kryptograficzne klucza tajnego używają buforu o zmiennej długości.

  • Algorytmy kluczy publicznych nie mogą służyć do łączenia danych w strumienie w sposób, w jaki mogą być algorytmy kluczy tajnych, ponieważ tylko małe ilości danych mogą być szyfrowane. W związku z tym operacje asymetryczne nie używają tego samego modelu przesyłania strumieniowego co operacje symetryczne.

  • Szyfrowanie klucza publicznego ma znacznie większą przestrzeń kluczy (zakres możliwych wartości klucza) niż szyfrowanie klucza tajnego. W związku z tym szyfrowanie klucza publicznego jest mniej podatne na wyczerpujące ataki, które próbują użyć każdego możliwego klucza.

  • Klucze publiczne są łatwe do dystrybucji, ponieważ nie muszą być zabezpieczone, pod warunkiem, że istnieje jakiś sposób weryfikacji tożsamości nadawcy.

  • Niektóre algorytmy klucza publicznego (takie jak RSA i DSA, ale nie Diffie-Hellman) mogą służyć do tworzenia podpisów cyfrowych w celu zweryfikowania tożsamości nadawcy danych.

  • Algorytmy kluczy publicznych są bardzo powolne w porównaniu z algorytmami kluczy tajnych i nie są przeznaczone do szyfrowania dużych ilości danych. Algorytmy kluczy publicznych są przydatne tylko do przesyłania bardzo małych ilości danych. Zazwyczaj szyfrowanie klucza publicznego służy do szyfrowania klucza i iv do użycia przez algorytm klucza tajnego. Po przeniesieniu klucza i iv szyfrowanie klucza tajnego jest używane w pozostałej części sesji.

Platforma .NET udostępnia następujące klasy, które implementują algorytmy kluczy publicznych:

Usługa RSA zezwala zarówno na szyfrowanie, jak i podpisywanie, ale usługa DSA może być używana tylko do podpisywania. DsA nie jest tak bezpieczna jak RSA i zalecamy rsa. Diffie-Hellman może być używany tylko do generowania kluczy. Ogólnie rzecz biorąc algorytmy kluczy publicznych są bardziej ograniczone w ich użyciu niż algorytmy klucza prywatnego.

Podpisy cyfrowe

Algorytmy kluczy publicznych mogą również służyć do tworzenia podpisów cyfrowych. Podpisy cyfrowe uwierzytelniają tożsamość nadawcy (jeśli ufasz kluczowi publicznemu nadawcy) i pomagają chronić integralność danych. Korzystając z klucza publicznego wygenerowanego przez Alice, odbiorca danych Alicji może sprawdzić, czy Alicja wysłała go, porównując podpis cyfrowy z danymi Alicji i kluczem publicznym Alicji.

Aby użyć kryptografii klucza publicznego do cyfrowego podpisania komunikatu, Alicja najpierw stosuje algorytm skrótu do wiadomości w celu utworzenia skrótu komunikatu. Skrót komunikatu to kompaktowa i unikatowa reprezentacja danych. Alicja następnie szyfruje skrót wiadomości swoim kluczem prywatnym, aby utworzyć jej osobisty podpis. Po otrzymaniu wiadomości i podpisu Bob odszyfrowuje podpis przy użyciu klucza publicznego Alicji w celu odzyskania skrótu wiadomości i skrótów wiadomości przy użyciu tego samego algorytmu skrótu, którego użyła Alice. Jeśli skrót komunikatu obliczany przez Boba dokładnie pasuje do skrótu komunikatu otrzymanego od Alice, Bob jest pewien, że wiadomość pochodzi od posiadacza klucza prywatnego i że dane nie zostały zmodyfikowane. Jeśli Bob ufa, że Alice jest właścicielem klucza prywatnego, wie, że wiadomość pochodzi od Alicji.

Uwaga

Podpis można zweryfikować przez dowolną osobę, ponieważ klucz publiczny nadawcy jest powszechną wiedzą i jest zwykle zawarty w formacie podpisu cyfrowego. Ta metoda nie zachowuje tajemnicy wiadomości; aby wiadomość była wpisem tajnym, musi być również zaszyfrowana.

Platforma .NET udostępnia następujące klasy, które implementują algorytmy podpisu cyfrowego:

Wartości skrótu

Algorytmy skrótu mapuje wartości binarne dowolnej długości na mniejsze wartości binarne o stałej długości, znane jako wartości skrótu. Wartość skrótu jest liczbową reprezentacją elementu danych. Jeśli utworzysz akapit zwykłego tekstu i zmienisz nawet jedną literę akapitu, kolejny skrót spowoduje wygenerowanie innej wartości. Jeśli skrót jest silny kryptograficznie, jego wartość ulegnie znacznej zmianie. Jeśli na przykład jeden bit komunikatu zostanie zmieniony, silna funkcja skrótu może wygenerować dane wyjściowe, które różnią się o 50%. Wiele wartości wejściowych może mieć wartość skrótu do tej samej wartości wyjściowej. Jednak jest to możliwe do obliczenia, aby znaleźć dwa odrębne dane wejściowe, które skróty do tej samej wartości.

Dwie strony (Alice i Bob) mogą używać funkcji skrótu, aby zapewnić integralność wiadomości. Wybrali algorytm skrótu, aby podpisać swoje komunikaty. Alicja napisze komunikat, a następnie utworzy skrót tego komunikatu przy użyciu wybranego algorytmu. Następnie będą postępować zgodnie z jedną z następujących metod:

  • Alicja wysyła wiadomość w postaci zwykłego tekstu i skróconą wiadomość (podpis cyfrowy) do Boba. Bob odbiera i skróty komunikatu i porównuje jego wartość skrótu z wartością skrótu otrzymaną od Alice. Jeśli wartości skrótu są identyczne, komunikat nie został zmieniony. Jeśli wartości nie są identyczne, wiadomość została zmieniona po napisaniu jej przez Alice.

    Niestety ta metoda nie ustanawia autentyczności nadawcy. Każdy może personifikować Alicję i wysłać wiadomość do Boba. Mogą użyć tego samego algorytmu wyznaczania wartości skrótu do podpisania wiadomości, a każdy Bob może określić, że komunikat jest zgodny z jego podpisem. Jest to jedna forma ataku typu man-in-the-middle. Aby uzyskać więcej informacji, zobacz Cryptography Next Generation (CNG) Secure Communication Example (Przykład bezpiecznej komunikacji kryptograficznej nowej generacji).

  • Alicja wysyła wiadomość w postaci zwykłego tekstu do Boba za pośrednictwem niezabezpieczonego kanału publicznego. Wysyła skróconą wiadomość do Boba za pośrednictwem bezpiecznego kanału prywatnego. Bob odbiera komunikat w postaci zwykłego tekstu, skróty i porównuje skrót z prywatnie wymienianą wartością skrótu. Jeśli skróty są zgodne, Bob wie dwie rzeczy:

    • Wiadomość nie została zmieniona.

    • Nadawca wiadomości (Alice) jest autentyczny.

    Aby ten system działał, Alice musi ukryć oryginalną wartość skrótu ze wszystkich stron z wyjątkiem Boba.

  • Alice wysyła wiadomość w postaci zwykłego tekstu do Boba za pośrednictwem niezabezpieczonego kanału publicznego i umieszcza skróty wiadomości w jej publicznej witrynie internetowej.

    Ta metoda uniemożliwia manipulowanie komunikatami przez uniemożliwienie nikomu modyfikowania wartości skrótu. Mimo że komunikat i jego skrót mogą być odczytywane przez dowolną osobę, wartość skrótu można zmienić tylko przez Alice. Osoba atakująca, która chce personifikować Alicję, wymaga dostępu do witryny sieci Web Alicji.

Żadna z poprzednich metod nie uniemożliwi komuś odczytywania wiadomości Alicji, ponieważ są one przesyłane w postaci zwykłego tekstu. Pełne zabezpieczenia zwykle wymagają podpisów cyfrowych (podpisywania komunikatów) i szyfrowania.

Platforma .NET udostępnia następujące klasy, które implementują algorytmy tworzenia skrótów:

Platforma .NET udostępnia MD5 również funkcje i SHA1. Jednak algorytmy MD5 i SHA-1 zostały uznane za niezabezpieczone, a algorytmy SHA-2 są teraz zalecane. Algorytm SHA-2 obejmuje sha256, SHA384 i SHA512.

Generowanie liczb losowych

Generowanie liczb losowych jest integralną częścią wielu operacji kryptograficznych. Na przykład klucze kryptograficzne muszą być tak losowe, jak to możliwe, aby można było je odtworzyć. Kryptograficzne generatory liczb losowych muszą generować dane wyjściowe, które są obliczanie niewykonalne, aby przewidywać z prawdopodobieństwem lepszym niż połowa. W związku z tym każda metoda przewidywania następnego bitu wyjściowego nie może działać lepiej niż losowe zgadywanie. Klasy na platformie .NET używają generatorów liczb losowych do generowania kluczy kryptograficznych.

Klasa RandomNumberGenerator jest implementacją algorytmu generatora liczb losowych.

Manifesty technologii ClickOnce

Następujące klasy kryptografii umożliwiają uzyskiwanie i weryfikowanie informacji o podpisach manifestu dla aplikacji wdrożonych przy użyciu technologii ClickOnce:

Ponadto następujące klasy zawierają określone informacje o podpisie:

Klasy następnej generacji kryptografii (CNG)

Klasy Cryptography Next Generation (CNG) zapewniają zarządzaną otokę wokół natywnych funkcji CNG. (CNG jest zamiennikiem cryptoAPI). Te klasy mają wartość "Cng" jako część ich nazw. Centralą klas otoki CNG jest kluczowa CngKey klasa kontenera, która abstrakcji magazynu i używania kluczy CNG. Ta klasa umożliwia bezpieczne przechowywanie pary kluczy lub klucza publicznego i odwoływanie się do niej przy użyciu prostej nazwy ciągu. Wielokropkowa klasa podpisu oparta na ECDsaCng krzywej i ECDiffieHellmanCng klasa szyfrowania może używać CngKey obiektów.

Klasa CngKey jest używana do różnych dodatkowych operacji, w tym otwierania, tworzenia, usuwania i eksportowania kluczy. Zapewnia również dostęp do podstawowego dojścia klucza do użycia podczas bezpośredniego wywoływania funkcji natywnych.

Platforma .NET obejmuje również różne pomocnicze klasy CNG, takie jak:

Zobacz też