C_i_C_Bezpieczne_programowanie_Receptury_ccprec.pdf

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