Dzielenie sekretu
2010-08-02, Poniedziałek 14:45:33 +0200, autor Karol „Zal” Zalewski, licencja LPRCTKC
W ciągu ostatnich kilku dni zrobiło się stosunkowo głośno o rozpoczęciu działania na skalę globalną systemu DNSSEC. Wygląda na to, że w końcu zabezpieczono jeden z najsłabszych elementów Internetu, jakimi były DNS-y. Oczywiście, nie byłoby to możliwe bez wykorzystania osiągnięć kryptografii pod postacią szyfrów symetrycznych oraz asymetrycznych. Pojawia się tutaj jednak jeszcze jeden element, o którym warto wspomnieć. Jest to tzw. dzielenie sekretu. Cała siła systemu DNSSEC tkwi w kluczu głównym. Jego utrata bądź nieautoryzowany dostęp do niego naraziłyby na szwank cały Internet. Prosty backup nie wchodził zatem w grę. Zdecydowano się wykorzystać protokół dzielenia sekretu. Poniżej znajduje się krótki i przystępny opis tej koncepcji.
Postanowiono podzielić klucz na 7 części (rozdano je różnym osobom z całego świata) tak, aby do jego odzyskania wystarczyło 5 dowolnych fragmentów. Odtworzenie klucza przy pomocny mniejszej liczby części, czyli tzw. cieni, miało być niemożliwe do wykonania. Proces ten najłatwiej opisać w oparciu o protokół Blakleya. W uproszczeniu można to przedstawić w następujący sposób. W przestrzeni trójwymiarowej, aby określić położenie konkretnego punktu należy posłużyć się trzema różnymi, nierównoległymi płaszczyznami. Oczywiście, takich płaszczyzn przechodzących przez ten punkt można wygenerować nieskończenie wiele, ale trzeba posiadać, co najmniej trzy by móc go odtworzyć. Nasz sekret to jedna ze współrzędnych tego punktu (np. X). Mniejsza liczba płaszczyzn nie pozwala na odkrycie żadnej wskazówki dot. naszego sekretu (w przypadku przecięcia się dwóch płaszczyzn otrzymujemy prostą). Manipulując liczbą wymiarów, w których znajduje się punkt, manipulujemy również liczbą płaszczyzn wymaganych do jego odtworzenia. Zatem w przypadku DNSSEC wygenerowano 7 płaszczyzn dla każdego punku umieszczonego w przestrzeni pięciowymiarowej. O ile skorzystano z protokołu Blakleya.
Powyższe podejście jest stosunkowo prymitywne, nieodporne na oszustwa (spróbujcie podłożyć fałszywą płaszczyznę i określić, która z nich jest oszustwem nie znając prawidłowego punktu), ale zapewnia pożądaną nadmiarowość i większe bezpieczeństwo, niż próba podzielenia sekretu na części w sposób intuicyjny (np. hasło „sekret” dzielimy na trzy fragmenty - „se----”, „--kr--” i „----et”). Istnieją protokoły umożliwiające wykrywanie oszustwa (a nawet konkretnych oszustów) oraz np. określenie maksymalnej liczby cieni wymaganych do odtworzenia pierwotnej wiadomości. Możliwe jest także tworzenie bardziej skomplikowanych rozwiązań, kiedy to poszczególni posiadacze cieni mają różną wagę „głosu” (np. dwóch generałów lub dwudziestu oficerów wystarcza do odtworzenia sekretu). Cała koncepcja z punktu widzenia teorii informacji ma swoje ograniczenia, ale jest wykorzystywana w praktyce np. do tworzenia kopii kluczy prywatnych OpenGPG. Ja sam interesuję się nią ze względu na możliwość wykorzystania jej przy tworzeniu bezpiecznych, niezawodnych i zdecentralizowanych baz danych np. dla systemów agentowych.
Osobom zainteresowanym tą tematyką polecam zajrzenie do publikacji autorstwa Bruce Schneiera (np. do bardzo popularnej jego książki pt. „Kryptografia dla praktyków”). Dobrym punktem wyjścia jest również anglojęzyczna Wikipedia.
