Integralność komunikatów i podpisy cyfrowe
W tym miejscu skoncentrujemy się na równie ważnym aspekcie kryptografii — gwarantowaniu integralności komunikatów (jest to tak zwane uwierzytelnianie wiadomości). Obok integralności komunikatów w tym podrozdziale omówimy dwa powiązane zagadnienia — podpisy cyfrowe i uwierzytelnianie punktów końcowych.
Do zdefiniowania problemu zachowania integralności komunikatów ponownie lub w posłużmy się postaciami Alicji i Bartka. Załóżmy, że Bartek otrzymał wiadomość (zaszyfrowaną formie tekstu jawnego) i wierzy, iż jej nadawcą jest Alicja. Aby uwierzytelnić komunikat, Bartek musi zweryfikować, że:
1. wiadomość rzeczywiście została wysłana przez Alicję;
2. wiadomość nie została zmodyfikowana po drodze do Bartka.
Problem integralności komunikatów jest kluczowy w niemal wszystkich bezpiecznych protokołach sieciowych. Jako konkretny przykład rozważmy sieć komputerową, w której algorytm routingu stanu łącza (na przykład OSPF) określa trasy między wszystkimi parami routerów w sieci (zobacz rozdział 5.). W algorytmach stanu łącza każdy router musi rozsyłać komunikaty o stanie łącza do wszystkich pozostałych routerów w sieci. Taki komunikat obejmuje listę wszystkich bezpośrednich sąsiadów routera i kosztów bezpośredniej komunikacji z nimi. Kiedy router otrzyma komunikaty o stanie łącza od wszystkich pozostałych routerów, może utworzyć kompletną mapę sieci, uruchomić algorytm routingu określający ścieżkę o najmniejszym koszcie i skonfigurować tabelę przekazywania. Inga może przeprowadzić stosunkowo łatwy atak na algorytm routingu przez dystrybucję fałszywych komunikatów z nieprawidłowymi informacjami o stanie łącza. Stąd wynika konieczność zachowania integralności komunikatów. Kiedy router B otrzyma komunikat o stanie łącza od routera A, będzie mógł zweryfikować, że to router A przygotował tę wiadomość i nikt nie zmodyfikował jej po drodze.
W tym podrozdziale opisujemy popularną technikę zapewniania integralności komunikatów stosowaną w wielu bezpiecznych protokołach sieciowych. Jednak zanim do tego przejdziemy, musimy omówić następne ważne zagadnienie w kryptografii — kryptograficzne funkcje skrótu.
Kryptograficzne funkcje skrótu
Jak przedstawia to rysunek 8.7, funkcja skrótu przyjmuje dane wejściowe m i oblicza łańcuch H(m) o stałej długości (tak zwany skrót). Internetowa suma kontrolna (rozdział 3.) i kody CRC (rozdział 6.) są zgodne z tą definicją. Kryptograficzna funkcja skrótu musi dodatkowo mieć poniższe właściwości:
- Znalezienie dwóch dowolnych komunikatów x i y, takich że H(x) = H(y), powinno być obliczeniowo niewykonalne.
Rysunek 8.7. Funkcje skrótu
W mniej formalnym języku oznacza to, że intruz nie zdoła na podstawie obliczeń zastąpić jednego komunikatu (chronionego funkcją skrótu) innym. Powoduje to, że jeśli (m, H(m)) to komunikat i jego skrót utworzone przez nadawcę, intruz nie może sfałszować treści innej wiadomości y, tak aby miała ona taką samą wartość skrótu jak pierwotny komunikat.
Sprawdźmy, dlaczego prosta suma kontrolna (na przykład internetowa) źle spełniałaby funkcję kryptograficznego skrótu wiadomości. Zamiast posługiwać się arytmetyką z uzupełnieniem do jedności (jak w internetowej sumie kontrolnej), potraktujmy każdy znak jako bajt i dodawajmy je do siebie w czterobajtowych grupach. Przypuśćmy, że Bartek jest winny Alicji 100,99 dolara i wysyła do niej poświadczenie wierzytelności w postaci łańcucha tekstu „IOU100.99BOB”. Kody ASCII (w notacji szesnastkowej) tych liter to 49, 4F, 55, 31, 30, 30, 2E, 39, 39, 42, 4F, 42.
Na górze rysunku 8.8 pokazano, że 4-bajtowa suma kontrolna tej wiadomości wynosi B2 C1 D2 AC. Nieco inna wiadomość (znacznie bardziej kosztowna dla Bartka) znajduje się na dole rysunku 8.8. Komunikaty „IOU100.99BOB” oraz „IOU900.19BOB” mają tę samą sumę kontrolną. Zatem ten prosty algorytm sumy kontrolnej nie spełnia dwóch spośród wymienionych wyżej wymagań. Dysponując oryginalnymi danymi, możemy łatwo znaleźć inny zbiór danych z identyczną sumą kontrolną. Do celów bezpieczeństwa potrzebujemy więc bardziej zaawansowanej funkcji skrótu.
Obecnie powszechnie używany jest algorytm skrótu wiadomości MD5 opracowany przez Rona Rivesta [RFC 1321]. Oblicza on 128-bitowy skrót wiadomości w czteroetapowym procesie składającym się z uzupełniania (dodawanie jedynki i takiej liczby zer, aby długość wiadomości spełniała pewne kryteria), dołączania (dodawania 64-bitowej reprezentacji długości wiadomości przed uzupełnieniem), inicjalizacji akumulatora i końcowej pętli, w której bloki wiadomości zawierające po 16 słów są przetwarzane w czterech rundach. Opis MD5 (wraz z implementacją w języku C) można znaleźć w [RFC 1321].
Rysunek 8.8. Wiadomość pierwotna i sfałszowana mają tę samą sumę kontrolną!
Drugim najczęściej używanym algorytmem skrótu jest Secure Hash Algorithm (SHA-1) [FIPS 1995]. Algorytm ten opiera się na zasadach podobnych do tych, które zastosowano w MD4 [RFC 1320], poprzedniku MD5. SHA-1 jest standardowym algorytmem skrótu wiadomości przyjętym przez rząd Stanów Zjednoczonych. Tworzy on 160-bitowy skrót. Większa długość skrótu sprawia, że jest bezpieczniejszy od MD5.
Kod MAC
Wróćmy do problemu zachowywania integralności komunikatów. Teraz, kiedy Czytelnicy wiedzą już, jak działają funkcje skrótu, przeprowadźmy pierwszą próbę zapewnienia integralności wiadomości:
1. Alicja tworzy komunikat m i oblicza skrót H(m) (na przykład za pomocą algorytmu SHA-1).
2. Alicja dołącza skrót H(m) do wiadomości m, tworząc w ten sposób komunikat rozszerzony (m, H(m)), który wysyła do Bartka.
3. Bartek otrzymuje komunikat rozszerzony (m, h) i oblicza H(m). Jeśli H(m) = h, Bartek uznaje, że wszystko jest w porządku.
To podejście ma oczywistą wadę. Inga może utworzyć fałszywy komunikat m`, w którym podaje się za Alicję, obliczyć skrót H(m`) i wysłać do Bartka dane (m`, H(m`)). Kiedy Bartek otrzyma wiadomość, w kroku 3. komunikat przejdzie weryfikację, dlatego Bartek nie będzie niczego podejrzewał.
Aby zapewnić integralność komunikatu, Alicja i Bartek obok kryptograficznej funkcji skrótu potrzebują wspólnego sekretu s. Ten sekret (jest to po prostu łańcuch bitów) to tak zwany klucz uwierzytelniający. Za pomocą tego klucza można zapewnić integralność wiadomości w następujący sposób:
1. Alicja tworzy komunikat m, scala s z m, aby utworzyć sekwencję m+s, i oblicza skrót H(m+s) (na przykład za pomocą algorytmu SHA-1). Wartość H(m+s) jest nazywana kodem MAC (ang. Message Authentication Code).
2. Alicja dołącza następnie kod MAC do komunikatu m, tworząc w ten sposób komunikat rozszerzony (m, H(m+s)), który wysyła do Bartka.
3. Bartek otrzymuje komunikat rozszerzony (m, h), a ponieważ zna s, może obliczyć kod MAC H(m+s). Jeśli H(m+s) = h, Bartek uznaje, że wszystko jest w porządku. Procedurę tę w uproszczeniu przedstawia rysunek 8.9. Czytelnicy powinni zauważyć, że opisywany tu kod MAC (ang. Message Authentication Code) to nie adres MAC (ang. Medium Access Control) wykorzystywany w protokołach warstwy łącza danych!
Rysunek 8.9. Kod MAC
Korzystną cechą kodu MAC jest to, że nie wymaga on stosowania algorytmu szyfrującego. W wielu zastosowaniach, w tym w opisanych wcześniej algorytmach stanu łącza, dla komunikujących się ze sobą jednostek ważna jest tylko integralność komunikatów, a nie ich poufność. Za pomocą kodu MAC strony mogą uwierzytelniać przesyłane wiadomości bez konieczności stosowania skomplikowanych algorytmów szyfrujących w procesie zapewniania integralności.
Jak można się domyślić, przez lata zaproponowano wiele różnych standardów tworzenia kodów MAC. Najpopularniejszy z nich to HMAC. Można go stosować razem z algorytmami MD5 i SHA-1. W standardzie HMAC dane i klucz uwierzytelniający są dwukrotnie przekazywane do funkcji skrótu [Kaufman 1995; RFC 2104].
Nadal jednak trzeba rozwiązać pewien ważny problem. Jak można przesyłać wspólny klucz uwierzytelniający między komunikującymi się jednostkami? Na przykład w algorytmie stanu łącza trzeba w jakiś sposób przekazać wspólny klucz uwierzytelniający do każdego routera w systemie autonomicznym (zauważmy, że wszystkie routery mogą korzystać z tego samego klucza). Administrator sieci może to zrobić przez fizyczne podejście do każdego routera. Jeśli jest leniwy, a wszystkie routery mają własne klucze publiczne, administrator może przesłać klucz uwierzytelniający do dowolnego z routerów przez zaszyfrowanie danych za pomocą klucza publicznego routera i przesłanie zaszyfrowanego klucza przez sieć.
Opracowano na podstawie: