Wszystko, co musisz wiedzieć o szyfrowaniu w Javie



W tym artykule znajdziesz szczegółową i wszechstronną wiedzę na temat szyfrowania w Javie i jak go używać z przykładami.

Szyfrowanie to metoda wykorzystująca algorytmy matematyczne do kamuflowania znaczenia informacji, tak aby tylko upoważnione osoby mogły ją odszyfrować. W tym artykule omówimy szyfrowanie i odszyfrowywanie w w następującej kolejności:

Wprowadzenie do szyfrowania w Javie

Szyfrowanie jest wdrażane w celu ochrony naszych danych (takich jak teksty, rozmowy i głos), niezależnie od tego, czy są one przechowywane na komputerze, czy są przesyłane przez Internet. Najnowsze technologie szyfrowania są podstawowymi elementami każdego bezpiecznego środowiska komputerowego.





Podstawowa rola bezpieczeństwa szyfrowania polega na zdolności algorytmu do generowania tekstu zaszyfrowanego (zaszyfrowanego tekstu), którego trudno jest przywrócić do pierwotnego tekstu jawnego. Użycie kluczy stwarza również kolejny poziom bezpieczeństwa w stosunku do metod ochrony naszych informacji. Klucz to pewna informacja, która pozwala tylko tym, którzy go przechowują, zakodować i odszyfrować wiadomość.

Szyfrowanie i deszyfrowanie w Javie



Algorytmy szyfrowania symetrycznego

Algorytmy symetryczne wykorzystują ten sam klucz do szyfrowania i deszyfrowania. Takie algorytmy mogą działać tylko w trybie blokowym (który działa na blokach danych o stałym rozmiarze) lub w trybie strumieniowym (który działa na bitach lub bajtach danych). Takie algorytmysą również powszechnie używane do zastosowań, takich jak szyfrowanie danych, szyfrowanie plików i szyfrowanie przesyłanych danych w sieciach komunikacyjnych (takich jak TLS, e-maile, wiadomości błyskawiczne itp.)

zamień double w int java

Algorytmy szyfrowania asymetrycznego (lub klucza publicznego)

W przeciwieństwie do algorytmów symetrycznych, które wykorzystują ten sam klucz zarówno do operacji szyfrowania, jak i deszyfrowania, algorytmy asymetryczne używają dwóch identycznych kluczy dla tych dwóch kroków. Algorytmy te są wykorzystywane do obliczania podpisów cyfrowych i protokołów ustanawiania kluczy. Jednak wiąże się to również z wyzwaniem, które wymaga użycia dwóch kluczy, co czyni rzeczy bardziej złożonymi.



Aby bezpiecznie skonfigurować dowolny podstawowy schemat szyfrowania, bardzo ważne jest, aby wszystkie takie parametry (przynajmniej) zostały zaprojektowane poprawnie:

  • Ważny jest wybór odpowiedniego algorytmu.
  • Wybór odpowiedniego trybu pracy do odpowiedniego zadania
  • Wybór odpowiedniego schematu wypełnienia zgodnie z wymaganiami
  • Odpowiedni dobór kluczy i ich rozmiarów
  • Poprawna inicjalizacja za pomocą bezpiecznego kryptograficznie CSPRING.

Bardzo ważne jest, aby pamiętać o bezpiecznej konfiguracji wszystkich tych parametrów. Nawet drobna błędna konfiguracja może zagrozić całemu systemowi kryptograficznemu i otworzyć go na ataki hakerów i innego złośliwego oprogramowania. Dlatego, aby dyskusja była prosta, omówmy tylko niezależne od algorytmów inicjalizacje szyfru. Zamiast wykonywać takie szyfrowanie samodzielnie, zawsze lepiej jest pozwolić ekspertom na skonfigurowanie konfiguracji bardziej zależnych od algorytmu, takich jak wartości p i q algorytmu RSA itp. Po prostu skonfiguruj podstawowe parametry kryptograficzne powyżej ponad połowy kilkanaście klas.

Wprowadzenie hierarchii klas, mnóstwo przeciążonych konstruktorów / metod i tak dalej, dodając wiele zawiłości, które sprawiają, że jest to niepotrzebne. Chciałbym, żeby Java nie komplikowała podstawowych konfiguracji i po prostu wykorzystywałaby bardziej uproszczoną architekturę, taką jak Microsoft, gdzie wszystkie takie parametry mieszczą się w granicach jednej klasy SymmetricAlgorithm i AsymmetricAlgorithm. W przypadku pierwszych trzech parametrów, które mają zostać określone (algorytm, tryb działania i schemat wypełnienia), obiekt Cipher wykorzystuje ciąg transformacji.

  • Wybór odpowiedniego algorytmu

Ciąg transformacji niewątpliwie zawiera nazwę algorytmu kryptograficznego. Pomiędzy szyfrowaniem symetrycznym i asymetrycznym istnieje 11 algorytmów (nie dotyczących różnych kombinacji PBEWithAnd), które można określić zgodnie z dokumentacją standardowej nazwy algorytmu. Spośród nich tylko dwa (po jednym dla każdego, szyfrowanie symetryczne i asymetryczne) są właściwie w pełni zabezpieczone.

Pozostałe algorytmy są albo nadmiernie zepsute (DES, RC2 itp.), Albo zaczęły się pojawiać pęknięcia (RC5), co czyni go łamliwym przy wystarczającej mocy procesora - może być już zepsuty, zanim to przeczytasz. Deweloper zorientowany na bezpieczeństwo nie może czytać szczegółów specyfikacji NIST ani śledzić najnowszych wydarzeń i badań w społeczności kryptograficznej. Mogą wychwycić zepsute lub ryzykowne algorytmy, skrót lub generator pseudolosowy.

Zawsze dla:

  1. Algorytm symetryczny: używany jest szyfr blokowy AES / AESWrap.

  2. Algorytm asymetryczny: używany jest algorytm RSA.

  • Tryb działania

Tryb działania jest częścią transformacji i ma znaczenie tylko dla szyfrów blokowych. Kiedy używamy asymetrycznych szyfrów, używaj EBC jako trybu działania, co zasadniczo jest hackowaniem za kulisami, co oznacza zignorowanie tej wartości. Dostawcy Java, tacy jak SunJCE, SunPKCS11, domyślnie korzystają z trybu EBC dla algorytmów symetrycznych i asymetrycznych. Może to być dobre rozwiązanie dla algorytmów asymetrycznych, ale zły pomysł dla szyfrów blokowych.

Dostawców można poinstruować, aby wprowadzili bezpieczne wartości domyślne w oparciu o zastosowany algorytm. Użyj szyfrowania symetrycznego, aby uchronić się przed atakami polegającymi na powtarzaniu lub znanym tekstem jawnym. Użyj również transformacji, która w pełni określa algorytm (tj. Jego tryb działania i wypełnienie). Nigdy, przenigdy nie rób czegoś takiego, jak to wymienione poniżej.

Jak wyżej, algorytm AES byłby używany z trybem pracy ECB, co bardzo ułatwia ataki typu Replay. W przypadku nowego rozwoju, jeśli istnieje najmniejsza możliwość odświeżenia starej pracy, powinniśmy użyć uwierzytelnionego szyfrowania z powiązanymi trybami danych (AEAD) (na przykład GCM i CCM). Mamy tag uwierzytelniający o pełnej długości 128 bitów. Jeśli używamy trybu nieuwierzytelnionego, używamy CBC lub CTR z MAC do uwierzytelnienia zaszyfrowanego tekstu.

  • Wybór odpowiedniego schematu wypełnienia

Typowe tryby szyfrowania blokowego wymagają, aby długość zwykłego tekstu była wielokrotnością rozmiaru bloku podstawowego algorytmu szyfrowania, co rzadko ma miejsce. Dlatego potrzebujemy trochę wypełnienia.Program Java zapewnia nam trzy różne schematy szyfrowania symetrycznego, jeden to No Padding, który jest niedopuszczalny, a drugi to ISO10126Padding, który został wycofany od 2007 roku).

Dlatego jedyną odpowiednią opcją jest użycie PKCS5Padding. Połączenie niektórych trybów działania (na przykład trybu CBC) i schematu wypełniania PKCS5Padding może prowadzić do ataków dopełniania oracle. W ogóle nie wspominając o schemacie dopełniania jest bardziej niebezpieczne niż zapewnienie schematu podatnego tylko na określone typy ataków. Tryb pracy AEAD jest najbardziej zalecany w celu zapewnienia ochrony przed takimi atakami.

  • Algorytmy asymetryczne

W algorytmach asymetrycznych mamy możliwość wyboru spośród dwóch schematów dopełnienia. Ważne jest, aby upewnić się, że używane są tylko schematy OAEPWithAndPadding. W przypadku skrótu użyj SHA1 lub SHA256 / 384/512. W przypadku funkcji generowania maski (MGF) użyj wypełnienia MGF1 zgodnie ze specyfikacją. PKCS1Padding z RSA jest podatny na ataki szyfrogramem [6] od 1998 roku.

Tutaj mówimy o poprawnym sposobie użycia transformacji w metodzie „Cipher.getInstance”.

  • Szyfrowanie symetryczne

  • Szyfrowanie asymetryczne

Poziom bezpieczeństwa dowolnego schematu szyfrowania jest wprost proporcjonalny do rozmiaru jego klucza. Długość klucza musi być na tyle długa, aby jakiekolwiek ataki brutalnej siły stały się niewykonalne w tym samym czasie, powinna być również wystarczająco krótka, aby pamiętać o wykonalności obliczeniowej. Ponadto musimy spróbować zastanowić się, co jeszcze wytrzyma postęp obliczeniowy przez następne 30 lat.

W ten sposób dochodzimy do końca artykułu o szyfrowaniu w Javie. Mam nadzieję, że masz pomysł na szyfrowanie i deszyfrowanie i dlaczego jest używany w Javie.

Sprawdź autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja J2EE i SOA firmy Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistami Java. Kurs ma na celu zapewnienie przewagi w programowaniu w języku Java i szkolenie zarówno podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy tego bloga „Szyfrowanie w Javie”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.