Kryptografia w Javie

Dwiema głównymi bibliotekami kryptograficznymi w Javie są Java Cryptography Architecture (JCA) i Java Cryptography Extension (JCE). Pierwsza z nich, JCA, jest ściśle zintegrowana z rdzeniem Javy (ang. core Java API) i dostarcza najbardziej podstawowych kryptograficznych funkcjonalności. Z kolei druga biblioteka, JCE, implementuje wiele dodatkowych bardziej zaawansowanych operacji kryptograficznych.

W przeszłości obie biblioteki JCA i JCE były poddane oddzielnym amerykańskim regulacjom eksportowym. Z upływem czasu ograniczenia zostały złagodzone i obecnie obie biblioteki są dostępne razem z Java SE. W związku z tym, rozgraniczenie na dwie różne biblioteki nie jest już istotne (trzeba mieć na uwadze, że nie znaczy to, że w przyszłości sytuacje znowu nie ulegnie zmianie).

Klasy i funkcje zdefiniowane w JCA i JCE tworzą bogate API, które umożliwia wykowywanie kryptograficznych operacji w aplikacjach Javowych. Poza konkretnymi akcjami, klasy opisują również zarówno bardziej abstrakcyjne pojęcia, jak i konkretne obiekty, związane z zagadnieniami zabezpieczeń. Publiczne klasy należące do JCA i JCE nazywane są silnikami (ang. engines).

Klasy zdefiniowane w JCA są dostępne w pakiecie java.security, natomiast klasy należące do JCE są zlokalizowane w pakiecie javax.crypto.

Najważniejsze klasy dostarczane w bibliotece JCA służą do generowania losowych liczb (SecureRandom), do generowania i zarządzania sekretnymi kluczami (KeyPairGenerator, KeyStore), podpisywania wiadomości (MessageDigest, Signature) oraz do zarządzania certyfikatami (CertificateFactory, CertPathBuilder, CertStore).

Biblioteka JCA zawiera klasy, które umożliwiają właściwe szyfrowanie i deszyfrowanie (Cipher), generowanie i negocjowanie sekretnego klucza szyfrującego (KeyGenerator, SecretKeyFactory, KeyAgreement) oraz czynności związane z uwierzytelnianiem wiadomości (Mac).

Klasy Dostawców

JCA i JCE definiują wszystkie kryptograficzne operacje i obiekty, natomiast ich konkretne implementacje są zlokalizowane w oddzielnych klasach, nazywanych dostawcami (ang. providers). Klasy dostawców implementują więc API, które zostało zdefiniowane w głównych klasach JCA i JCE, i to właśnie one są odpowiedzialne za dostarczenie konkretnych kryptograficznych algorytmów.

Dzięki takiemu podziałowi, cała kryptograficzna architektura w Javie jest stosunkowo elastyczna. Interfejs i ogólne klasy są oddzielone od swoich implementacji. Przez większość czasu, po wstępnej inicjalizacji, programiści muszę operować jedynie na abstrakcyjnych obiektach, takich jak "szyfr" lub "sekretny klucz".

Każda klasa dostawcy, zanim będzie mogła być użyta w aplikacjach Javowych, musi być zostać wcześniej podpisana za pomocą certyfikatu otrzymanego od Oracle. Szczegółowe instrukcje jak tego dokonać można znaleźć w dokumentacji JDK.

Klasy dostawców mogą zostać zainstalowane poprzez skonfigurowanie Java Runtime. W tym celu należy zainstalować pliki JAR zawierające klasy dostawców, a następnie włączyć je poprzez dopisanie ich nazw do pliku java.security. Drugą metodą użycia klas dostawców jest załadowanie ich podczas wykonywania kodu docelowego programu (za pomocą funkcji Security.addProvider(..)).

Każda funkcjonalność, na przykład algorytm szyfru AES, może być zdefiniowana w wielu różnych klasach dostawców. Podczas wywoływania funkcji API bibliotek JCA i JCE można sprecyzować, który dostawca powinien zostać użyty. Alternatywnie, silnik Javy może samodzielnie wybrać implementację spośród zarejestrowanych i aktualnie dostępnych dostawców, bazując na preferencjach kolejności zdefiniowanych w pliku java.security.

Popularne Klasy Dostawców

Domyślny zestaw dostawców SUN (obecnie należący do Oracle) jest instalowany razem z pozostałymi głównymi bibliotekami kryptograficznymi Javy. Zawiera on wiele różnych klas dostawców SUN (SUN, SunJCE, SunPKCS11, itd.), które wykorzystywane są przez obie biblioteki JCA i JCE. Definiują one większość (jeśli nie wszystkie) operacji kryptograficznych i mogą zostać wykorzystane w aplikacjach Javowych bez potrzeby dodatkowych przygotowań.

Przykładami innych klas dostawców jest zbiór klas nazwany Bouncy Castle. Został on utworzony przez australijską organizację charytatywną (ang. charitable), w związku z tym nie dotyczą go żadne ograniczenia narzucane przez amerykańskie prawo. Bouncy Castle dostarcza wiele klas, które implementują cały szereg różnych kryptograficznych operacji. Dokładny opis projektu znajduje się na stronie internetowej: www.bouncycastle.org.

Szereg innych klas dostawców zostało utworzonych przez organizację o nazwie Cryptix. Niestety ten projekt nie był aktywnie rozwijany od roku 2005. Strona internetowa projektu Cryptix znajduje się pod adresem: www.cryptix.org.

Pliki Policy

Domyślnie Java ogranicza wielkość wielu sekretnych kluczy szyfrujących, nie pozwalając użyć ich podczas wykonywania aplikacji. Ograniczenia te są związane z amerykańskim prawem i służą uniemożliwieniu wykorzystywania zbyt silnego szyfrowania w tworzonych aplikacjach.

Istnieje sposób na obejście tych ograniczeń, poprzez zainstalowanie właściwych plików policy dopuszczających stosowanie szyfrów o dowolnej sile (ang. unlimited strength policy files). Mogą zostać one zwykle pobrane z tej samej strony, z której można ściągnąć pliki instalacyjne samej Javy. Właściwy link do pobrania plików znajduje się zazwyczaj na dole strony. Po uzyskaniu spakowanego archiwum, należy zapoznać się z instrukcjami zawartymi w pliku README.