spis treści
przedmowa xv
podziękowania xix
o książce xxi
o autorze xxvii
Część I PrymItywy. SkładnIkI kryPtografII
1 Wprowadzenie 3
1.1. W kryptografii chodzi o zabezpieczenie protokołów 4
1.2. Kryptografia symetryczna. Czym jest szyfrowanie symetr yczne? 5
1.3. Zasada Kerckhoffsa: tylko klucz pozostaje tajny 7
1.4. Kryptografia asymetryczna. Dwa klucze są lepsze niż jeden 10
O wymienianiu się kluczami albo jak uzyskać dostęp do wspólnego sekretu 11 ■ Szyfrowanie asymetryczne, nie mylić z symetrycznym 14 ■ Podpisy cyfrowe, zupełnie jak te tradycyjne 16
1.5. Kryptografia: klasyfikacje i abstrakcje 18
1.6. Kryptografia teoretyczna a prawdziwy świat kr yptografii 20
1.7. Od teorii do praktyki. Każdy może pójść własną ścieżką 21
1.8. Słowo ostrzeżenia 26
2 Funkcje skrótu (funkcje haszujące) 28
2.1. Czym jest funkcja skrótu? 29
2.2. Właściwości zabezpieczeń funkcji skrótu 32
2.3. Uwarunkowania zabezpieczeń funkcji skrótu 34
2.4. Funkcje skrótu w praktyce 36
Zobowiązania 36 ■ Integralność zasobów podrzędnych 36 ■ BitTorrent 37 ■ Tor 37
2.5. Znormalizowane funkcje skrótu 38
Funkcja haszująca SHA-2 39 ■ Funkcja haszująca SHA-3 43 ■ SHAKE i cSHAKE. Dwie funkcje o rozszerzalnym wyjściu (XOF) 47 ■ Jak uniknąć wieloznacznego haszowania za pomocą TupleHash 48
2.6. Haszowanie haseł 50
3 Kody uwierzytelniania wiadomości 54
3.1. Ciasteczka bezstanowe – motywujący przykład dla MAC 55
3.2. Kod z przykładem 58
3.3. Właściwości zabezpieczeń MAC 59
Fałszerstwo znacznika uwierzytelniania 59 ■ Długość znacznika uwierzytelniania 60 ■ Ataki powtórzeniowe 60 ■ Weryfikacja znaczników uwierzytelniania w stałym czasie 62
3.4. MAC w prawdziwym świecie 64
Uwierzytelnianie wiadomości 64 ■ Wyprowadzanie kluczy 64 ■ Integralność ciasteczek 65 ■ Tablice mieszające 65
3.5. Kody uwierzytelniania wiadomości w praktyce 65 HMAC, czyli MAC oparty na haszu 65 ■ KMAC, czyli MAC oparty na cSHAKE 67
3.6. SHA-2 i ataki przedłużenia długości 67
4 Szyfrowanie uwierzytelnione 71
4.1. Czym jest szyfr? 72
4.2. Szyfr blokowy AES 74
Jaki poziom bezpieczeństwa zapewnia AES? 74 ■ Interfejs AES 75 ■ Wewnętrzna konstrukcja AES 76
4.3. Zaszyfrowany pingwin i tryb CBC 78
4.4. Na brak uwierzytelnienia – AES-CBC-HMAC 81
4.5. Konstrukcje typu „wszystko w jednym”. Szyfrowanie uwierzytelnione 83
Czym jest szyfrowanie uwierzytelnione z powiązanymi danymi (AEAD)? 83
■ Algorytm AEAD o nazwie AES-GCM 85 ■ ChaCha20-Poly1305 90
4.6. Inne rodzaje szyfrowania symetrycznego 94
Opakowywanie klucza 94 ■ Szyfrowanie uwierzytelnione odporne na niepoprawne użycie nonce 95 ■ Szyfrowanie dysku 95 ■ Szyfrowanie baz danych 96
5 Wymiany klucza 98
5.1. Czym są wymiany klucza? 99
5.2. Wymiana klucza Diffiego-Hellmana (DH) 102
Teoria grup 102 ■ Problem logarytmu dyskretnego. Fundament algorytmu Diffiego-Hellmana 107 ■ Normy algorytmu Diffiego-Hellmana 109
5.3. Wymiana kluczy przy użyciu protokołu Diffiego-Hellmana w przestrzeni krzywych eliptycznych 110
Czym jest krzywa eliptyczna? 111 ■ Jak działa algorytm Diffiego-Hellmana oparty na krzywych eliptycznych? 114 ■ Normy dla algorytmu Diffiego-Hellmana w przestrzeni krzywych eliptycznych 116
5.4. Atak przeciwko małym podgrupom i inne czynniki związane z bezpieczeństwem 118
6 Szyfrowanie asymetryczne i szyfrowanie hybrydowe 123
6.1. Czym jest szyfrowanie asymetryczne? 124
6.2. Szyfrowanie asymetryczne i szyfrowanie hybr ydowe w praktyce 126 Wymiany klucza i kapsułkowanie klucza 127 ■ Szyfrowanie hybrydowe 128
6.3. Szyfrowanie asymetryczne przy użyciu RSA: złe i mniej złe 132
Podręcznikowe RSA 132 ■ Dlaczego nie należy używać RSA PKCS#1 v1.5 137 ■ Szyfrowanie asymetryczne przy użyciu RSA-OAEP 139
6.4. Szyfrowanie hybrydowe przy użyciu ECIES 142
7 Podpisy i dowody z wiedzą zerową 145
7.1. Czym jest podpis? 146
Jak w praktyce weryfikować podpisy 147 ■ Najważniejszy przypadek użycia podpisów, czyli uwierzytelnione wymiany klucza 148 ■ Rzeczywisty przypadek użycia. Infrastruktura klucza publicznego 149
7.2. Dowody z wiedzą zerową (ZKP). Pochodzenie podpisów 151
Protokół identyfikacji Schnorra. Interaktywny dowód z wiedzą zerową 151
■ Podpisy jako nieinteraktywne dowody z wiedzą zerową 154
7.3. Algorytmy podpisów, z których powinniśmy korzystać (lub nie) 156
RSA PKCS#1 v1.5, czyli zła norma 157 ■ RSA-PSS. Lepsza norma 160
■ Algorytm podpisu elektronicznego oparty na krzywych eliptycznych 161
■ Algorytm podpisu cyfrowego oparty na krzywej Edwardsa 164
7.4. Subtelności schematów podpisów 168
Ataki podstawieniowe na podpisy 168 ■ Deformowalność podpisu 169
8 Losowość i sekrety 172
8.1. Czym jest losowość? 173
8.2. Powolna losowość? Skorzystajmy z generatora liczb pseudolosowych (PRNG) 175
8.3. Uzyskiwanie losowości w praktyce 179
8.4. Generowanie losowości i czynniki związane z bezpieczeństwem 181
8.5. Publiczna losowość 184
8.6. Wyprowadzanie kluczy za pomocą HKDF 186
8.7. Zarządzanie kluczami i sekretami 190
8.8. Decentralizacja zaufania za pomocą kryptografii progowej 192
Część II Protokoły, CzylI PrzePISy na kryPtografIę ............................... 197
9 Bezpieczny transport 199
9.1. Bezpieczne protokoły transportowe: SSL i TLS 199 Od SSL do TLS 200 ■ TLS w praktyce 201
9.2. Jak działa protokół TLS? 203
Handshake TLS 204 ■ Jak TLS 1.3 szyfruje dane aplikacji 218
9.3. Aktualny stan szyfrowania w sieci web 219
9.4. Inne bezpieczne protokoły transportowe 222
9.5. Framework protokołu Noise. Współczesna alternatywa dla TLS 222
Wiele odcieni fazy handshake 223 ■ Handshake przy użyciu Noise 224
10 Szyfrowanie od końca do końca 227
10.1. Dlaczego szyfrowanie od końca do końca? 228
10.2. Niemożliwe do odnalezienia źródło zaufania 230
10.3. Porażka szyfrowanych e-maili 231
PGP czy GPG? I jak to w ogóle działa? 232 ■ Skalowanie zaufania pomiędzy użytkownikami za pomocą sieci zaufania 235 ■ Odkrywanie kluczy to prawdziwy problem 236 ■ Jeśli nie PGP, to co? 238
10.4. Bezpieczne przesyłanie wiadomości. Nowoczesne spojrzenie na szyfrowanie od końca do końca w aplikacji Signal 239
Bardziej przyjazny dla użytkownika niż WOT. Ufaj, ale weryfikuj 241 ■ X3DH. Handshake protokołu Signal 243 ■ Podwójna Zapadka. Protokół post-handshake Signala 247
10.5. Stan szyfrowania od końca do końca 252
11 Uwierzytelnianie
użytkownika 256
11.1. Uwierzytelnianie – kilka słów podsumowania 257
11.2. Uwierzytelnianie użytkownika, czyli jak pozbyć się haseł 259
Jedno hasło, by rządzić wszystkimi. Pojedyncze logowanie (SSO) i menedżery haseł 261 ■ Nie chcecie widzieć haseł? Użyjcie asymetrycznej wymiany kluczy uwierzytelnianej hasłem 263 ■ Hasła jednorazowe to tak naprawdę nie hasła. Bezhasłowość przy użyciu kluczy symetrycznych 268 ■ Jak zastąpić hasła kluczami asymetrycznymi 271
11.3. Uwierzytelnianie wspomagane przez użytkownika – parowanie urządzeń wykorzystujące wsparcie człowieka 274
Klucze wstępnie współdzielone 276 ■ Symetryczne uwierzytelnianie hasłem wymiany klucza przy użyciu CPace 278 ■ Czy naszą wymianę klucza zaatakował pośrednik? Po prostu sprawdźmy krótki ciąg uwierzytelniony (SAS) 279
12 Krypto jak w słowie „kryptowaluta”? 285
12.1. Wprowadzenie do algorytmów konsensusu tolerancyjnych na bizantyjskie błędy 286
Problem odporności. Protokoły rozproszone przychodzą na ratunek 287 ■ Problem zaufania? Decentralizacja przychodzi z pomocą 288 ■ Problem skali. Sieci bezpozwoleniowe i odporne na cenzurę 290
12.2. Jak działa bitcoin? 292
W jaki sposób bitcoin obsługuje salda użytkownika i transakcje 292 ■ Wydobywanie bitcoinów w cyfrowej złotej erze 294 ■ Jasny fork! Rozwiązywanie konfliktów wydobywczych 298 ■ Redukcja rozmiaru bloku za pomocą drzew Merkle 301
12.3. Wycieczka po świecie kryptowalut 303
Zmienna wartość 303 ■ Latencja 303 ■ Rozmiar łańcucha bloków 304
■ Poufność 304 ■ Wydajność energetyczna 304
12.4. DiemBFT. Tolerancyjny na bizantyjskie błędy protokół konsensusu 305
Bezpieczeństwo i żywotność. Dwie własności protokołu konsensusu BFT 305
■ Runda w protokole DiemBFT 306 ■ Ile nieuczciwości może tolerować protokół? 307
■ Zasady głosowania DiemBFT 308 ■ Kiedy transakcje uważa się za sfinalizowane? 309 ■ Intuicje stojące za bezpieczeństwem DiemBFT 310
13 Kryptografia sprzętowa 314
13.1. Model napastnika we współczesnej kryptografii 315
13.2. Niezaufane środowiska. Sprzęcie, ratuj! 316
Kryptografia białej skrzynki – zły pomysł 317 ■ Siedzą w naszych portfelach. Inteligentne karty i bezpieczne elementy 318 ■ Banki je uwielbiają. Sprzętowe moduły bezpieczeństwa 320 ■ Moduły zaufanej platformy (TPM). Przydatna normalizacja elementów bezpiecznych 323 ■ Poufne obliczenia z zaufanym środowiskiem wykonawczym 327
13.3. Które rozwiązanie będzie dobre dla mnie? 328
13.4. Kryptografia odporna na wycieki, czyli jak złagodzić ataki kanałem bocznym w oprogramowaniu 330
Programowanie stałoczasowe 332 ■ Nie korzystaj z sekretu! Maskowanie 334 ■ A co z atakami usterek? 335
14 Kryptografia postkwantowa 338
14.1. Czym są komputery kwantowe i dlaczego straszą kr yptografów? 339
Mechanika kwantowa – studium rzeczy małych 340 ■ Od narodzin komputerów kwantowych po supremację kwantową 342 ■ Wpływ algorytmów Grovera i Shora na kryptografię 343 ■ Kryptografia postkwantowa, czyli jak się bronić przed komputerami kwantowymi 345
14.2. Podpisy oparte na haszach. Nie potrzeba niczego poza funkcją skrótu 346
Podpisy jednorazowe (OTS) z podpisami Lamporta 346 ■ Mniejsze klucze i jednorazowe podpisy Winternitza 348 ■ Podpisy wielorazowe z XMSS oraz SPHINCS+ 349
14.3. Krótsze klucze i podpisy dzięki kryptografii opartej na kratach 353
Czym jest krata? 353 ■ Uczenie się z błędami podstawą kryptografii? 355 ■ Kyber, czyli wymiana klucza oparta na kracie 356 ■ Dilithium – schemat podpisu oparty na kracie 359
14.4. Czy powinniśmy zacząć panikować? 360
15 Czy to już wszystko? Kryptografia następnej generacji 364
15.1. Im więcej, tym lepiej. Bezpieczne obliczenia wielostronne 365
Przecięcie zbiorów prywatnych (PSI) 366 ■ MPC ogólnego przeznaczenia 367 ■ Stan MPC 370
15.2. W pełni homomorficzne szyfrowania i obietnica zaszyfrowanej chmury 370
Przykład szyfrowania homomorficznego z szyfrowaniem RSA 371 ■ Różne typy szyfrowania homomorficznego 371 ■ Bootstrapping, klucz do w pełni homomorficznego szyfrowania 372 ■ Schemat FHE oparty na problemie uczenia się z błędami 374 ■ Gdzie się z tego korzysta? 376
15.3. Dowody z wiedzą zerową ogólnego przeznaczenia 377
15.3.1. Jak działają schematy zk-SNARK 380 ■ Zobowiązania homomorficzne – ukrywamy części dowodu 381 ■ Parowania bilinearne – ulepszamy nasze zobowiązania homomorficzne 381 ■ Skąd się bierze zwięzłość? 382 ■ Od programów do wielomianów 384 ■ Programy są dla komputerów; nam potrzebne są układy arytmetyczne 383 ■ Układy arytmetyczne R1CS 384 ■ Od R1CS do wielomianu 385 ■ Trzeba dwojga, aby określić wartość wielomianu ukrytego w wykładniku 386
16 Kiedy i gdzie kryptografia zawodzi 389
16.1. Szukanie właściwego prymitywu kryptograficznego lub protokołu to nudna praca 390
16.2. W jaki sposób korzystam z pr ymitywu kryptograficznego lub protokołu? Uprzejme normy i formalna weryfikacja 392
16.3. Gdzie są dobre biblioteki? 395
16.4. Niewłaściwe wykorzystanie kryptografii. Programiści to wrogowie 396
16.5. Robicie to źle. Użyteczne zabezpieczenia 397
16.6. Kryptografia nie jest wyspą 399
16.7. Nasze obowiązki jako praktyków kryptografii. Dlaczego nie powinniśmy wdrażać własnej kr yptografii 400
Dodatek Odpowiedzi do ćwiczeń 404
Rozdział 2 404
Rozdział 3 405
Rozdział 6 405
Rozdział 7 406
Rozdział 8 406
Rozdział 9 406
Rozdział 10 407
Rozdział 11 407
o książce
Minęły już ponad dwa lata, odkąd zacząłem pisać tę książkę. Początkowo chciałem, aby stanowiła ona wprowadzenie do wszystkich wartych poznania kwestii związanych z tym rodzajem kryptografii, który wykorzystywany jest w prawdziwym świecie. Jest to jednak zadanie niemożliwe do wykonania. Żadnej dziedziny nie da się podsumować w jednej książce. Z tego powodu musiałem zachować równowagę między tym, jak wiele szczegółów chciałem przedstawić czytelnikom i jak szeroki obszar chciałem objąć. Mam nadzieję, że pod tym względem okażemy się zgodni. Jeśli szukacie praktycznej książki, która nauczy was kryptografii implementowanej i wykorzystywanej przez przedsiębiorstwa i produkty, i jeśli jesteście ciekawi, jak kryptografia w prawdziwym świecie działa pod powierzchnią, ale nie szukacie podręcznika zawierającego wszystkie szczegóły implementacji – ta książka jest dla was.
kto powinien przeczytać tę kSiążkę
Oto lista typów osób, które moim zdaniem skorzystałyby na lekturze tej książki (proszę jednak, byście nikomu nie dawali się szufladkować).
Studenci
Jeśli studiujecie informatykę, bezpieczeństwo lub kryptografię i chcecie nauczyć się czegoś o zagadnieniach kryptograficznych w kształcie, w jakim są wykorzystywane w prawdziwym świecie (np. ponieważ celujecie w pracę w tej branży lub chcecie w ramach pracy naukowej zajmować się zagadnieniami stosowanymi), wtedy w mojej ocenie jest to podręcznik dla was. Dlaczego? Ponieważ, jak wspomniałem w przedmowie, dawno temu byłem takim studentem i napisałem taką książkę, jaką chciałbym mieć wtedy pod ręką.
xxi
Osoby zawodowo zajmujące się kwestiami bezpieczeństwa Gdy nauczałem kryptografii stosowanej, większą część mojej grupy studenckiej stanowiły osoby zajmujące się testami penetracyjnymi, konsultanci, inżynierowie i architekci zajmujący się kwestiami bezpieczeństwa, a także osoby piastujące inne, związane z nimi stanowiska. Z tego powodu materiał ten został udoskonalony za sprawą wielu pytań, jakie otrzymałem, próbując wyjaśnić skomplikowane zagadnienia kryptograficzne osobom niebędącym kryptografami. Jako że sam jestem osobą zawodowo zajmującą się bezpieczeństwem, książkę tę ukształtowały również kryptografia uprawiana przeze mnie w ramach audytów prowadzonych dla wielkich przedsiębiorstw oraz błędy, które przy okazji poznałem.
Twórcy oprogramowania bezpośrednio lub pośrednio wykorzystujący kryptografię
Książce tej kształt nadały również liczne rozmowy, jakie odbyłem z klientami i współpracownikami, którzy w większości nie zajmowali się zawodowo ani kwestiami bezpieczeństwa, ani kryptografią. Dziś coraz trudniej jest tworzyć kod, nie dotykając zupełnie zagadnień kryptograficznych. Z tego względu pewna doza zrozumienia tego, z czego się korzysta, jest konieczna. Książka ta umożliwia takie zrozumienie, wykorzystując przykłady kodu w różnych językach programowania, a tym, których temat zaciekawi, zaoferuje jeszcze więcej.
Kryptografowie ciekawi innych obszarów
Książka ta stanowi wprowadzenie do kryptografii stosowanej, która przydaje się osobom takim jak ja. Pamiętajcie, że napisałem ją przede wszystkim dla siebie. Jeśli udało mi się dobrze wykonać robotę, kryptograf teoretyk powinien móc szybko zrozumieć, jak wygląda świat kryptografii stosowanej; inny, pracujący nad szyfrowaniem symetrycznym, dzięki lekturze odpowiedniego rozdziału powinien umieć prędko podłapać zagadnienia związane z wymianą kluczy zabezpieczaną hasłem; z kolei trzeci, pracujący z protokołami, powinien umieć szybko i gruntownie zrozumieć kryptografię kwantową – i tak dalej.
Osoby kierujące pracami inżynierskimi oraz menedżerowie produktu, którzy chcą zrozumieć więcej
Ta książka próbuje również odpowiedzieć na pytania, które uważam za bardziej zorientowane na produkt: jakie są kompromisy i ograniczenia różnych podejść? W jakie ryzyko się pakujecie? Czy ta ścieżka pomoże wam postąpić zgodnie z regułami? Czy musicie zrobić to i to, aby pracować z rządem?
Żądne wiedzy osoby, które chcą zrozumieć, o co chodzi w prawdziwym świecie kryptografii
Nie musicie należeć do żadnego z typów, które wymieniłem, aby przeczytać tę książkę. Wystarczy, że jesteście ciekawi kryptografii stosowanej w prawdziwym świecie. Pamiętajcie, że nie uczę historii kryptografii i nie uczę podstaw informatyki, więc powinniście
przynajmniej słyszeć już coś o kryptografii, nim zabierzecie się do lektury książki takiej jak ta.
Zakładana wiedza – dłuższa wersja
Czego będzie nam trzeba, by wycisnąć z tej książki tyle, ile się da? Powinniśmy wiedzieć, że ta książka zakłada, że dysponujemy podstawowym rozumieniem tego, jak działa nasz laptop oraz Internet i że przynajmniej słyszeliśmy coś o szyfrowaniu. Książka ta traktuje o kryptografii w prawdziwym świecie i ciężko będzie umieścić rzeczy w kontekście, jeśli nie korzystamy swobodnie z komputera i nigdy wcześniej nie słyszeliśmy słowa „szyfrowanie”.
Zakładając, że co nieco wiemy o tym, w co się pakujemy, bardzo pomogłoby, gdybyśmy wiedzieli, czym są bity i bajty, i gdybyśmy widzieli kiedyś operacje bitowe takie jak XOR, przesunięcie w lewo czy inne, a może nawet z nich korzystali. Jeśli tak nie jest, czy powinniśmy dać sobie spokój z tą książką? Nie, ale możliwe, że tu i tam trzeba będzie zatrzymać się na kilka minut i trochę pogooglować przed powrotem do lektury.
Tak naprawdę bez względu na to, jak wysokie są nasze kwalifikacje, w trakcie lektury od czasu do czasu trzeba będzie się zatrzymać i poszukać dodatkowych informacji w Internecie – czy to dlatego, że zapomniałem zdefiniować jakieś słowo przed jego użyciem (wstyd!), czy też dlatego, że mylnie założyłem, że już je znacie. Tak czy inaczej, nie powinien to być duży kłopot, ponieważ tak dobrze, jak tylko potrafię, staram się wyjaśniać różne wprowadzane przeze mnie pojęcia, tak jak tłumaczyłbym je pięcioletniemu dziecku.
I wreszcie – gdy używam słowa kryptografia, nasze mózgi prawdopodobnie myślą o matematyce. Dodatkowo, jeśli na tę myśl nasze twarze wykrzywiają się w grymasie, powinno nas ucieszyć, że nie musimy się tym zanadto przejmować. W tej książce chodzi o wyrobienie w sobie przenikliwości pozwalającej na intuicyjne zrozumienie tego, jak to wszystko działa, stąd na ile tylko jest to możliwe, stara się ona unikać matematycznych szczegółów.
Oczywiście skłamałbym, gdybym powiedział, że w powstanie tej książki matematyka nie miała żadnego wkładu. Nie da się uczyć o kryptografii bez matematyki. Moje stanowisko jest takie: dobra znajomość matematyki będzie pomocna, ale jej brak nie powinien przeszkadzać w lekturze większej części tej książki. Niektóre fragmenty mogą wydać się nieprzyjazne bez pogłębionej znajomości matematyki; chodzi konkretnie o ostatnie rozdziały (14 i 15) poświęcone kryptografii kwantowej i kryptografii następnej generacji. Nie ma jednak rzeczy niemożliwych i zawsze można przejść przez te rozdziały dzięki sile woli, googlując informacje o mnożeniu macierzy oraz innych zagadnieniach, których można nie znać. Jeśli zdecydujecie się je pominąć, upewnijcie się, że nie pominiecie rozdziału 16, ponieważ jest on wisienką na torcie.
jak uporządkowana jeSt ta kSiążka: mapa drogowa
Książka ta jest podzielona na dwie części. Pierwsza z nich powinna zostać przeczytana od początku do końca. Obejmuje ona większość składników kryptografii: rzeczy, których koniec końców będziemy używać jak klocków Lego, by zbudować bardziej złożone systemy i protokoły.
¡ Rozdział 1 stanowi wprowadzenie do prawdziwego świata kryptografii i daje nam pojęcie, czego będziemy się uczyć.
¡ Rozdział 2 omawia funkcje skrótu, fundamentalny dla kryptografii algorytm wykorzystywany do tworzenia unikatowych identyfikatorów na podstawie ciągu bajtów.
¡ Rozdział 3 omawia uwierzytelnianie danych i to, w jaki sposób możemy upewnić się, że nikt nie zmodyfikował naszych wiadomości.
¡ Rozdział 4 omawia szyfrowanie pozwalające dwojgu uczestników ukryć swoją łączność przed obserwatorami.
¡ Rozdział 5 stanowi wprowadzenie do wymiany kluczy pozwalającej na wynegocjowanie z kimś wspólnego sekretu w interaktywny sposób.
¡ Rozdział 6 opisuje szyfrowanie asymetryczne, pozwalające wielu osobom na zaszyfrowanie wiadomości kierowanej do jednej osoby.
¡ Rozdział 7 poświęcony jest podpisom – kryptograficznym odpowiednikom tradycyjnych podpisów wykorzystujących papier i pióro.
¡ Rozdział 8 omawia kwestię losowości, a także sposoby na zarządzanie naszymi sekretami.
Druga część tej książki poświęcona jest systemom zbudowanym z poniższych składników.
¡ Rozdział 9 uczy, w jaki sposób szyfrowanie i uwierzytelnianie wykorzystywane są do zabezpieczania połączeń pomiędzy maszynami (za sprawą protokołu SSL/TLS).
¡ Rozdział 10 opisuje szyfrowanie od końca do końca (ang. end-to-end encryption), w którym tak naprawdę chodzi o to, w jaki sposób ludzie tacy jak my mogą sobie wzajemnie zaufać.
¡ Rozdział 11 pokazuje, w jaki sposób maszyny uwierzytelniają ludzi i w jaki sposób ludzie mogą pomóc maszynom w ich wzajemnej synchronizacji.
¡ Rozdział 12 wprowadza w powstający świat kryptowalut.
¡ Rozdział 13 rzuca światło na kryptografię sprzętową, czyli urządzenia, które można wykorzystać w celu ochrony kluczy przed ekstrakcją.
Są również dwa rozdziały dodatkowe: rozdział 14, poświęcony kryptografii postkwantowej oraz rozdział 15, dotyczący kryptografii następnej generacji. Te dwa obszary zaczynają torować sobie drogę do produktów i firm, czy to dlatego, że stają się coraz istotniejsze, czy dlatego, że stają się coraz praktyczniejsze i wydajniejsze. Choć nie będę was osądzać, jeśli pominiecie te dwa rozdziały, musicie przeczytać rozdział 16 (ostatnie
słowa), nim odłożycie tę książkę na półkę. Rozdział 16 podsumowuje różne wyzwania i różne lekcje, o których każda osoba zajmująca się kryptografią od strony praktycznej (czyli również my, gdy skończymy już tę książkę), musi stale pamiętać. Jak ujął to wujek
Ben znany z przygód Spider-Mana: „Z wielką mocą wiąże się wielka odpowiedzialność”.
Kilka słów o kodzie
Książka ta zawiera wiele przykładów kodu źródłowego zarówno w postaci ponumerowanych listingów, jak i znajdujących się w jednym wierszu ze zwykłym tekstem. W obu wypadkach kod źródłowy jest sformatowany krojem o stałej szerokości, takim jak ten, aby odróżnić go od zwykłego tekstu. Czasami kod jest również pogrubiony, aby wyróżnić ten, który zmienił się w stosunku do poprzednich kroków w rozdziale, np. gdy nowa funkcja zostaje dodana do istniejącej linii kodu. W wielu wypadkach oryginalny kod źródłowy został przeformatowany; dodaliśmy podziały na wiersze i przerobiliśmy wcięcia, aby dostosować je do miejsca dostępnego na stronie książki. W rzadkich wypadkach nawet to nie wystarczyło i na listingach pojawiły się znaczniki kontynuacji wiersza (➥). Dodatkowo, gdy kod źródłowy jest opisany w tekście, zamieszczone w nim komentarze często były usuwane z listingów. Adnotacje do kodu towarzyszą wielu listingom i wyróżniają ważne zagadnienia.
Wiadomość
rozdział 6. Szyfrowanie asymetryczne i szyfrowanie hybrydowe
Klucz publiczny
Szyfrowanie asymetryczne
Szyfrogram
Szyfrogram
Klucz prywatny
Szyfrowanie asymetryczne
Tekst jawny lub błąd
Rysunek 6.3. Szyfrowanie asymetryczne pozwala na zaszyfrowanie wiadomości (tekstu jawnego) za pomocą klucza publicznego odbiorcy. odbiorca może następnie skorzystać z innego algorytmu, by odszyfrować zaszyfrowaną wiadomość (szyfrogram), używając do tego celu klucza prywatnego powiązanego z użytym uprzednio kluczem publicznym
Zauważmy, że jak dotąd nic nie mówiliśmy o uwierzytelnianiu. Rozważmy obie strony połączenia.
¡ Szyfrujemy za pomocą klucza publicznego, o którym sądzimy, że należy do Alicji.
¡ Alicja nie wie na pewno, kto przesłał tę wiadomość.
Na razie wyobrazimy sobie, że otrzymaliśmy klucz publiczny Alicji w rzeczywiście bezpieczny sposób. W rozdziale 7, poświęconym podpisom cyfrowym, dowiemy się, w jaki sposób rzeczywiste protokoły rozwiązują w praktyce ten problem bootstrappingu. W rozdziale 7 dowiemy sie też, jak w sposób kryptograficzny możemy zakomunikować Alicji, kim naprawdę jesteśmy. Uwaga, spoiler! – będziemy podpisywać swoje wiadomości!
Przejdźmy teraz do kolejnego podrozdziału, w którym, w której dowiemy się, jak szyfrowanie asymetryczne jest wykorzystywane w praktyce (a także dlaczego w praktyce rzadko jest wykorzystywane w bezpośredni sposób).
6.2. Szyfrowanie asymetryczne i szyfrowanie hybrydowe w praktyce
Moglibyśmy pomyśleć, że szyfrowanie asymetryczne prawdopodobnie wystarczy, by rozpocząć szyfrowanie naszych wiadomości. W rzeczywistości szyfrowanie asymetryczne jest dość ograniczone z uwagi na restrykcje dotyczące długości wiadomości, jakie może szyfrować. Szybkość asymetrycznego szyfrowania i asymetrycznej deszyfracji również jest niska w porównaniu do szyfrowania symetrycznego. Jest tak, ponieważ konstrukcje asymetryczne – w przeciwieństwie do prymitywów symetrycznych, które często po prostu manipulują bitami – implementują działania matematyczne.
W tym podrozdziale poznamy te ograniczenia, dowiemy się, do czego w praktyce stosowane jest szyfrowanie asymetryczne, a wreszcie w jaki sposób kryptografia przezwycięża istniejące przeszkody. Podrozdział ten jest podzielony na dwie części odpowiadające dwóm najważniejszym przypadkom użycia szyfrowania asymetrycznego.
Szyfrowanie asymetryczne i szyfrowanie hybrydowe w praktyce
¡ Wymiana kluczy – jak zobaczymy, dokonywanie wymiany klucza (lub jego uzgadniania) za pomocą prymitywu szyfrowania asymetrycznego jest całkiem naturalne.
¡ Szyfrowanie hybrydowe – jak zobaczymy, przypadki użycia są w wypadku szyfrowania asymetrycznego dość ograniczone z powodu maksymalnego rozmiaru tego, co możemy zaszyfrować. Aby szyfrować większe wiadomości, poznamy bardziej użyteczny prymityw nazywany szyfrowaniem hybrydowym.
6.2.1. Wymiany klucza i kapsułkowanie klucza
Okazuje się, że szyfrowanie asymetryczne może być używane w celu dokonania wymiany klucza – tego samego rodzaju jak ta, którą znamy z rozdziału 5! Aby to zrobić, możemy zacząć od wygenerowania klucza symetrycznego i zaszyfrowania go za pomocą klucza publicznego Alicji – operacja, którą nazywamy kapsułkowaniem klucza – tak jak to ilustruje rysunek 6.4.
Parametr bezpieczeństwa
Generowanie klucza symetrycznego
Klucz symetryczny
Klucz publiczny Alicji
Szyfrowanie asymetryczne
Zaszyfrowany klucz symetryczny
Rysunek 6.4. aby wykorzystać szyfrowanie asymetryczne jako prymityw wymiany klucza, (1) generujemy klucz symetryczny, a następnie (2) szyfrujemy go za pomocą klucza publicznego alicji
Potem możemy przesłać szyfrogram do Alicji, która będzie go mogła odszyfrować i poznać klucz symetryczny. W rezultacie będziemy mieli wspólny sekret! Rysunek 6.5. przedstawia cały ten proces.
Szyfrowania asymetrycznego w celu wymiany klucza dokonuje się zwykle przy użyciu algorytmu zwanego RSA (od nazwisk jego twórców: Rivesta, Shamira i Adlemana). Jest ono wykorzystywane w wielu protokołach internetowych. Współcześnie RSA często nie jest preferowanym sposobem dokonywania wymiany klucza, a jego popularność zmniejsza się coraz bardziej i bardziej na rzecz algorytmu Diffiego-Hellmana w przestrzeni krzywych eliptycznych (ECDH). Jest tak przede wszystkim z powodów historycznych (w implementacjach i normach RSA znaleziono wiele luk) oraz atrakcyjności mniejszych rozmiarów parametrów oferowanych przez ECDH.
11. Uwierzytelnianie użytkownika
UWAGA! W tym rozdziale zignoruję kwestię odzyskiwania hasła/konta, ponieważ mają one niewiele wspólnego z kryptografią. Zapamiętajmy po prostu, że często są one związane z tym, w jaki sposób dokonywaliśmy rejestracji. Na przykład jeśli rejestrowaliśmy się za pośrednictwem działu IT w naszym miejscu pracy, prawdopodobnie będziemy musieli go odwiedzić, jeśli utracimy hasło. Mogą też być najsłabszym ogniwem naszego systemu, jeśli tylko nie będziemy ostrożni. I rzeczywiście, jeśli można odzyskać nasze konto dzięki zadzwonieniu na jakiś numer i podaniu komuś naszej daty urodzenia, wtedy cała ta wymyślna kryptografia stosowana w momencie logowania na nic się nie przyda.
Naiwny sposób implementacji tego poprzedniego przepływu uwierzytelniania użytkownika polega na zachowaniu jego hasła w momencie rejestracji, a następnie na poproszeniu o jego podanie w czasie logowania. Jak widzieliśmy w rozdziale 3, po pomyślnym uwierzytelnieniu użytkownik zwykle otrzymuje ciasteczko, które może zostać przesłane przy każdym kolejnym zapytaniu zamiast nazwy użytkownika i hasła. Ale momencik! Jeśli serwer przechowuje nasze hasło w jawnej postaci, wtedy każde włamanie do bazy danych kończy się ujawnieniem hasła napastnikom. Następnie będą oni mogli wykorzystać je do zalogowania się do dowolnej witryny, w której użyliśmy tego samego hasła do rejestracji.
Lepszym sposobem na przechowanie haseł byłoby wykorzystanie algorytmu haszowania hasła, takiego jak znormalizowany Argon2, które poznaliśmy w rozdziale 2. Skutecznie zapobiegłoby to „kradzieży z włamaniem” do bazy danych mającej na celu doprowadzenie do wycieku haseł, choć napastnik, który nadmiernie przedłużyłby swoją bytność w systemie, nadal byłby w stanie podpatrzyć nasze hasło za każdym razem, gdy się logujemy. Mimo to w dalszym ciągu wiele witryn i przedsiębiorstw przechowuje hasła w jawnej postaci.
Ćwiczenie
Niekiedy aplikacje usiłują naprawić problem związany z tym, że serwer ma możliwość poznania haseł użytkowników w momencie rejestracji, haszując hasło po stronie klienta (możliwe, że za pomocą algorytmu haszowania hasła), nim zostanie ono przesłane na serwer. Czy takie rozwiązanie rzeczywiście działa?
Co więcej, ludzie z natury rzeczy źle radzą sobie z hasłami. Najlepiej czujemy się z takimi, które są krótkie i łatwe do zapamiętania. A jeśli to możliwe, wolelibyśmy po prostu wszędzie używać tego samego hasła.
81% wszystkich włamań hakerskich wykorzystuje wykradzione lub słabe hasła.
Verizon Data Breach Report (2017)
użytkownika, czyli jak pozbyć się haseł
Problem słabych haseł oraz problem ponownego wykorzystywania haseł doprowadziły do powstania wielu mało poważnych i denerwujących wzorców projektowych, które usiłują wymusić na użytkownikach bardziej poważne podejście do haseł. Na przykład niektóre witryny wymagają użycia w hasłach znaków specjalnych, wymuszają zmianę hasła co 6 miesięcy i tak dalej. Co więcej, wiele protokołów usiłuje „naprawić” hasła lub pozbyć się ich całkowicie. Wydaje się, że każdego roku nowi eksperci zaczynają żywić przekonanie, że oto „hasła” umarły, a mimo to pozostają one najszerzej stosowanym mechanizmem uwierzytelniania użytkowników.

HASŁ A
Y
Jak widać, hasła prawdopodobnie z nami zostaną. Mimo to istnieje wiele protokołów, które starają się ulepszyć lub zastąpić hasła. Pora im się przyjrzeć.
11.2.1. Jedno hasło, by rządzić wszystkimi. Pojedyncze logowanie (SSO) i menedżery haseł
W porządku, wielokrotne używanie tych samych haseł jest złe. Co możemy z tym zrobić?
Przy naiwnym podejściu moglibyśmy oczekiwać, że użytkownicy będą tworzyć różne hasła dla różnych witryn. To podejście rodzi jednak dwa problemy:
¡ użytkownicy kiepsko sobie radzą z tworzeniem wielu różnych haseł;
¡ wysiłek umysłowy konieczny do zapamiętania wielu haseł sprawia, że jest to niepraktyczne.
Aby złagodzić te niedogodności, szeroko stosowane są dwa rozwiązania.
¡ Pojedyncze logowanie (ang. single sign-on, w skrócie SSO) – pomysł polega tu na tym, by umożliwić użytkownikom łączenie się z wieloma różnymi serwisami przez wykazanie, że mają konto w jednym serwisie. W ten sposób użytkownik musi zapamiętać tylko hasło powiązane z tym jednym serwisem, aby móc połączyć się z wieloma. Pomyślmy o przyciskach typu „Zaloguj przez Facebook”, takich jak te pokazane na rysunku 11.3.