Zrozumieć Java Card 2.0

Ten artykuł rozpoczyna się od przeglądu kart inteligentnych i krótkiego przeglądu normy ISO 7816, standardu kart inteligentnych. Biorąc pod uwagę informacje o kartach inteligentnych w poprzednich kolumnach Java Developer , ta część rozpocznie się od odpowiedzi na pytanie „Co to jest karta Java?” oraz przegląd architektury systemu Java Card. Następnie skupimy się na wielu problemach specyficznych dla karty Java Card, w tym na cyklu życia karty Java; podzbiór języków Java Card 2.0 i klasy bibliotek API; i bezpieczeństwo karty Java. Następnie omówimy środowisko wykonawcze karty Java Card i pokażemy, jak działa karta Java Card. Zakończymy pouczającym przykładem: aplikacja portfela elektronicznego napisana specjalnie dla karty Java Card.

Odtąd wszystkie odwołania do karty Java Card domyślnie odwołują się do karty Java Card 2.0.

Co to jest karta inteligentna?

Identyczny rozmiar jak karta kredytowa, karta inteligentna przechowuje i przetwarza informacje przez obwody elektroniczne osadzone w krzemie w plastikowym podłożu jej korpusu. Istnieją dwa podstawowe rodzaje kart inteligentnych: Inteligentna karta inteligentna zawiera mikroprocesor i oferuje możliwości odczytu, zapisu i obliczeń, jak mały mikrokomputer. Z drugiej strony karta pamięci nie ma mikroprocesora i jest przeznaczona tylko do przechowywania informacji. Karta pamięci wykorzystuje logikę bezpieczeństwa do kontrolowania dostępu do pamięci.

Wszystkie karty inteligentne zawierają trzy rodzaje pamięci: trwałą, niemodyfikowalną pamięć; trwała zmienna pamięć; i nietrwała, zmienna pamięć. ROM, EEPROM i RAM to najczęściej używane pamięci dla trzech odpowiednich typów obecnych kart inteligentnych. Pamięć trwała jest również nazywana pamięcią nieulotną. W tym artykule będziemy używać zamiennie terminów trwałe i nieulotne .

ISO 7816, część 1-7, zdefiniowana przez Międzynarodową Organizację Normalizacyjną, zawiera zestaw norm obejmujących różne aspekty kart inteligentnych. ISO 7816 składa się z:

  • Charakterystyka fizyczna (część 1)

  • Wymiary i położenie styków (część 2)

  • Sygnały elektroniczne i protokoły transmisji (część 3)

  • Polecenia międzybranżowe dotyczące wymiany (część 4)

  • Identyfikatory aplikacji (część 5)

  • Międzybranżowe elementy danych (część 6)

  • Polecenia międzybranżowe dla SCQL (część 7)

Poniższy diagram ilustruje fizyczne cechy karty inteligentnej, które są zdefiniowane w ISO 7816, część 1.

Więcej informacji na temat ISO 7816 i kart inteligentnych można znaleźć w sekcji „Karty inteligentne: elementarz”.

Zwykle karta inteligentna nie zawiera zasilacza, wyświetlacza ani klawiatury. Współdziała ze światem zewnętrznym za pomocą interfejsu komunikacji szeregowej za pośrednictwem ośmiu punktów kontaktowych. Wymiary i położenie styków omówiono w części 2 normy ISO 7816. Ten schemat przedstawia styki na karcie inteligentnej.

Karta inteligentna jest wkładana do urządzenia akceptującego karty (CAD), które może łączyć się z innym komputerem. Inne terminy używane w odniesieniu do urządzenia do akceptacji kart to terminal , czytnik i IFD (urządzenie interfejsu). Wszystkie zapewniają te same podstawowe funkcje, a mianowicie zasilanie karty i ustanowienie połączenia przenoszącego dane.

Kiedy dwa komputery komunikują się ze sobą, wymieniają pakiety danych, które są zbudowane zgodnie z zestawem protokołów. Podobnie karty inteligentne komunikują się ze światem zewnętrznym za pomocą własnych pakietów danych - zwanych APDU (Application Protocol Data Units). APDU zawiera komendę lub komunikat odpowiedzi. W świecie kart stosowany jest model master-slave, w którym karta inteligentna zawsze odgrywa rolę pasywną. Innymi słowy, karta inteligentna zawsze czeka na polecenie APDU z terminala. Następnie wykonuje akcję określoną w APDU i odpowiada terminalowi za pomocą odpowiedzi APDU. Polecenia APDU i odpowiedzi APDU są wymieniane naprzemiennie między kartą a terminalem.

W poniższych tabelach przedstawiono odpowiednio formaty poleceń i odpowiedzi APDU. Struktura APDU jest opisana w ISO 7816, część 4.

Polecenie APDU
Obowiązkowy nagłówek Treść warunkowa
CLA INS P1 P2 Lc Pole danych Le

Nagłówek koduje wybrane polecenie. Składa się z czterech pól: klasy (CLA), instrukcji (INS) oraz parametrów 1 i 2 (P1 i P2). Każde pole zawiera 1 bajt:

  • CLA: bajt klasy. W wielu kartach inteligentnych ten bajt służy do identyfikacji aplikacji.

  • INS: bajt instrukcji. Ten bajt wskazuje kod instrukcji.

  • P1-P2: bajty parametrów. Zapewniają one dalsze kwalifikacje dowództwa APDU.

Lc oznacza liczbę bajtów w polu danych polecenia APDU; Le oznacza maksymalną liczbę bajtów oczekiwaną w polu danych następnej odpowiedzi APDU.

Odpowiedź APDU
Treść warunkowa Obowiązkowy zwiastun
Pole danych SW1 SW2

Bajty stanu SW1 i SW2 wskazują stan przetwarzania polecenia APDU na karcie.

Co to jest karta Java?

Karta Java to karta inteligentna, na której można uruchamiać programy w języku Java. Specyfikacja Java Card 2.0 została opublikowana pod adresem //www.javasoft.com/javacard. Zawiera szczegółowe informacje dotyczące budowy maszyny wirtualnej Java Card i interfejsu programowania aplikacji (API) w kartach inteligentnych. Minimalne wymagania systemowe to 16 kilobajtów pamięci tylko do odczytu (ROM), 8 kilobajtów pamięci EEPROM i 256 bajtów pamięci o dostępie swobodnym (RAM).

Na poniższym rysunku przedstawiono architekturę systemu na karcie Java Card.

Jak pokazano na rysunku, maszyna wirtualna Java Card jest zbudowana na podstawie określonego układu scalonego (IC) i natywnej implementacji systemu operacyjnego. Warstwa JVM ukrywa zastrzeżoną technologię producenta ze wspólnym językiem i interfejsem systemu. Struktura Java Card definiuje zestaw klas interfejsu programowania aplikacji (API) do tworzenia aplikacji Java Card i do świadczenia usług systemowych dla tych aplikacji. Określona branża lub firma może dostarczyć dodatkowe biblioteki w celu świadczenia usługi lub udoskonalenia modelu bezpieczeństwa i systemu. Aplikacje Java Card nazywane są apletami . Na jednej karcie może znajdować się wiele apletów. Każdy aplet jest jednoznacznie identyfikowany przez swój AID (identyfikator aplikacji), zgodnie z definicją w ISO 7816, część 5.

Ważną kwestią, o której należy pamiętać, jest to, czym nie są karty inteligentne : nie są to komputery osobiste. Mają ograniczone zasoby pamięci i moc obliczeniową. Użytkownicy nie powinni myśleć o Java Card 2.0 jako po prostu okrojonej wersji JDK.

Żywotność karty Java Card

Okres istnienia karty Java zaczyna się, gdy natywny system operacyjny, maszyna wirtualna Java Card, biblioteki klas API i opcjonalnie aplety są wypalane w pamięci ROM. Ten proces zapisywania trwałych komponentów w niezmiennej pamięci chipa w celu wykonywania przychodzących poleceń nazywa się maskowaniem .

Zanim karta Java Card wyląduje w Twoim portfelu, musi przejść inicjalizację i personalizację. Inicjalizacja odnosi się do ładowania danych ogólnych do pamięci nieulotnej karty. Te dane są identyczne na wielu kartach i nie dotyczą konkretnej osoby; przykładem może być nazwa wystawcy lub producenta.

Kolejnym krokiem personalizacji jest przypisanie karty do osoby. Może to nastąpić poprzez personalizację fizyczną lub personalizację elektroniczną. Personalizacja fizyczna odnosi się do wytłaczania lub grawerowania laserowego Twojego nazwiska i numeru karty na plastikowej powierzchni karty. Personalizacja elektroniczna odnosi się do ładowania danych osobowych do pamięci nieulotnej karty, na przykład klucza osobistego, nazwiska i numeru PIN.

Inicjalizacja i personalizacja różnią się w zależności od dostawcy i wystawcy. W obu przypadkach do przechowywania danych często używana jest pamięć EEPROM (rodzaj pamięci nieulotnej).

W tym momencie karta Java Card jest gotowa do użycia. Kartę Java Card można otrzymać od wydawcy lub kupić od sprzedawcy. Karty sprzedawane przez sprzedawcę mają charakter uniwersalny, w takim przypadku personalizacja jest często pomijana.

Teraz możesz włożyć swoją kartę Java Card do czytnika i wysyłać polecenia APDU do apletów znajdujących się na karcie lub pobrać więcej apletów lub danych na kartę.

Karta Java Card pozostaje aktywna do momentu wygaśnięcia lub zablokowania z powodu nieodwracalnego błędu.

Okres istnienia maszyny wirtualnej Java Card

W przeciwieństwie do wirtualnej maszyny Java (JVM) na komputerze PC lub stacji roboczej, maszyna wirtualna Java Card działa wiecznie.

Większość informacji przechowywanych na karcie musi zostać zachowana nawet po odłączeniu zasilania - czyli po wyjęciu karty z czytnika. Maszyna wirtualna Java Card tworzy obiekty w pamięci EEPROM do przechowywania trwałych informacji. Okres użytkowania maszyny wirtualnej Java Card to czas życia karty. W przypadku braku zasilania maszyna wirtualna działa w nieskończonym cyklu zegara.

Czas życia apletów i obiektów Java Card

Życie apletu rozpoczyna się, gdy jest prawidłowo zainstalowany i zarejestrowany w tabeli rejestru systemu, a kończy się, gdy jest usuwany z tabeli. Przestrzeń usuniętego apletu może, ale nie musi, zostać ponownie wykorzystana, w zależności od tego, czy na karcie zaimplementowano czyszczenie pamięci. Aplet na karcie jest nieaktywny, dopóki nie zostanie wyraźnie wybrany przez terminal.

Obiekty są tworzone w pamięci trwałej (na przykład EEPROM). Mogłyby zostać utracone lub zebrane jako śmieci, jeśli inne trwałe obiekty nie odwołują się do nich. Jednak zapisywanie do EEPROM jest tysiąc razy wolniejsze niż do pamięci RAM.

Niektóre obiekty są często używane, a zawartość ich pól nie musi być trwała. Karta Java Card obsługuje przejściowe (tymczasowe) obiekty w pamięci RAM. Gdy obiekt zostanie zadeklarowany jako przejściowy, jego zawartość nie może zostać przeniesiona z powrotem do pamięci trwałej.

Podzbiór języków Java Card 2.0

Programy Java Card są oczywiście napisane w języku Java. Są one kompilowane przy użyciu popularnych kompilatorów języka Java. Ze względu na ograniczone zasoby pamięci i moc obliczeniową karta Java Card nie obsługuje wszystkich funkcji językowych zdefiniowanych w specyfikacji języka Java. W szczególności karta Java Card nie obsługuje:

  • Dynamiczne ładowanie klas

  • Menadżer ochrony

  • Wątki i synchronizacja

  • Klonowanie obiektów

  • Finalizacja

  • Duże pierwotne typy danych (float, double, long i char)

Nic dziwnego, że słowa kluczowe obsługujące te funkcje są również pomijane w języku. Osoby wdrażające maszyny wirtualne mogą zdecydować się na obsługę 32-bitowych typów całkowitych lub metod natywnych dla apletów po wydaniu, jeśli pracują na bardziej zaawansowanej karcie inteligentnej z większą ilością pamięci. Aplety po wydaniu to te aplety, które są instalowane na karcie Java Card po wydaniu karty posiadaczowi karty.

Framework Java Card 2.0

Karty inteligentne są dostępne na rynku od 20 lat i większość z nich jest ogólnie zgodna z ISO 7816, części 1-7 i / lub EMV. Sprawdziliśmy już ISO 7816. Co to jest EMV? Standard EMV, zdefiniowany przez Europay, MasterCard i Visa, jest oparty na serii norm ISO 7816 z dodatkowymi zastrzeżonymi funkcjami, aby sprostać specyficznym potrzebom branży finansowej. Środowisko Java Card Framework zostało zaprojektowane tak, aby łatwo obsługiwać systemy i aplikacje kart inteligentnych. Ukrywa szczegóły infrastruktury kart inteligentnych i zapewnia programistom aplikacji Java Card stosunkowo łatwy i prosty interfejs programowania.

Framework Java Card zawiera cztery pakiety:

Nazwa pakietu Opis
javacard.framework To jest podstawowy pakiet na karcie. To definiuje klasy, takie jak i , które są podstawowym budulcem dla programów Java Card i , i , które zapewniają dłuższy czas pracy i obsługa systemu kart do programów Java, takich jak obchodzenia APDU i udostępniania obiektu
javacardx.framework Ten pakiet zapewnia projekt zorientowany obiektowo dla systemu plików zgodnego z ISO 7816-4. Obsługuje pliki elementarne (EF), pliki dedykowane (DF) i pliki APDU zorientowane na pliki, jak określono w ISO7816
javacardx.crypto i javacardx.cryptoEnc Te dwa pakiety obsługują funkcje kryptograficzne wymagane w kartach inteligentnych

Zgodnie z konwencją nazewnictwa Java, pakiety Java Cardx są rozszerzeniami struktury Java Card. Nie jest wymagane, abyś wspierał ich na karcie.

Bezpieczeństwo karty Java

Aplety Java podlegają ograniczeniom bezpieczeństwa Java, jednak model zabezpieczeń systemów Java Card różni się pod wieloma względami od standardowej Javy.

Klasa Security Manager nie jest obsługiwana na karcie Java Card. Zasady zabezpieczeń języka są wdrażane przez maszynę wirtualną.

Aplety Java tworzą obiekty, które przechowują dane i manipulują nimi. Obiekt jest własnością apletu, który go utworzył. Mimo że aplet może mieć odniesienie do obiektu, nie może wywołać metod obiektu, chyba że jest właścicielem obiektu lub obiekt jest jawnie udostępniony. Aplet może współużytkować dowolny ze swoich obiektów z określonym apletem lub ze wszystkimi apletami.

Aplet jest niezależną jednostką w ramach karty Java Card. Na jego wybór, wykonanie i funkcjonalność nie mają wpływu inne aplety znajdujące się na tej samej karcie.

Jak rzeczy współdziałają w karcie Java Card

Wewnątrz karty Java Card, JCRE (Java Card Runtime Environment) odnosi się do maszyny wirtualnej Java Card i klas w Java Card Framework. Każdy aplet na karcie Java Card jest powiązany z unikalnym AID przypisanym przez JCRE.

Po poprawnym załadowaniu apletu do pamięci trwałej karty i połączeniu go z Java Card Framework i innymi bibliotekami na karcie, JCRE wywołuje metodę instalacji apletu jako ostatni krok w procesie instalacji apletu. Publiczna metoda statyczna installmusi być zaimplementowana przez klasę apletów w celu utworzenia instancji apletu i zarejestrowania jej w JCRE. Ponieważ pamięć jest ograniczona, dobrą praktyką programistyczną jest na tym etapie tworzenie i inicjowanie obiektów, których aplet będzie potrzebował podczas swojego życia.