C i C++ Bezpieczne programowanie.pdf

(457 KB) Pobierz
C:\Andrzej\PDF\ABC nagrywania p³yt CD\1 strona.cdr
IDZ DO
PRZYK£ADOW Y ROZDZIA£
C i C++. Bezpieczne
SPIS TRECI
programowanie. Receptury
Autorzy: John Viega, Matt Messier
T³umaczenie: Bart³omiej Garbacz (rozdz. 8 – 13),
Krzysztof Miesniak (rozdz. 6), Miko³aj Szczepaniak
(przedmowa, rozdz. 1 – 5, 7)
ISBN: 83-7361-684-5
Format: B5, stron: 784
KATALOG KSI¥¯EK
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
DODAJ DO KOSZYKA
„C i C++. Bezpieczne programowanie. Receptury” to kompletne ród³o wiedzy
dla programistów, którzy chc¹ udoskonaliæ swoje umiejêtnosci z zakresu tworzenia
bezpiecznego kodu. Przedstawia gotowe rozwi¹zania zagadnieñ programistycznych,
takich jak bezpieczna inicjalizacja aplikacji, kryptografia, uwierzytelnianie
u¿ytkowników, wymiana kluczy, zapobieganie penetracji i wielu innych.
Ka¿de zagadnienie jest przedstawione w postaci kodu ród³owego w jêzyku C i C++
oraz obszernego opisu, co u³atwia dostosowanie go do w³asnych potrzeb.
• Bezpieczne uruchamianie aplikacji
• Kontrola dostêpu do plików i aplikacji
• Sprawdzanie poprawnosci danych wejsciowych oraz ochrona przed atakami
typu XSS i SQL Injection
• Generowanie i obs³uga kluczy symetrycznych
• Wykorzystywanie szyfrowania symetrycznego
• Stosowanie klucza publicznego
• Bezpieczna komunikacja sieciowa
• Liczby losowe
• Zapobieganie penetracjom oraz obs³uga b³êdów
Ksi¹¿ka zawiera wszystkie informacje niezbêdne do zabezpieczenia aplikacji
przed hakerami.
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
O NOWOCIACH
ZAMÓW CENNIK
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
12060034.004.png 12060034.005.png 12060034.006.png 12060034.007.png 12060034.001.png 12060034.002.png
Spis treści
Przedmowa ................................................................................................................... 11
Wstęp.............................................................................................................................15
1. Bezpieczna inicjalizacja ............................................................................................... 25
1.1. Zabezpieczanie środowiska pracy programu 25
1.2. Ograniczanie uprawnień w systemach Windows 32
1.3. Rezygnacja z uprawnień w programach setuid 40
1.4. Ograniczanie ryzyka związanego z separacją uprawnień 45
1.5. Bezpieczne zarządzanie deskryptorami plików 48
1.6. Bezpieczne tworzenie procesu potomnego 50
1.7. Bezpieczne uruchamianie programów zewnętrznych w systemach Unix 53
1.8. Bezpieczne uruchamianie zewnętrznych programów w systemach Windows 58
1.9. Wyłączanie zrzutów pamięci w przypadku wystąpienia błędu
60
2. Kontrola dostępu ......................................................................................................... 63
2.1. Model kontroli dostępu w systemach Unix 63
2.2. Model kontroli dostępu w systemach Windows 66
2.3. Określanie, czy dany użytkownik ma dostęp do danego pliku w systemie Unix 68
2.4. Określanie, czy dany katalog jest bezpieczny
70
2.5. Bezpieczne usuwanie plików
73
2.6. Bezpieczne uzyskiwanie dostępu do informacji o pliku
79
2.7. Ograniczone prawa dostępu do nowych plików w systemach Unix
80
2.8. Blokowanie plików
83
2.9. Synchronizacja dostępu procesów do zasobów w systemach Unix
85
2.10. Synchronizacja dostępu procesów do zasobów w systemach Windows
89
2.11. Tworzenie plików tymczasowych
91
2.12. Ograniczanie dostępu do systemu plików w systemach Unix
94
2.13. Ograniczanie dostępu do systemu plików i sieci w systemie FreeBSD
95
3. Sprawdzanie poprawności danych wejściowych ....................................................... 97
3.1. Podstawowe techniki sprawdzania poprawności danych
98
3.2. Zapobieganie atakom z wykorzystaniem funkcji formatujących
102
3.3. Zapobieganie przepełnieniom bufora
105
3
12060034.003.png
3.4. Stosowanie biblioteki SafeStr 113
3.5. Zapobieganie koercji liczb całkowitych i problemowi przekroczenia zakresu 116
3.6. Bezpieczne stosowanie zmiennych środowiskowych
120
3.7. Sprawdzanie poprawności nazw plików i ścieżek
125
3.8. Obsługa kodowania URL
127
3.9. Sprawdzanie poprawności adresów poczty elektronicznej
129
3.10. Ochrona przed atakami typu cross-site scripting (XSS)
131
3.11. Ochrona przed atakami typu SQL injection
135
3.12. Wykrywanie nieprawidłowych znaków UTF-8
138
3.13. Zapobieganie przepełnieniom deskryptorów plików
podczas stosowania funkcji select()
140
4. Podstawy kryptografii symetrycznej ........................................................................ 145
4.1. Reprezentacje kluczy wykorzystywanych w algorytmach kryptograficznych 146
4.2. Generowanie losowych kluczy symetrycznych
148
4.3. Szesnastkowe reprezentacje kluczy binarnych
(lub innych nieprzetworzonych danych)
149
4.4. Przekształcanie szesnastkowych kluczy ASCII
(lub innych szesnastkowych danych ASCII) na postać binarną
151
4.5. Kodowanie Base64
152
4.6. Dekodowanie łańcucha zakodowanego zgodnie ze standardem Base64
154
4.7. Reprezentowanie kluczy (lub dowolnych innych danych binarnych)
w postaci tekstu zapisanego w języku angielskim
157
4.8. Przekształcanie kluczy tekstowych na klucze binarne
159
4.9. Stosowanie argumentów salt, jednorazowych identyfikatorów
i wektorów inicjalizacji
161
4.10. Generowanie kluczy symetrycznych na bazie haseł
165
4.11. Algorytmiczne generowanie kluczy symetrycznych
na bazie jednego tajnego klucza głównego
171
4.12. Szyfrowanie okrojonego zbioru znaków
175
4.13. Bezpieczne zarządzanie materiałem klucza
178
4.14. Badanie czasu działania algorytmów kryptograficznych
179
5. Szyfrowanie symetryczne ......................................................................................... 185
5.1. Podejmowanie decyzji w kwestii stosowania wielu algorytmów szyfrujących 185
5.2. Wybór najlepszego algorytmu szyfrującego
186
5.3. Wybór właściwej długości klucza
190
5.4. Wybór trybu pracy szyfru blokowego
193
5.5. Stosowanie podstawowych operacji szyfru blokowego
203
5.6. Stosowanie ogólnej implementacji trybu CBC
207
5.7. Stosowanie ogólnej implementacji trybu CFB
217
5.8. Stosowanie ogólnej implementacji trybu OFB
224
4 |
Spis treści
5.9. Stosowanie ogólnej implementacji trybu CTR
228
5.10. Stosowanie trybu szyfrowania CWC
233
5.11. Ręczne dodawanie i sprawdzanie dopełniania szyfru
237
5.12. Wyznaczanie z góry strumienia klucza w trybach OFB, CTR, CCM
i CWC (oraz w szyfrach strumieniowych)
239
5.13. Zrównoleglanie szyfrowania i deszyfrowania w trybach, które na takie
działania zezwalają (bez wprowadzania ewentualnych niezgodności)
240
5.14. Zrównoleglanie szyfrowania i deszyfrowania w dowolnych trybach
(a więc z możliwością wprowadzania ewentualnych niezgodności)
244
5.15. Szyfrowanie zawartości plików lub całych dysków
245
5.16. Stosowanie wysokopoziomowych, odpornych na błędy interfejsów API
dla operacji szyfrowania i deszyfrowania
249
5.17. Konfiguracja szyfru blokowego (dla trybów szyfrowania CBC,
CFB, OFB oraz ECB) w pakiecie OpenSSL
254
5.18. Stosowanie szyfrów ze zmienną długością klucza w pakiecie OpenSSL
259
5.19. Wyłączanie mechanizmu dopełniania w szyfrach pakietu OpenSSL
pracujących w trybie CBC
260
5.20. Dodatkowa konfiguracja szyfrów w pakiecie OpenSSL
261
5.21. Sprawdzanie właściwości konfiguracji szyfru w pakiecie OpenSSL
262
5.22. Wykonywanie niskopoziomowego szyfrowania i deszyfrowania
w pakiecie OpenSSL
264
5.23. Konfiguracja i stosowanie szyfru RC4
267
5.24. Stosowanie szyfrów z kluczem jednorazowym
270
5.25. Stosowanie szyfrowania symetrycznego z wykorzystaniem CryptoAPI
firmy Microsoft
271
5.26. Tworzenie obiektu klucza interfejsu CryptoAPI
na bazie dowolnych danych klucza 277
5.27. Uzyskiwanie surowych danych klucza z obiektu klucza interfejsu CryptoAPI 280
6. Funkcje skrótu i uwierzytelnianie wiadomości ........................................................ 283
6.1. Zrozumienie podstaw funkcji skrótu i kodu
uwierzytelniającego wiadomość MAC 283
6.2. Decydowanie, czy obsługiwać wiele skrótów wiadomości lub kodów MAC 287
6.3. Wybór kryptograficznego algorytmu skrótu
288
6.4. Wybór kodu uwierzytelnienia wiadomości
292
6.5. Przyrostowe tworzenie skrótów danych
296
6.6. Tworzenie skrótu z pojedynczego łańcucha znaków
300
6.7. Używanie skrótu kryptograficznego
302
6.8. Wykorzystanie identyfikatora jednorazowego do obrony
przed atakami wykorzystującymi paradoks dnia urodzin
303
6.9. Sprawdzanie spójności wiadomości
307
6.10. Używanie HMAC
309
6.11. Używanie OMAC (prostego kodu MAC opartego na szyfrze blokowym)
312
Spis treści |
5
6.12. Używanie HMAC lub OMAC z identyfikatorem jednorazowym
317
6.13. Używanie kodu MAC, który jest wystarczająco szybki
w realizacji programowej i sprzętowej
318
6.14. Używanie kodu MAC zoptymalizowanego
do szybszego działania w realizacji programowej
319
6.15. Konstruowanie funkcji skrótu z szyfru blokowego
322
6.16. Używanie szyfru blokowego do budowy mocnej funkcji skrótu
325
6.17. Używanie mniejszych znaczników MAC
329
6.18. Szyfrowanie z zachowaniem spójności wiadomości
329
6.19. Tworzenie własnego kodu MAC
331
6.20. Szyfrowanie za pomocą funkcji skrótu
332
6.21. Bezpieczne uwierzytelnianie kodu MAC (obrona przed atakami
związanymi z przechwytywaniem i powtarzaniem odpowiedzi)
334
6.22. Przetwarzanie równoległe kodu MAC
335
7. Kryptografia z kluczem publicznym.......................................................................... 337
7.1. Określanie sytuacji, w których należy stosować techniki kryptografii
z kluczem publicznym
339
7.2. Wybór algorytmu z kluczem publicznym
342
7.3. Wybór rozmiarów kluczy publicznych
343
7.4. Przetwarzanie wielkich liczb
346
7.5. Generowanie liczby pierwszej i sprawdzanie
czy dana liczba jest liczbą pierwszą
355
7.6. Generowanie pary kluczy szyfru RSA
358
7.7. Oddzielanie kluczy publicznych i prywatnych w pakiecie OpenSSL
361
7.8. Konwertowanie łańcuchów binarnych na postać liczb całkowitych
na potrzeby szyfru RSA
362
7.9. Przekształcanie liczb całkowitych do postaci łańcuchów binarnych
na potrzeby szyfru RSA
363
7.10. Podstawowa operacja szyfrowania za pomocą klucza publicznego
algorytmu RSA
364
7.11. Podstawowa operacja deszyfrowania za pomocą klucza prywatnego
algorytmu RSA
368
7.12. Podpisywanie danych za pomocą klucza prywatnego szyfru RSA
370
7.13. Weryfikacja cyfrowo podpisanych danych za pomocą klucza publicznego
algorytmu RSA 374
7.14. Bezpieczne podpisywanie i szyfrowanie danych za pomocą algorytmu RSA 376
7.15. Wykorzystywanie algorytmu DSA
381
7.16. Reprezentowanie kluczy publicznych i certyfikatów
w postaci łańcuchów binarnych (zgodnie z regułami kodowania DER)
386
7.17. Reprezentowanie kluczy i certyfikatów w postaci tekstu
(zgodnie z regułami kodowania PEM)
390
6 |
Spis treści
Zgłoś jeśli naruszono regulamin