Programiści powinni wiedzieć, że nigdy nie powinni próbować samodzielnie wdrażać kryptografii.
W szczególności oznacza to, że żaden ekspert niebędący ekspertem od bezpieczeństwa nie powinien dotykać bezpośrednio żadnego z prymitywów kryptograficznych. Nie powinni myśleć na poziomie AES, SHA-1 itp. Zamiast tego powinni używać funkcji wysokiego poziomu do szyfrowania i podpisywania wiadomości oraz „haszowania” haseł.
Czemu? Ponieważ inaczej ludzie są wprowadzani w błąd, myśląc, że:
- AES-256 to „świetne szyfrowanie”, mimo że używają go w trybie EBC lub używają nieprzypadkowych wartości IV itp. (W niektórych trybach nieprzypadkowe, ale unikalne IV są w porządku. W innych nie tak wiele.)
- Mogą używać tego samego klucza symetrycznego do szyfrowania wielu wiadomości (lub, co gorsza, przechowywać klucz symetryczny w kodzie do bezpośredniego użytku).
- Mogą nawet zdecydować się na użycie hasła jako klucza bezpośrednio, bez użycia funkcji wyprowadzania klucza.
- Mogą używać RSA do bezpośredniego szyfrowania danych.
- Mogą po prostu „zasolić i MD5” swoje hasła, aby zapewnić im bezpieczeństwo. (Jeśli uważasz, że tabele tęczy są najsłabszym ogniwem, pomyśl jeszcze raz .)
Żeby być na tej samej stronie, żaden z powyższych elementów nie jest w porządku . Jeśli tego nie dostaniesz, nie powinieneś dotykać krypto 10-metrowym słupem! (AES-256 to świetne szyfrowanie, ale tylko pod warunkiem, że użyjesz go właściwie. „Nie chodzi o rozmiar, ale o to, co z nim zrobisz.” :-))
O jakich funkcjach wysokiego poziomu mówię? Osobiście polecam użycie biblioteki OpenPGP (dla danych w spoczynku) lub SSL (dla danych w ruchu). Te protokoły sztywno określają prawidłowe użycie algorytmów asymetrycznych, symetrycznych i mieszających. Na przykład z OpenPGP:
- Nie używa RSA do bezpośredniego szyfrowania danych, ale zamiast tego generuje losowy klucz (symetryczny) na wiadomość (jest to ważne) i używa RSA do szyfrowania tego klucza sesji.
- Wykorzystuje funkcję wyprowadzania klucza do przekształcania haseł w klucze. (W języku OpenPGP nazywa się to S2K, ale myślę, że „funkcja wyprowadzania klucza” jest terminem bardziej standardowym.)
- Obsługuje wybranie dobrego trybu, więc nigdy nie skończysz używać EBC.
- Obsługuje zarządzanie kluczami, więc nie musisz podejmować ad hoc decyzji, które klucze są godne zaufania itp.
Podsumowanie: jeśli nie jesteś ekspertem od bezpieczeństwa i myślisz na poziomie AES, SHA-1 lub (zabraniaj nieba) MD5, robisz to źle . Użyj biblioteki napisanej przez ekspertów ds. Bezpieczeństwa (takich jak Bouncy Castle), które implementują protokoły zaprojektowane przez ekspertów ds. Bezpieczeństwa (takich jak OpenPGP do szyfrowania lub bcrypt lub scrypt do mieszania haseł), zamiast toczenia własnego.
W żadnym wypadku nie jestem ekspertem od kryptografii, ale wiem wystarczająco dużo, aby nie próbować projektować własnych protokołów ad-hoc. Żeby było jasne, cały ten post jest materiałem z Kryptografii 101 . Więc jeśli ten post nie ma dla ciebie sensu w 100%, zdecydowanie nie powinieneś zbliżać się do kryptografii.