Java Language
Bezpieczeństwo i kryptografia
Szukaj…
Wprowadzenie
Praktyki bezpieczeństwa w Javie można podzielić na dwie szerokie, niejasno zdefiniowane kategorie; Bezpieczeństwo platformy Java i bezpieczne programowanie w języku Java.
Praktyki bezpieczeństwa platformy Java dotyczą zarządzania bezpieczeństwem i integralnością JVM. Obejmuje takie tematy, jak zarządzanie dostawcami JCE i politykami bezpieczeństwa.
Bezpieczne praktyki programowania Java dotyczą najlepszych sposobów pisania bezpiecznych programów Java. Obejmuje takie tematy, jak używanie liczb losowych i kryptografii oraz zapobieganie lukom w zabezpieczeniach.
Uwagi
Chociaż należy wyraźnie podać przykłady, niektóre tematy, które należy omówić, to:
- Koncepcja / struktura dostawcy JCE
- Element listy
JCE
Java Cryptography Extension (JCE) to platforma wbudowana w JVM, aby umożliwić programistom łatwe i bezpieczne korzystanie z kryptografii w swoich programach. Robi to, zapewniając programistom prosty, przenośny interfejs, a jednocześnie korzysta z systemu dostawców JCE w celu bezpiecznego wdrożenia podstawowych operacji kryptograficznych.
Klucze i zarządzanie kluczami
Podczas gdy JCE zabezpiecza operacje kryptograficzne i generowanie kluczy, to do dewelopera należy zarządzanie ich kluczami. Więcej informacji należy podać tutaj.
Jednym z powszechnie akceptowanych najlepszych sposobów postępowania z kluczami w czasie wykonywania jest przechowywanie ich tylko jako tablic byte
, a nigdy jako ciągów znaków. Wynika to z tego, że ciągi Java są niezmienne i nie można ich ręcznie „wyczyścić” ani „wyzerować” w pamięci; podczas gdy odwołanie do ciągu można usunąć, dokładny ciąg pozostanie w pamięci, dopóki jego segment pamięci nie zostanie zużyty i ponownie użyty. Osoba atakująca miałaby duże okno, w którym mogłaby zrzucić pamięć programu i łatwo znaleźć klucz. Przeciwnie, tablice byte
są zmienne i mogą zostać zastąpione ich zawartością; dobrym pomysłem jest wyzerowanie kluczy, gdy tylko ich nie potrzebujesz.
Typowe luki w zabezpieczeniach Java
Potrzebuje treści
Obawy związane z siecią
Potrzebuje treści
Losowość i Ty
Potrzebuje treści
W większości aplikacji klasa java.utils.Random
jest doskonałym źródłem „losowych” danych. Jeśli musisz wybrać losowy element z tablicy, wygenerować losowy ciąg znaków lub utworzyć tymczasowy „unikalny” identyfikator, prawdopodobnie powinieneś użyć Random
.
Jednak wiele systemów kryptograficznych opiera się na losowości ze względu na swoje bezpieczeństwo, a losowość zapewniana przez Random
po prostu nie jest wystarczająco wysokiej jakości. W przypadku każdej operacji kryptograficznej, która wymaga losowego wprowadzania danych, należy zamiast tego użyć SecureRandom
.
Hashowanie i walidacja
Potrzebne więcej informacji.
Kryptograficzna funkcja skrótu należy do klasy funkcji o trzech istotnych właściwościach; spójność, niepowtarzalność i nieodwracalność.
Spójność: biorąc pod uwagę te same dane, funkcja skrótu zawsze zwraca tę samą wartość. To znaczy, jeśli X = Y, f (x) zawsze będzie równe f (y) dla funkcji skrótu f.
Wyjątkowość: Żadne dwa dane wejściowe funkcji skrótu nigdy nie będą dawały tego samego wyniku. To znaczy, jeśli X! = Y, f (x)! = F (y), dla dowolnych wartości X i Y.
Nieodwracalność: „Odwrócenie” funkcji skrótu jest niepraktycznie trudne, jeśli nie niemożliwe. Oznacza to, że biorąc pod uwagę tylko f (X), nie powinno być możliwości znalezienia oryginalnego X bez podania każdej możliwej wartości X przez funkcję f (siła brutalna). Nie powinno być takiej funkcji f1, że f1 (f (X)) = X.
Wiele funkcji nie ma co najmniej jednego z tych atrybutów. Na przykład wiadomo, że MD5 i SHA1 mają kolizje, tj. Dwa wejścia, które mają takie same dane wyjściowe, więc brakuje im wyjątkowości. Niektóre funkcje uważane obecnie za bezpieczne to SHA-256 i SHA-512.