Zastosowania i możliwości współczesnej kryptografii
Współczesna kryptografia daje dziś ogromne możliwości zarówno w sferze
ochrony danych jak i kontroli dostępu. Choć podstawowe koncepcje pozostały
niezmienione na przestrzeni lat, to błyskawiczny rozwój konkretnych technologii sprawił,
że kryptografia stała się niemal odrębną dziedziną wiedzy.
Stronę tą tworzymy w celu prezentacji poszczególnych mechanizmów
kryptograficznych przez pryzmat ich praktycznych zastosowań.
Spis treści:
Funkcje skrótu
Problem: Wyobraźmy sobie bazę danych, która przechowuje duże obiekty binarne
(na przykład zdjęcia). Ich bezpośrednie wyszukiwanie w bazie jest bardzo
czasochłonne. Dlatego warto byłoby dysponować jakimś niewielkim obiektem,
niejako odciskiem palca tego dużego. Wtedy wyszukiwanie można prowadzić
po mniejszych obiektach, a porównanie dużych obiektów byłoby wykonywane
jedynie w przypadku zgodnych odcisków.
Rozwiązanie: Własności idealne do tego zastosowania mają
kryptograficzne funkcje skrótu. Ich zasadniczym celem jest wygenerowanie takiego
odcisku palca. Dodatkową ich własnością jest to, że na podstawie samego odcisku
palca trudno jest znaleźć obiekt, do którego on należy. Czy ma to jakiekolwiek
znaczenie? Okazuje się, że w pewnych przypadkach własność ta jest bardzo
istotna. Co jakiś czas pojawiają się bowiem ataki na bazy danych, które używają
słabych, z kryptograficznego punktu widzenia, funkcji skrótu.
Typowy atak polega na umieszczeniu w bazie wielu różnych danych
o tym samym skrócie. Efektem tego jest spowolnienie działania całego
systemu, czasami tak duże, że zupełnie traci on swoją funkcjonalność. Dlatego też
warto w takich przypadkach stosować jedynie kryptograficzne funkcje
skrótu.
Protokoły uwierzytelniania
Problem: Powiedzmy, że projektujesz system, który dysponuje bardzo ograniczonymi
zasobami. Przyjmijmy też, że jednym z wymogów jakie musisz spełnić jest możliwość
wzajemnego uwierzytelniania się jego składników. Najbardziej oczywistym sposobem rozwiązania
takiego problemu jest zastosowanie podpisu elektronicznego. Praktyczna realizacja może jednak
być niemożliwa ze względu na małą ilość pamięci lub niewielką moc obliczeniową. Czy
w takiej sytuacji jesteś zmuszony do rezygnacji z wymagań postawionych
w tym zakresie?
Rozwiązanie: Przy nietypowych projektach polecamy wybór odpowiedniego rozwiązania
z całej gamy protokołów uwierzytelnienia. Dają one możliwość takiego manipulowania
parametrami, które pozwoli na:
- wykonanie obliczeń mimo niewielkiej mocy,
- implementację mechanizmu, który nie zajmuje dużo pamięci,
- regulowanie poziomu bezpieczeństwa całego rozwiązania.
Pamiętaj, że podpis elektroniczny nie jest jedyną metodą, która pozwala na uwierzytelnianie
się stron. Dobieraj takie rozwiązania, które będą optymalne pod kątem wykorzystania
w Twoim systemie (zwłaszcza jeśli ma on zamkniętą architekturę).
Proof of Work
Problem: Wyobraź sobie, że tworzysz rozwiązanie typu klient-serwer, które ma
funkcjonować również w sieci internet. Do zabezpieczenia przesyłanych danych możesz użyć
algorytmów szyfrowania i podpisu elektronicznego. W wielu
przypadkach wystarczające jest wykorzystanie protokołu TLS. Protokół ten nie zawiera
jednak żadnego mechanizmu chroniącego przed atakami DoS (Denial of Service).
W tym przypadku atak może polegać na zmuszeniu serwera do wykonania setek
zbędnych operacji kryptograficznych. W efekcie serwer stanie się praktycznie
niedostępny, co uniemożliwi normalną pracę użytkownikom systemu.
Rozwiązanie: Jedną z najbardziej skutecznych metod ochrony przed
atakiem na opisany system będzie wprowadzenie mechanizmu Proof of Work. Jego idea polega
na tym, że przed rozpoczęciem jakichkolwiek obliczeń serwer wysyła klientowi polecenie
wykonania pewnego zadania. Zadanie to jest skonstruowane w taki sposób, że
znalezienie rozwiązania jest dość czasochłonne, a weryfikacja odpowiedzi
bardzo szybka. W ten sposób serwer zmusza nieuczciwych klientów do
wykonywania skomplikowanych obliczeń, co znacznie ogranicza możliwości atakującego.
Dobór odpowiedniego zadania nie jest jednak rzeczą łatwą i wymaga
wykorzystania odpowiednich mechanizmów kryptograficznych.
Protokoły uzgadniania kluczy
Problem: Rozważmy projekt urządzeń, które mają mieć zapewnioną możliwość
nawiązania bezpiecznego połączenia z serwerem. Najprostszą metodą zrealizowania
takiej funkcjonalności jest zaszycie we wszystkich urządzeniach tego samego klucza. Jest
to również najtańsza opcja, jeżeli brać pod uwagę jedynie koszt budowy systemu. Należy
jednak zauważyć, że uzyskanie dostępu do klucza w którymkolwiek urządzeniu
rozkłada cały system. Co można zrobić w takiej sytuacji?
Rozwiązanie: Można do każdego urządzenia załadować inny klucz, ale to zmusza nas
do trzymania wszystkich kopii kluczy na serwerze. W niektórych przypadkach
zarządzanie tymi kluczami może się okazać zbyt kłopotliwe. Rozwiązaniem jest wtedy
zastosowanie protokołów uzgadniania kluczy (na przykład protokół Diffiego-Hellmana).
Ich idea polega na wymianie pomiędzy stronami informacji publicznych, które są następnie
przetwarzane przez każdą ze stron. Podczas tych obliczeń obie strony protokołu są
w stanie uzgodnić wspólną wartość, która jest nieznana innym i może
stanowić zalążek klucza. Do takiego systemu wystarczy jeszcze dodać podpis elektroniczny
lub protokół uwierzytelnienia, aby otrzymać pożądany efekt.
Bezpieczne obliczenia wielostronne
Problem: Rozważmy problem wyznaczania średniej pensji w grupie
trzech lub więcej osób. Oczywiście najprostszym sposobem jej wyznaczenia jest podanie
wynagrodzenia każdej osoby w postaci jawnej, zsumowanie danych
i wyznaczenie średniej. Jest to oczywiście rozwiązanie najprostsze
tylko w przypadku, gdy wszyscy uczestnicy zdecydują się podać swoje
zarobki do wiadomości publicznej, co już nie jest takie oczywiste. Czy można ten
problem rozwiązać inaczej?
Rozwiązanie: Z pomocą przychodzą tutaj metody bezpiecznych
obliczeń wielostronnych. Polegają one na wyznaczaniu wartości pewnej funkcji
(w tym przypadku średniej arytmetycznej) na zbiorze poufnych danych.
Aby lepiej zrozumieć ich ideę rozważmy następujący sposób postępowania
w przypadku wyznaczania średniej pensji
- uczestnik numer 1 wybiera losowo dużą liczbę x i dodaje
do niej swoje wynagrodzenie w1, a następnie
liczbę x + w1 przekazuje w tajemnicy
uczestnikowi numer 2,
- uczestnik numer 2 dodaje swoje wynagrodzenie w2
do otrzymanej liczby, a następnie liczbę x + w1
+ w2 przekazuje w tajemnicy uczestnikowi
numer 3,
- ...
- uczestnik numer n dodaje swoje wynagrodzenie wn
do otrzymanej liczby, a następnie liczbę x + w1
+ w2 + ... + wn przekazuje w tajemnicy
uczestnikowi numer 1,
- uczestnik numer 1 odejmuje od otrzymanej liczby x, co wyznacza sumę
w1 + ... + wn i daje możliwość
wyznaczenia średniej.
Powyższy schemat postępowania ma się oczywiście nijak do metod wykorzystujących obliczenia
komputerowe. Niemniej jednak dobrze obrazuje możliwości systemów wykonujących bezpieczne
obliczenia wielostronne.
Szyfry homomorficzne
Problem: Załóżmy, że mamy do czynienia z koniecznością przekazania
komuś dość wrażliwych informacji (na przykład profili DNA). Informacje takie
w postaci jawnej mogą być wykorzystane również do innych celów (identyfikacyjne
profile DNA mogą służyć do uzyskania danych biomedycznych). W takiej
sytuacji rodzi się pytanie, czy możliwe jest przekazanie danych w taki sposób,
aby:
- ktoś mógł na nich wykonywać dozwolone operacje (na przykład porównywać je),
- nie miał możliwości ich obejrzenia w postaci jawnej.
Rozwiązanie: Idealnym rozwiązaniem tego problemu są tak zwane szyfry
homomorficzne. Są one tak skonstruowane, że wykonywanie pewnych operacji na
szyfrogramach daje taki sam efekt jak wykonanie operacji na treści jawnej. Jeśli
h jest funkcją szyfrującą o tej własności,
a x i y są tekstami jawnymi, to
h(x) + h(y) = h(x * y).
Możemy więc
w odpowiedni sposób zaszyfrować cały zestaw liczb,
a ktoś inny może na tych szyfrogramach wykonać funkcję odpowiadającą operacji
dodawania wartości jawnych. Gdy odszyfrujemy wynikowy szyfrogram okaże się, że przedstawia
on sumę wcześniej wybranych liczb. Jest to więc metoda, która pozwala na udostępnienie
operacji na konkretnych danych, bez konieczności przekazywania ich
w postaci
jawnej.
Podział sekretu
Problem: Przyjmijmy, że chcesz stworzyć pewną funkcjonalność, która może
być wykorzystana jedynie w przypadku, gdy dwie spośród trzech uprawnionych
osób wyrażą na to zgodę. Z tego typu problemami mamy zazwyczaj do czynienia
w dużych organizacjach, które chcą wyeliminować możliwość ewentualnych
nadużyć.
Rozwiązanie: Z pomocą przychodzą nam tym przypadku mechanizmy
podziału sekretu. Pozwalają one w taki sposób podzielić poufną informację
(na przykład hasło zabezpieczające daną funkcjonalność), że jedynie określona grupa
osób będzie w stanie ją odtworzyć. Taki mechanizm pozwala na budowanie
skomplikowanych systemów kontroli dostępu, które wymuszają na użytkownikach konieczność
stosowania określonych procedur.