Obejeście weryfikacji podpisu providera kryptograficznego na HotSpot JRE

Aby dodać do JCA provider kryptograficzny Javy zawierający implementację związaną z szyfrowaniem (dokładniej Cipher, KeyAgreement, KeyGenerator, MAC albo SecretKey) trzeba go wcześniej podpisać certyfikatem uzyskanym od firmy Oracle (lub IBM). Cytując za dokumentacją, w ten sposób JCA uwierzytelnia dostawcę żeby tylko providery podpisane przez zaufane podmioty mogły być włączone do JCA. Znalazłem lukę, która pozwala to wymaganie obejść.

Read more

Java HotSpot Cryptographic Provider signature verification issue [en]

According to the Java HotSpot documentation when instantiating a provider’s implementation (class) of a Cipher, KeyAgreement, KeyGenerator, MAC or SecretKey factory, the framework will determine the provider’s codebase (JAR file) and verify its signature. Even developer has to obtain a code-signing certificate from Oracle (or IBM) so that you can use it to sign your provider prior to testing. This way, JCA authenticates the provider and ensures that only providers signed by trusted entity can be plugged into JCA. However, I have found flaw which allows an attacker to bypass this requirement.

Read more

Nietypowe wywołanie invokespecial z Jasmin (Java assembler)

Byłem ciekaw czy z klasy Java można wywołać invokespecial na rzecz nieprywatnej metody przywiązanej do instancji obiektu z zewnątrz jego klasy. Za najprostszą metodę stworzenia takiej “dziwnej” klasy uznałem użycie assemblera Jasmin. Był to dobry pretekst do zapoznania się z tym narzędziem. Read more

Java UDF w DB2

Zaawansowane serwery baz danych umożliwiają użytkownikom rozszerzanie dostępnej logiki (User-defined routines)  nie tylko w postaci podprogramów napisanych w SQL ale także w innych językach programowania. IBM DB2 umożliwia tworzenie podprogramów w PL/SQL lub w postaci zewnętrznych podprogramów w różnych językach w tym w Javie.  Może się to okazać przydatne na przykład gdy chcemy użyć bibliotek niedostępnych z poziomu PL/SQL. Tak było w moim przypadku – potrzebowałem specyficznych algorytmów kryptograficznych.

Zdecydowałem się na stworzenie funkcji użytkownika w Javie (User Defined Functions). W tym poście pokażę jak stworzyć funkcję UDF używając rekomendowanego sposobu przekazywania parametrów PARAMETER STYLE JAVA. Korzystałem z serwera DB2 9.1 zainstalowanego na systemie AIX 5.3. Read more

Porównanie prędkości kryptograficznych funkcji skrótu

Kryptograficznych funkcji skrótu używa praktycznie każdy programista. Zwykle kryterium wyboru nie jest ich prędkość a odporność na różnego rodzaju ataki. Jest parę własności które taka funkcja skrótu powinna spełniać (preimage resistance, second preimage resistance, collision resistance). Zwykle dobrze jest się kierować zaleceniami Amerykańskiego Narodowego Instytutu Standardów będącego wyznacznikiem dla standardów publicznej kryptografii.  Publikuje on zalecenia dotyczące stosowania kryptograficznych funkcji skrótu. Zaleca między innymi aby nie stosować już funkcji MD5, zaś funkcja SHA-1 powinna być stosowana co najwyżej do 2010 roku. Niemniej jednak istnieją zastosowania w których priorytetem wcale nie jest ogólne bezpieczeństwo lecz któraś ze szczególnych własności i jej jakość dostarczana przez każdą z funkcji jest więcej niż wystarczająca. W jednej z moich implementacji interesowała mnie jedynie własność jednokierunkowości (preimage reistance) na którą ataki są najtrudniejsze a bezpieczeństwo większości standardowych funkcji pod tym względem było dla mnie więcej niż wystarczające. Ważna była prędkość obliczania skrótów dla małych bloków danych.

Przeprowadzone przez innych testy prędkości nie dotyczyły zwykle implementacji we współczesnej Javie (optymalizacja runtime ma tu duże znaczenie). Stanąłem więc przed koniecznością samodzielnego przeprowadzenia testu. Read more

Workspace w NetBeans

Wydaje się, że w NetBeans brakuje odpowiednika workspace znanego z Eclipse. Okazuje się jednak, że taka funkcjonalność istnieje choć nie widać jej w GUI. Read more

enum – zabawy z dekompilatorem

Zastanawiałeś się co tak na prawdę kryje się pod nową (od 5.0) składnią enum w Javie?  Dlaczego enum nie może rozszerzać innej klasy? Przejrzenie zdekompilowanego kodu pozwoli zrozumieć wiele niuansów. Read more

Materiały do 4 Spotkania Śląskiej Grupy Użytkowników Technologii Java

Dnia 10.12.2008 na czwartym spotkaniu Silesia Java User Group prowadziłem prelekcję na temat kryptografii w Javie. Zaskoczyła mnie ilość pytań po prezentacji co uznaję za miarę zainteresowania.

Plan prezentacji: Read more

Kruczki przy użyciu typów zmiennoprzecinkowych

Zgadnij co wypisze poniższy fragment kodu:

                Set iSet = new HashSet();
                Set fSet = new HashSet();
                Set dSet = new HashSet();
		int start = Integer.MAX_VALUE - 10;
		int stop = Integer.MAX_VALUE;
		for (int i = start; i < stop; ++i) {
			iSet.add(i);
			fSet.add((float)i);
			dSet.add((double)i);
		}
		System.out.println(iSet.size());
		System.out.println(fSet.size());
		System.out.println(dSet.size());

Read more

Zmienne wyniki porównań java.net.URL

Zgadnij co wypisze na konsolę taki fragment kodu:

public static void main(String a[]) throws MalformedURLException {
java.net.URL url1 = new java.net.URL("http://o2.pl");
java.net.URL url2 = new java.net.URL("http://tlen.pl");
System.out.println(url1.equals(url2));
}

Zabawne, ale nie będzie to za każdym razem to samo co łamie założenia metody equals. Read more

Next Page »