SVEUČILIŠTE U ZAGREBU
Andro Galinović
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA 0036381850
Zavod za elektroniku, mikroelektroniku, računalne i inteligentne sustave Zagreb, srpanj 2005.



DIPLOMSKI RAD br. 1546



SIGURNOSNI MEHANIZMI JAVA PAMETNE KARTICE




Sadržaj
1. Uvod
2. Pametne kartice
2.1 Što su pametne kartice?
2.2. Kako izgledaju pametne kartice?
2.2.1. Kontaktne pametne kartice
2.2.2. Bezkontaktne pametne kartice
2.3. Sigurnost pametnih kartica
2.3.1. Sigurnosna svojstva sklopovlja pametnih kartica
2.3.2. Sigurna programska svojstva pametnih kartica
3. Java pametne kartice
3.1. Java Card platforma
3.1.1. Java Card virtualni stogovni stroj
3.1.2. Java Card izvršna okolina
3.1.3. Java Card API
3.1.3.1. Paket javacard.security
3.1.3.2. Paket javacardx.crypo
4. Java platforma
4.1. Osnovna sigurnost
4.1.1. Paket java.security
4.1.2. Paket java.security.cert
4.1.3. Paket java.security.interfaces
4.1.4. Paket java.security.spec
4.1.5. Davatelji kriptografskih usluga
4.1.6. Instalacija i registracija Java davatelja
4.2. Certifikacijski putevi
4.3. JavaTM Secure Socket Extension
4.4. JavaTM Authentication and Authorization Service
4.5. JavaTM Generic Security Service
4.6. JavaTM Cryptography Extension
4.6.1. Paket javax.crypto
4.6.2. Paket javax.crypto.interfaces
4.6.3. Paket javax.crypto.spec
4.6.4. Davatelji Java kriptografskih proširenja
5. Sigurnosni mehanizmi pametne zdravstvene iskaznice
5.1. Paket pametnaZdravstvenaIskaznica
5.1.1. Sučelje SuceljeSigurnosti
5.1.2. Razred UslugaSigurnosti
5.1.2.1. Korištenje razreda UslugaSigurnosti
5.1.2.2. Metoda predprocesirajAPDU
5.1.2.3. Metoda procesirajAPDU
5.1.2.4. Inicijalizacija sigurnosnih mehanizama
5.1.2.5. Uspostava sigurnog komunikacijskog kanala
5.1.2.6. Provjera PIN-a
5.1.2.7. Promjena PIN-a
5.1.2.8. Potpisivanje podataka
5.1.2.9. Metoda postprocesirajAPDU
5.1.2.10. Metode za ispitivanje određenih uvjeta
5.2. Paket terminalPZI
5.2.1. Razred SigurnaAPDUVeza
5.2.1.1. Korištenje razreda SigurnaAPDUVeza
5.2.1.2. Metoda initSigurnost
5.2.1.3. Metoda initKarticu
5.2.1.4. Metoda izmijeniAPDU
5.2.1.5. Metoda traziPotpisPodataka
5.2.1.6. Metoda identificirajKorisnika
5.2.1.7. Metoda provjeriPotpis
5.2.2. Sučelje DohvatacCertifikata
5.2.3. Razred DatotecniDohvatacCertifikata
6. Zaključak
7. Literatura
Dodatak: Kazalo pojmova i korištenih kratica
Program


1. Uvod

U današnjem prenapučenom dinamičnom svijetu stari principi birokracije postaju neprikladni i javlja se potreba za razvijanjem novih tehnologija koje približavaju digitalni svijet računala pojedincu. Jedna od takvih tehnologija je pametna mikroprocesorska kartica čija primjena može u potpunosti ukloniti potrebu za nošenjem i posjedovanjem više papirnatih dokumenata.

U svijetu gdje uvijek postoji želja za prevarom i krađom ova nova tehnologija morala je od svojih začetaka imati dobro riješenu sigurnost. Mikroprocesorske pametne kartice imaju vrlo dobro riješene sklopovske sigurnosne aspekte, dok programski sigurnosni aspekti prvenstveno ovise oprogrameru koji stvara kartične aplikacije. Ovo znatno otežava i produljuje razvoj kartičnih aplikacija i ukazuje na potrebu razvijanja zasebnih programskih modula koji bi se brinuli o sigurnosti i bili transparentni aplikacijama.

Cilj ovog rada bio je razviti jedan takav programski modul koji bi pružao transparentnu sigurnost između aplikacije na terminalu i kartične aplikacije. Razvijen programski modul je korišten na primjeru implementacije Java pametne kartice kao napredne zdravstvene iskaznice (Pametna zdravstvena iskaznica).

Rad sadrži opis ostvarenog modula i svih korištenih mehanizama.




2. Pametne kartice


2.1 Što su pametne kartice?


Pametne kartice su plastične kartice koje imaju ugrađeni čip. Prve pametne kartice su se pojavile 1984. u Francuskoj, 14. godina nakon što je ideju patentirao dr. Kunitaka Arimura. Slika 2.1. prikazuje osnovnu podjelu kartica.



Podjela kartica


Slika 2.1. Osnovna podjela kartica s tipičnim predstavnicima


Od njihova početka, pametne kartice se koriste u mnoge svrhe kao što su: telefonske čip kartice, GSM SIM kartice, kartice za skladištenje podataka itd... Pametne kartice dijelimo na memorijske i mikroprocesorske.

Memorijske kartice susrećemo svakodnevno u obliku telefonskih čip kartica, GSM SIM kartica u današnjim mobilnim telefonima ili kartica u raznim MP3 player-ima i digitalnim fotoaparatima.

Pametne kartice s mikroprocesorom su danas vrlo rijetke i skupe, ali s najviše mogućnsti te će biti predmet daljnjeg razmatranja.

Pametne kartice su malo računalo bez ulazno izlaznih naprava. Imaju mikroprocesor, ponekad kriptografski koprocesor, trajnu memoriju (engl. Read Only Memory - ROM), izbrisljivu memoriju (engl.Electronically Erasable Programmable ROM – EEPROM) koja preuzima funkciju tvrdog diska, radnu memoriju (engl. Random Access Memory - RAM) i standardiizirano sučelje za komunikaciju s vanjskim svijetom. Mikroprocesorske pametne kartice se danas najviše koriste u bankarstvu, npr. American Blue kartica (slika 2.4.).



2.2. Kako izgledaju pametne kartice?

Pametne kartice najčešće dolaze u tri formata : ID-0 (85.6mm x 54mm x 0.76mm), ID-00 (66mm x 33mm x 0.76mm ) i ID-000 (25mm x 15 mm x 0.76mm). ID-0 (slika 2.5.) je format kreditnih kartica, a ID-000 je format GSM SIM kartica. Format ID-0 je najčešći te ga osim kod kreditnih kartica (slika 2.4.) susrećemo kod osobnih iskaznica (slika 2.6.).



2.2.1. Kontaktne pametne kartice

Kontaktne pametne kartice komuniciraju s okolinom putem fizičkog komunikacijskog sučelja koje čini 8-pinski metalni kontakt prema ISO 7816-2 standardu (slika 2.2.).


Kontakti


Slika 2.2. Metalni kontakt pametnih kartica


Kontakti i raspored su prikazani na slici 2.3.

Raspored pinova
Slika 2.3. Raspored 8-pinskog kontakta pametnih kartica


Kontakti su sljedeći:



Kontaktne pametne kartice:

American Express "Blue Card"


Prazna pametna kartica


Osobna iskaynica iz Hong-Konga

Slika 2.4.

American Express “Blue Card

Slika 2.5.

Prazna pametna kartica

Slika 2.6.

Osobna iskaznica iz Hong-Konga


Pristup kontaktnim pametnim karticama se ostvaruje uređajem za prihvat kartica (engl. card acceptance device – CAD). Primjer jednog takvog uređaja je čitač pametnih kartica (slika 2.7.).


CAD
Slika 2.7. Čitač pametnih kartica



2.2.2. Bezkontaktne pametne kartice

Bezkontaktne pametne kartice nemaju kontakt već imaju skrivenu antenu pomoću koje komuniciraju s okolinom (slika 2.8.). Napajanje je ostvareno pomoću baterije ugrađene u karticu ili se elektromagnetskom indukcijom u anteni inducira sav napon potreban za njezin rad. Podaci se do CAD uređaja prenose elektromagnetskim valovima.

Bezkontaktne pametne kartice su osjetljivije na torzije od kontaktnih. Također postoji potencijalna opasnost da se bez znanja vlasnika presretnu podaci ili izvedu neke kartične transakcije.


Bezkontaktna pametna kartica
Slika 2.8. Troslojna građa bezkontaktne pametne kartice



2.3. Sigurnost pametnih kartica

2.3.1. Sigurnosna svojstva sklopovlja pametnih kartica

Sklopovi pametnih kartica se nikad ne proizvode od standardnih ćelija i često posjeduju lažne strukture čija je jedina svrha zbunjivanje potencijalnog napadača. Sabirnice unutar pametne kartice koje povezuju procesor, ROM, EEPROM i RAM su interne sabirnice, što znači da nikad ne izlaze iz čipa. Time je onemogućeno direktno priključivanje na linije sabirnice. Kako bi se spriječilo bezkontaktno prisluškivanje ili interakcija s podacima na sabirnici, promet preko sabirnica često se kriptira, a sabirničke linije su isprepletene.

Kako se sadržaj ROM-a može čitati bit po bit uz pomoć optičkog mikroskopa, u pametnim karticama se koristi specijalni ionski usađeni ROM čiji se sadržaj ne može pročitati niti uz pomoć ultraljubičaste svjetlosti.

Informacije sakupljene analizom električnog potencijala aktivnog čipa moguće je iskoristiti u svrhu izvođenja zaključaka o trenutnom sadržaju RAM-a. Iznad memorisjkih ćelija smješteni su vodljivi metalnih slojevi. Ako se ti slojevi uklone (npr. kemijskim urezivanjem), čip postaje neupotrebljiv. Osim toga prati se njihov električni otpor tako da čip automatski prestaje s radom ako dođe do oštećenja zaštitnog sloja. Ispod zaštitnih slojeva nalaze se i fototranzistori koji dodatno detektiraju njihovo uklanjanje.

Postoji mogućnost čitanja RAM ćelija bez napajanja, ali to zahtjeva prethodno hlađenje ćelija na temperaturu ispod –60°C. Zbog hlađenja sadržaj RAM ćelija ostaje trajan. Stoga se tajni ključevi ne bi trebali nepotrebno držati u RAM-u. Nakon njihovog pohranjivanja memorija se treba obrisati ili prepisati novim vrijednostima.

U pametnim karticama slijed memorijskih lokacija RAM-a nikada nije linearan kao u ostalim računalnim sustavima. Fizički bliske memorijske ćelije nisu susjedne logičke lokacije. Zbog toga nije dovoljno znati samo sadržaj ćelija već je potrebno znanje i o načinu adresiranja. Način adresiranja može biti unaprijed određen i strogo tajan ili programski riješen i promjenjiv.

Pametne kartice nadziru naponsku razinu kako bi onemogućili DFA (engl. Differential Fault Analysis) napade, frekvenciju radnog takta koja je dovedena izvana kako bi se onemogućilo drastično usporavanje rada kartice čime praćenje internih promijena postaje jednostavnije. Kako bi se onemogućili DPA napadi (engl. Differential Power Analysis) pametne kartice potrošnju električne energije reguliraju i održavaju stalnom.



2.3.2. Sigurna programska svojstva pametnih kartica

S programske strane, pametne kartice također se odlikuju zavidnom razinom sigurnosti. Kao što je opisano u odlomku 2.3.1., vrlo je teško iz pametne kartice “izvući” korisne informacije, što odmah upućuje na mogućnost prisluškivanja informacija koje kartica prima ili odašilje. Dok su gore navedene sklopovske zaštite implementirane u tvornici i ne mogu se isključiti, programska zaštita najviše ovisi o programeru koji implementira kartične aplikacije. Mikroprocesorske pametne kartice dijelimo na one s kripto-koprocesorom i one bez kripto-koprocesora.Kripto-koprocesor je sklopovska podrška kriptiranju. Neke pametne kartice podržavaju samo simetrične kripto-algoritme (najčešće DES), bolje kartice podržavaju još i asimetrične (najčešće RSA), a najbolje još i funkcije za izračunavanje sažetka (engl. Digest ili engl. Hash). Ovisno o vrsti kartice postoji standardizirano programsko sučelje koje omogućuje iskorištavanje implementiranih kripto algoritama. Pametne kartice koje nemaju kripto-koprocesor zahtjevaju od programera, koji želi stvoriti sigurni komunikacijski kanal, samostalno programsko implementiranje potrebnih algoritama ili nabavu nekih drugih implementacija. Radi velike ograničenosti memorijskog prostora na pametnim karticama (tipično 32 KiB ROM-a, 16 KiB EEPROM-a i 1 KiB RAM-a), često se ne implementiraju svi potrebni algoritmi čime se znatno umanjuje sigurnost pametnih kartica. Zbog toga se, za bilo kakvu primjenu u kojoj je potrebna veća razina sigurnosti, pametne kartice bez kripto-koprocesora ne upotrebljavaju.



3. Java pametne kartice


Rastom tržišta pametnih kartica postalo je potrebno “brzo” i “jednostavno”
razvijati kartične aplikacije koje bi trebale biti u “duhu” pametnih kartica – sigurne. Jedna tehnologija se nametala kao vrlo pogodna, Java! Java programi se prevode iz izvornog teksta programa u sklopovski neovisan međukôd, Java Byte kôd. Java Byte kôd se izvodi u virtualnom stogovnom stroju (engl. Java Virtual Machine - JVM). Ideja je bila odrediti podskup jezika Java koji bi se mogao izvoditi na samoj pametnoj kartici. Taj podskup je definiran Java Card platformom.


3.1. Java Card platforma


Java Card platforma sastoji se od tri dijela:

  1. Java Card Virtual Machine (JCVM) - definira podskup programskog jezika Java i definiciju virtualnog stogovnog stroja,

  2. Java Card Runtime Enviroment (JCRE) - opisuje Java Card izvršnu okolinu, upravljanje memorijom, kartičnom aplikacijom (engl. Java Card appletom, negdje Java cardlet - dalje u tekstu applet) i druge izvršne osobine,

  3. Java Card Application Programming Interface (API) - opisuje jezgru i Java pakete (engl. package) i razrede (engl. class) potrebne za programiranje kartičnih aplikacija.

Slika 3.1. prikazuje osnovnu strukturu Java Card platforme.

Osnovna struktura Java Card platforme

Slika 3.1. Osnovna struktura Java Card platforme


3.1.1. Java Card virtualni stogovni stroj


Java Card virtualni stogovni stroj podijeljen je na dva dijela:

JCVM definira podskup Java programskog jezika po broju i složenosti paketa i po broju podržanih primitivnih tipova (engl. value type) podataka. Nepodržane osobine Jave su:



3.1.2. Java Card izvršna okolina


Jedno od najznačajnijih obilježja Java Card izvršne okoline je da omogućuje neovisnost kartične aplikacije od operacijskog sustava pametne kartice. Sve što je bitno programeru kartične aplikacije je da postoji JCRE koji sadrži JCVM koji će izvoditi njegov applet i preko kojega se uz pomoć dobro definiranog programskog sučelja (API) pristupa sredstvima pametne kartice.



3.1.3. Java Card API

Java Card programsko sučelje definira standardizirano sučelje za programiranje appleta. Java Card API inačica 2.1.1 definira pakete navedene u tablici 3.1.


Paketi

Ime paketa

Opis paketa

java.lang

Pruža razrede koji su osnova za dizajn Java Card podskupa Java programskog jezika.

javacard.framework

Pruža osnovni skup razreda i sučelja (engl. interface) potrebnih za izgradnju, komunikaciju i rad s Java Card appletima.

javacard.security

Pruža razrede i sučelja koja sadrže javno dostupnu funkcionalnost potrebnu za implementaciju osnovnog skupa sigurnosnih i kriptografskih alata za Java Card platformu.

javacardx.crypto

Dodatni paket koji sadrži funkcionalnost (koja može biti podložna pravilima izvoza) potrebnu za implementaciju osnovnog skupa sigurnosnih i kriptografskih alata za Java Card platformu.

Tablica 3.1. Java Card 2.1.1 API paketi


Kako je ovdje predmet razmatranja sigurnost i sigurnosni mehanizmi u daljem tekstu biti će opisani paketi javacard.security ijavacardx.crypto. Treba naglasiti da se u sljedećim poglavljima nalazi samo opis mogućnosti određen Java Card specifikacijom i da stvarna Java pametna kartica ne mora nužno implementirati sve ove mogućnosti.


3.1.3.1. Paket javacard.security


Sadrži razrede, sučelja i iznimke koje sadrže javno dostupnu funkcionalnost potrebnu za implementaciju osnovnog skupa sigurnosnih i kriptografskih alata za Java Card platformu. Razredi u paketu javacard.security pružaju definiciju algoritama koji obavljaju sigurnosne i kriptografske funkcije kao što su:

Paketjavacard.securitysadrži sučelja, razrede i iznimke opisane u tablicama 3.2,3.3 i 3.4.



Sučelja

Ime sučelja

Opis sučelja

DESKey

Sadrži 8/16/24 oktetne ključeve za DES i Triple DES sa dva i tri ključa.

DSAKey

Osnovno sučelje za implementaciju privatnih i javnih DSA ključeva.

DSAPrivateKey

DSA privatni ključ.

DSAPublicKey

DSA javni ključ.

Key

Osnovno sučelje za sve ključeve.

PrivateKey

Osnovno sučelje za privatne ključeve.

PublicKey

Osnovno sučelje za javne ključeve.

RSAPrivateCrtKey

RSA privatni ključ koji koristi kineski teorem o ostacima.

RSAPrivateKey

RSA privatni ključ.

RSAPublicKey

RSA javni ključ.

SecretKey

Osnovno sučelje za sve ključeve korištene u simetričnim algoritmima.

Tablica 3.2. Sučelja javacard.security paketa


Razredi

Ime razreda

Opis razreda

KeyBuilder

Razred za stvaranje neinicijaliziranih ključeva.

KeyPair

Razred za generiranje parova asimetričnih ključeva.

MessageDigest

Osnovni apstraktni razred (engl. abstract class) za generiranje kriptografskih sažetaka.

RandomData

Osnovni apstraktni razred za generiranje pseudo slučajnih brojeva.

Signature

Osnovni apstraktni razred za generiranje digitalnih potpisa.

Tablica 3.3. Razredi javacard.security paketa


Iznimke

Ime iznimke

Opis iznimke

CryptoException

Predstavlja iznimku koja je nastala tijekom obavljanja kriptografskih funkcija.

Tablica 3.4. Iznimke javacard.security paketa



3.1.3.2. Paket javacardx.crypo


Paket koji sadrži funkcionalnost, koja može biti podložna pravilima izvoza, potrebnu za implementaciju osnovnog skupa sigurnosnih i kriptografskih alata za Java Card platformu. Razredi koji sadrže sigurnosnu i kriptografsku funkcionalnost, a nisu podložni pravilima izvoza nalaze se u paketu javacard.security. Paket javacardx.crypto sadrži razred Cipher i sučelje KeyEncryption.



Sučelja

Ime sučelja

Opis sučelja

KeyEncryption

Sučelje KeyEncryption definira metode koje se koriste pri rukovanju kriptiranim ključevima.

Tablica 3.5. Sučelja javacardx.crypto paketa


Razredi

Ime razreda

Opis razreda

Cipher

Razred Cipher je osnovni apstraktni razred za sve kriptografske algoritme. Njega implementira proizvođač pametne kartice ili neka treća stranka.

Tablica 3.6. Razredijavacardx.crypto paketa

Razred Cipher pruža metode za kriptiranje i dekriptiranje poruka pomoću niza algoritama u raznim načinima rada sa više načina nadopune.



4. Java platforma


Java platforma sadrži mnoge pakete koji omogućuju sigurnu komunikaciju. Osnovna podjela sigurnosnih mehanizama Java platforme od inačice 1.4.1 je:

  1. Osnovna sigurnost (engl. General Security),

  2. Certifikacijski putevi (engl. Certification Path),

  3. JavaTM Secure Socket Extension (JSSE),

  4. JavaTM Authentication and Authorization Service (JAAS),

  5. JavaTM Generic Security Services (JGSS),

  6. JavaTM Cryptography Extension (JCE).


4.1. Osnovna sigurnost


Osnovnu sigurnost čine sljedeći paketi:



4.1.1. Paket java.security


Paket java.security pruža osnovni skup razreda i sučelja potreban za implementaciju sigurnosti.

Uključuje:

Veliki broj razreda (pogotovo onih kriptografskih i za generiranje pseudo slučajnih brojeva) predstavljaju samo programsko sučelje bez stvarne implementacije pojedinih algoritama. Implementacija se ostavlja nekoj trećoj stranki. Zbog toga se razredima koji koriste određene algoritme predaju imena tih algoritama kao znakovne konstante. Java 2 SDK Security API zahtjeva i koristi skup standardnih imena za algoritme, digitalne certifikate i repozitorije ključeva i digitalnih certifikata, ali to ne sprečava neku treću stranku da implementira neki novi algoritam i definira vlastito ime za njega. Na taj naćin omogućena je jednostavna nadogradnja sigurnosnih mehanizama Java platforme.

Java 2 SDK Security API definira sljedeći skup imena:


Tablice4.1, 4.2, 4.3 prikazuju neka zanimljivija sučelja, razrede i iznimke paketa java.security.


Sučelja

Ime sučelja

Opis sučelja

Key

Osnovno sučelje koje predstavlja ključ i definira zajedničku funkcionalnost svih vrsta ključeva.

PrivateKey

Osnovno sučelje koje predstavlja privatni ključ korišten u asimetričnoj kriptografiji.

PublicKey

Osnovno sučelje koje predstavlja javni ključ korišten u asimetričnoj kriptografiji.

Tablica 4.1. Zanimljivija sučelja java.security paketa


Razredi

Ime razreda

Opis razreda

KeyFactory

Razred koji omogućuje stvaranje ključeva iz dane reprezentacije ključa ili stvaranje određene reprezentacije ključa iz stvarnog objekta.

KeyPair

Ovaj razred predstavlja spremnik javnog i privatnog ključa bez ikakve implementacije sigurnosti.

KeyPairGenerator

Razred koji omogućuje generiranje para asimetričnih ključeva.

KeyStore

Ovaj razred predstavlja zbirku ključeva i digitalnih certifikata u memoriji računala.

MessageDigest

Razred koji omogućuje generiranje kriptografskih sažetka, kao što su MD5 i SHA.

SecureRandom

Ovaj razred pruža mogućnost generiranja kriptografski-sigurnih pseudo slučajnih brojeva.

Signature

Razred koji omogućuje generiranje digitalnih potpisa.

Tablica 4.2. Zanimljiviji razredi java.security paketa


Iznimke

Ime iznimke

Opis iznimke

DigestException

Osnovna iznimka koja nastaje u slučaju pogreške prilikom generiranja kriptografskih sažetka.

GeneralSecurityException

Osnovna iznimka za sve sigurnosne probleme.

InvalidAlgorithmParameterException

Iznimka koje ukazuje na neispravne ili neadekvatne parametre algoritama.

InvalidKeyException

Iznimka koje ukazuje na neispravni ključ (krivi zapisni format, kriva duljina, neinicijaliziranost,...)

KeyException

Osnovna iznimka vezana uz ključeve.

KeyStoreException

Osnovna iznimka vezana uz repozitorij ključeva.

NoSuchAlgorithmException

Iznimka koja ukazuje da dotični algoritam nije dostupan.

NoSuchProviderException

Iznimka koja ukazuje da dotični davatelj Java kriptografskih proširenja nije dostupan.

SignatureException

Osnovna iznimka vezana uz digitalno potpisivanje.

Tablica 4.3. Zanimljivije iznimke java.security paketa


4.1.2. Paket java.security.cert


Pruža razrede i sučelja potrebne za parsiranje i korištenje digitalnih certifikata (engl. digital certificate), lista opozvanih certifikata (engl. certificate revocation lists – CRL), certifikacijskih puteva (engl. certificate path, certificate chain) te repozitorija digitalnih certifikata i CRL-ova. Sadrži podršku za treću inačicu X.509 digitalnih certifikata i drugu inačicu X.509 CRL-a. Java 2 SDK Security API ne podržava generiranje digitalnih certifikata već samo čitanje i spremanje već generiranih. Uz standardnu instalaciju Java 2 (RE,SDK, JDK,...) dobije se i konzolni program keytool koji omogućuje stvaranje samo-potpisanih digitalnih certifikata (digitalni certifikat koji sadrži korisnikov javni ključ potpisan sa korisnikovim privatnim ključem), njihovo spremanje u datoteku koja predstavlja repozitorij digitalnih certifikata (KeyStore), generiranje zahtjeva za potpisivanje digitalnog certifikata (engl. Certificate Signing Request – CSR), te uvoz digitalnog certifikata od nekog certifikacijskog centra (engl. Certificate Authority - CA). Java 2 SDK Security API ima ugrađenu podršku za dvije vrste repozitorija digitalnih certifikata i CRL-ova: “LDAP” i “Collection”.

Tablice 4.4, 4.5,4.6 prikazuju neka zanimljivija sučelja, razrede i iznimke paketa java.security.cert.


Sučelja

Ime sučelja

Opis sučelja

CertSelector

Predstavlja skup zahtjeva prema kojima se odabiru digitalni certifikati. Razredi koji implementiraju ovo sučelje često se koriste prilikom dohvaćanja digitalnih certifikata iz repozitorija digitalnih certifikata (CertStore).

CertStoreParameters

Predstavlja osnovno sučelje za definiranje parametara pomoću kojih se stvaraju repozitoriji digitalnih certifikata.

CRLSelector

Predstavlja skup zahtjeva prema kojima se odabiru CRL-ovi. Razredi koji implementiraju ovosučelje često se koriste prilikom dohvaćanja CRL-ova iz repozitorija digitalnih certifikata (CertStore).

X509Extension

Predstavlja definiciju X.509 dodatka za treću inačicu X.509 digitalnog certifikata i drugu inačicu CRL-a.

Tablica 4.4. Zanimljivija sučelja java.security.cert paketa


Razredi

Ime razreda

Opis razreda

Certificate

Apstraktni razred koji predstavlja digitalni certifikat.

Certificate.CertificateRep

Alternativni razred za opis digitalnog certifikata pogodan za serijalizaciju.

CertificateFactory

Razred koji omogućuje stvaranje digitalnog certifikata na temelju nekog zapisnog formata, certifikacijskog puta i CRL-a.

CertStore

Repozitorij digitalnih certifikata i CRL-ova.

CollectionCertStoreParameters

Predstavlja parametre za Collection tip repozitorija digitalnih certifikata i CRL-ova.

CRL

Apstraktni razred koji predstavlja listu opozvanih digitalnih certifikata.

LDAPCertStoreParameters

Predstavlja parametre za LDAP tip repozitorija digitalnih certifikata i CRL-ova.

X509Certificate

Apstraktni razred koji predstavlja X.509 digitalni certifikat.

X509CertSelector

Predstavlja skup zahtjeva prema kojima se odabiru X.509 digitalni certifikati.

X509CRL

Apstraktni razred koji predstavlja X.509 CRL.

X509CRLEntry

Apstraktni razred koji predstavlja opozvane X.509 digitalne certifikate.

X509CRLSelector

Predstavlja skup zahtjeva prema kojima se odabiru X.509 CRL-ovi.

Tablica 4.5. Zanimljiviji razredi java.security.cert paketa


Iznimke

Ime iznimke

Opis iznimke

CertificateEncodingException

Iznimka koja ukazuje da digitalni certifikat nije u ispravnom zapisnom formatu.

CertificateException

Općenita iznimka vezana uz digitalne certifikate.

CertificateExpiredException

Iznimka koja ukazuje da je digitalnom certifikatu istekao period valjanosti.

CertificateNotYetValidException

Iznimka koja ukazuje da digitalni certifikat još nije postao valjan.

CertificateParsingException

Iznimka koja ukazuje da digitalni certifikat nije u valjanom DER zapisnom formatu ili sadrži ne podržane DER atribute.

CertStoreException

Općenita iznimka vezana uz repozitorij digitalnih certifikata.

CRLException

Općenita iznimka vezana uz CRL.

Tablica 4.6. Zanimljivije iznimke java.security.cert paketa



4.1.3. Paket java.security.interfaces



Pruža sučelja za generiranje RSA (engl. Rivest, Shamir i Adleman) ključeva definiranih prema PKCS#1 i DSA (engl. Digital Signature Algorithm) ključeva prema FIPS-186 (engl. Federal Information Processing Standards).



4.1.4. Paket java.security.spec


Pruža razrede i sučelja za specifikaciju ključeva i parametara raznih algoritama. Specifikacija ključeva je transparentna reprezentacija materijala koji predstavlja ključ. Ključ može biti specificiran ovisno o algoritmu ili neovisno o algoritmu u nekom zapisnom formatu npr. ASN.1 (engl. Abstract Syntax Notation One). Ovaj paket sadrži specifikacije DSA i RSA javnih i privatnih ključeva, PKCS#8 privatnih ključeva u DER (engl. Distinguished Encoding Rules) zapisnom formatu i X.509 javne i privatne ključeve u DER zapisnom formatu. Specifikacija parametara algoritama je transparentna reprezentacija skupa parametara korištenih u nekom algoritmu. Ovaj paket sadrži specifikaciju parametara DSA algoritama.



4.1.5. Davatelji kriptografskih usluga


Prema Java kriptografskoj arhitekturi (
engl. Java Cryptography Architecture - JCA) postoji samo niz apstraktnih razreda i sučelja koji omogućuju rad s kriptografskim algoritmima, ali ne pružaju samu implementaciju. Implementacija kriptografskih algoritama prepuštena je drugim tzv. “davateljima kriptografskih usluga” (engl. JavaTM Cryptographic Service Provider). Termin “Cryptographic Service Provider” ili samo “provider” koristi se i kao ime niza paketa koji implementiraju te mehanizme.

Postoje mnogi davatelji. Između ostalog i sama tvrtka Sun. Sun s Javom daje svog davatelja – SUN. SUN je besplatan i dolazi inicijalno s Javom 2 SDK inačica 1.4, ali podržava relativno malo sigurnosnih mehanizama. SUN podržava sljedeće mehanizme i algoritme sa sljedećim ograničenjima:

Kako bi se određeni davatelj mogao koristiti mora se instalirati i registrirati.



4.1.6. Instalacija i registracija Java davatelja


Instalacija se obavlja ili presnimavanjem JAR (engl. Java Archive) datoteke koja sadrži “davateljau <JavaRE-home>\lib\ext direktorij ili stavljanjem dotične datoteke u putanju razreda (engl. class path). Registracija može biti statička ili dinamička. Statička registracija se obavlja izmjenom <JavaRE-home>/lib/security/java.security datoteke tako da se doda jedna security.provider.n=imeGlavnogRazredaDavatelja linija za novog davatelja, gdje je broj n broj za jedan veći od broja u zadnjoj takvoj liniji (n ujedno označava prioritet prilikom pretraživanja, manji broj znači veći prioritet). Dinamička registracija se obavlja iz samog Java programa pomoću metoda addProviderili insertProviderAt razreda Security. Ova vrsta registracije nije trajna i može biti obavljena samo iz Java programa kojem je eksplicitno dopušteno direktivom :

java.security.SecurityPermission "insertProvider.{ime}",

gdje je {ime} ime stvarnog davatelja. Na primjer ako se davatelj zove “MojNajdražiDavatelj” i ako se izvorni tekst programa koji dinamički registrira ovog davatelja nalazi u MojApp.jar datoteci u direktoriju /lokalniPosao, onda se u datoteci
<JavaRE-home>/lib/security/java.policy treba nalaziti sljedeća naredba eksplicitne dozvole dinamičke registracije :


grant codeBase "file:/lokalniPosao/MojApp.jar" {
permission java.security.SecurityPermission
"insertProvider.MojNajdražiDavatelj";
};


Jednom instaliran i registriran davatelj se može eksplicitno koristiti tako da se pri pozivu metoda
getInstance (metode koje obavljaju funkcije konstruktora), razreda za generiranje ključeva, kriptografskih sažetaka, digitalnih potpisa, metoda za kriptiranje/dekriptiranje, itd..., navede točno koji davatelj se želi koristiti. Ukoliko se ne navede Java RE koristi davatelja sa najvećim prioritetom (najmanji n) ukoliko on podržava traženi mehanizam. Ukoliko traženi mehanizam nije podržan sa davateljem koji ima najveći prioritet onda se pretražuju ostali registrirani poslužitelji sve dok se na pronađe adekvatni. Ako adekvatni davatelj nije po nađen baca se iznimka java.security.NoSuchAlgorithmException. Svaki Java program može koristiti proizvoljan broj davatelja bez ograničenja, eksplicitnim navođenjem davatelja ili automatskim pronalaženjem odgovarajućega.



4.2. Certifikacijski putevi


Sučelja, razredi i iznimke za rad sa certifikacijskim putevima su prikazani u tablicama 4.7, 4.8, 4.9.


Sučelja

Ime sučelja

Opis sučelja

CertPathBuilderResult

Predstavlja specifikaciju rezultata stvaranja certifikacijskog puta.

CertPathParameters

Predstavlja specifikaciju parametara algoritmu za stvaranje certifikacijskog puta.

CertPathValidatorResult

Predstavlja specifikaciju rezultata provjere certifikacijskog puta.

PolicyNode

Predstavlja nepromjenjiv (engl. immutable) valjani čvor stabla u politici PKIX algoritma za provjeru certifikacijskih puteva.

Tablica 4.7. Sučelja za rad sa certifikacijskim putevima


Razredi

Ime razreda

Opis razreda

CertPath

Nepromjenjiv niz digitalnih certifikata (certifikacijski put).

CertPath.CertPathRep

Alternativni razred za opis certifikacijskog puta pogodan za serijalizaciju.

CertPathBuilder

Razred za izgradnju certifikacijskih puteva.

CertPathBuilderSpi

SPI (eng. Service Provider Interface) za razred CertPathBuilder.

CertPathValidator

Razred za provjeru certifikacijskog puta.

CertPathValidatorSpi

SPI za razred CertPathValidator.

PKIXBuilderParameters

Parametri korišteni u PKIX algoritmu izgradnje certifikacijskog puta.

PKIXCertPathBuilderResult

Ovaj razred predstavlja uspješan rezultat PKIX algoritma izgradnje certifikacijskog puta.

PKIXCertPathChecker

Apstraktni razred koji provodi jednu ili više provjera X509 digitalnog certifikata.

PKIXCertPathValidatorResult

Ovaj razred predstavlja uspješan rezultat PKIX algoritma provjere certifikacijskog puta.

PKIXParameters

Parametri korišteni u PKIX algoritmu provjere certifikacijskog puta.

Tablica 4.8. Razredi za rad sa certifikacijskim putevima


Iznimke

Ime iznimke

Opis iznimke

CertPathBuilderException

Iznimka koja ukazuje na jedan od mogućih problema nastalih prilikom izgradnje certifikacijskog puta.

CertPathValidatorException

Iznimka koja ukazuje na jedan od mogućih problema nastalih prilikom provjere certifikacijskog puta.

Tablica 4.9. Iznimke za rad sa certifikacijskim putevima

Certifikacijski putevi nisu korišteni u implementaciji sigurnosnih mehanizama napredne zdravstvene iskaznice (pametna zdravstvena iskaznica, dalje u tekstu PZI) zato što je hijerarhija certifikata iznimno plitka (2 razine).


4.3. JavaTM Secure Socket Extension


JavaTM Secure Socket Extension predstavlja implementaciju SSL (engl. Secure Sockets Layer) i TLS (engl. Transport Layer Security) protokola čime omogućuje sigurnu Internet komunikaciju. Omogućuje kriptiranje podataka, autentifikaciju poslužitelja, očuvanje i provjeru integriteta poruka i neobveznu autentifikaciju klijenta. Koristeći JSSE programer može pružiti sigurnu komunikaciju, povrh TCP protokola, između klijenta i poslužitelja neovisno o aplikacijskom protokolu (HTTP, Telnet, FTP,...) koji se koristi. JSSE je postao sastavni dio JavaTM 2 SDK Standard Edition platforme od inačice 1.4.

JSSE implementacija koja dolazi s JavaTM 2 SDK Standard Edition 1.4 platformom pruža “jaku” kriptografiju, ali zbog izvoznih pravila SAD-a (Sjedinjene Američke Države) ne dopušta zamjenu sa alternativnim SSL/TLS implementacijama.

JSSE nije korišten u implementaciji sigurnosnih mehanizama PZI.


4.4. JavaTM Authentication and Authorization Service



JAAS se može koristiti za potrebe autentifikacije korisnika tj. pouzdano i sigurno određivanje tko trenutno izvodi Java kôd i za autoriziranje korisnika tj. provjeravanje da li korisnik ima potrebne dozvole za obavljanje određene operacije.

JASS nije korišten u implementaciji sigurnosnih mehanizama PZI.


4.5. JavaTM Generic Security Service



Java GSS-API se koristi za sigurnu razmjenu poruka među aplikacijama. GSS-API omogućuje aplikacijskom programeru jedinstven pristup sigurnosnim uslugama povrh čitavog niza sigurnosnih mehanizama uključujući i Kerberos.

GSS nije korišten u implementaciji sigurnosnih mehanizama PZI.



4.6. JavaTM Cryptography Extension



JCE pruža mogućnosti kriptiranja podataka, generiranje simetričnih kriptografskih ključeva, sjedničke razmjene ključeva te generiranje MAC-ova (engl. Message Authentication Code). Podrška za kriptiranje podataka uključuje simetričnu i asimetričnu kriptografiju, blokovsko orijentirano kriptiranje i kriptiranje toka podataka (oktetno orijentirano).

JCE se sastoji od tri paketa:


4.6.1. Paket javax.crypto

Pruža razrede i sučelja potrebne za kriptografske operacije kao što su kriptiranje, generiranje simetričnih ključeva, sjedničke razmjene ključeva, te generiranje MAC-ova. Podrška za kriptiranje podataka uključuje simetričnu i asimetričnu kriptografiju, blokovsko orijentirano kriptiranje i kriptiranje toka podataka (oktetno orijentirano). Ovaj paket omogućuje korištenje sigurnih tokova podataka i zapečaćenih objekata. Zanimljivija sučelja, razredi i iznimke prikazani su tablicama 4.10,4,11 i 4.12.



Sučelja

Ime sučelja

Opis sučelja

SecretKey

Osnovno sučelje za simetrične kriptografske ključeve.

Tablica 4.10. Sučelja paketa javax.crypto


Razredi

Ime razreda

Opis razreda

Cipher

Razred koji pruža mogućnosti kriptiranja i dekriptiranja podataka i predstavlja jezgru JCE okvira (engl. framework).

CipherInputStream

Ovaj razred koristi primjerak (engl. instance) razreda InputStream i Cipher tako da njegova metoda read(), prije nego što vrati pročitane podatke sa ulaznog toka, predprocesira podatke pomoću Cipher objekta.

CipherOutputStream

Ovaj razred koristi primjerak razreda OutputStream i Cipher tako da njegova metoda write(), prije nego što zapiše primljene podatke na izlazni tok, predprocesira podatke pomoću Cipher objekta.

KeyAgreement

Razred koji pruža mogućnost razmjene (dogovora) ključeva. Ključevi koji se koriste pri uspostavljanju dijeljene tajne (engl. shared secret ) se stvaraju pomoću razreda java.security.KeyPairGenerator ili javax.crypto.KeyGenerator.

KeyGenerator

Razred koji pruža mogućnost generiranja simetričnih kriptografskih ključeva.

Mac

Razred koji pruža mogućnost generiranja MAC-ova.

SealedObject

Razred koji pruža mogućnost kriptografske zaštite objekata.

SecretKeyFactory

Razred koji omogućuje stvaranje simetričnih ključeva iz dane reprezentacije ključa ili stvaranje određene reprezentacije ključa iz stvarnog objekta.

Tablica 4.11. Zanimljiviji razredi paketa javax.crypto


Iznimke

Ime iznimke

Opis iznimke

BadPaddingException

Iznimka koja ukazuje da dotični ulazni podaci nisu nadopunjeni na očekivani način.

IllegalBlockSizeException

Iznimka koja ukazuje da dotični ulazni podaci uz blokovsko orijentirani kriptografski algoritam nisu veličine koja je višekratnik veličine osnovnog bloka.

NoSuchPaddingException

Iznimka koja ukazuje da zahtjevani mehanizam nadopune podataka nije raspoloživ.

Tablica 4.12. Zanimljivije iznimke paketa javax.crypto



Razredi predstavljaju samo programsko sučelje bez stvarne implementacije pojedinih algoritama. Implementacija se ostavlja nekoj trećoj stranki. Zbog toga se razredima koji koriste određene algoritme predaju imena tih algoritama kao znakovne konstante. Java 2 SDK Security API zahtjeva i koristi skup standardnih imena za algoritme, načine kriptiranja, mehanizme nadopune, protokole razmjene ključeva, generiranje ključeva i MAC-ova, ali to ne sprečava neku treću stranku da implementira neki novi algoritam i definira vlastito ime za njega. Na taj način omogućena je jednostavna nadogradnja sigurnosnih mehanizama Java platforme. Java 2 SDK Security API definira sljedeći skup imena:



4.6.2. Paket javax.crypto.interfaces


Pruža sučelja za Diffie-Hellman ključeve definirane sa PKCS#3.



4.6.3. Paket javax.crypto.spec


Pruža razrede i sučelja za specifikaciju ključeva i parametara raznih algoritama. Specifikacija ključeva je transparentna reprezentacija materijala koji predstavlja ključ. Ključ može biti specificiran ovisno o algortimu ili neovisno o algoritmu u nekom zapisnom formatu npr. ASN.1. Ovaj paket sadrži specifikacije Diffie-Hellman javnih i privatnih ključeva, DES, Triple DES i PBE tajnih ključeva (kriptiranje zasnovano na zaporci, engl. Password-Based Encryption). Specifikacija parametara algoritama je transparentna reprezentacija skupa parametara korištenih u nekom algoritmu. Ovaj paket sadrži specifikaciju parametara Diffie-Hellman, DES, Triple DES, PBE, RC2 i RC5 algoritama.



4.6.4. Davatelji Java kriptografskih proširenja



JCE je podložan izvoznim pravilima SAD-a. U Javi 1.4 postoji “jaka”, ali ograničena kriptografska podrška koja, za razliku od prošlih verzija Jave, ima dinamičku politiku. Dinamička politika znači da više nema nekoliko izdanja Jave ovisno o mjestu prebivališta već jedna jedinstvena, koja ovisno o “java.policy” datoteci, pruža više ili manje kriptografskih algoritama. Kako bi se mogli koristiti svi kriptografski algoritmi koji su navedeni u Java specifikaciji (vidi [3]), potrebno je s http://java.sun.com/products/jce/index-14.html skinuti “policy” datoteke s neograničenom jačinom (engl. unlimited strength).

Prema Java specifikaciji postoji samo niz apstraktnih razreda i sučelja koji omogućuju rad s kriptografskim algoritmima, ali ne i sama implementacija. Implementacija kriptografskih algoritama prepuštena je drugim tzv. “davateljima Java kriptografskih proširenja” (engl. JavaTM Cryptography Extension Provider – JCE Provider). Termin “JCE Provider” koristi se i kao ime niza paketa koji implementiraju JCE.

Postoje mnogi davatelji JCE-a. Između ostalog i sama tvrtka Sun. Sun s Javom daje svoj JCE Provider – SunJCE. SunJCE je besplatan i dolazi inicijalno s Java 2 SDK 1.4 platformom, ali podržava relativno malo kripto algoritama sa ograničenim veličinama ključeva. SunJCE podržava sljedeće algoritme sa sljedećim ograničenjima:

Primjer jednog besplatnog, ali vrlo moćnog, davatelji JCE-a je “The Legion Of The Bouncy Castle” (http://www.bouncycastle.org).

Kako bi se određeni davatelj JCE-a mogao koristiti mora se instalirati i registrirati (vidi poglavlje 4.1.3 Instalacija i registracija Java davatelja).       


5. Sigurnosni mehanizmi pametne zdravstvene iskaznice


Za potrebe sigurne komunikacije između terminala pametne zdravstvene iskaznice (dalje u tekstu T-PZI) i kartične aplikacije (Java Card applet) pametne zdravstvene iskaznice (dalje u tekstu A-PZI) ostvareni je niz razreda i sučelja prikazanih bijelom bojom na UML razrednom dijagramu (engl. UML class diagram) sustava pametne zdravstvene iskaznice (slika 5.1).



UML PZI

Slika 5.1. UML razredni dijagram sustava pametne zdravstvene iskaznice


Sigurnosni mehanizmi PZI su podijeljeni u dva Java paketa:



5.1. Paket pametnaZdravstvenaIskaznica


Paket pametnaZdravstvenaIskaznica sadrži jedno sučelje SuceljeSigurnosti i jedan razred UslugaSigurnosti koji ostvaruju sigurnost.



5.1.1. Sučelje SuceljeSigurnosti


SučeljeSuceljeSigurnosti predstavlja zajedničko sučelje za terminal i applet i definira bitne konstante za rad sigurnosnih mehanizama, kao što su:



5.1.2. Razred UslugaSigurnosti


Razred UslugaSigurnosti implementira sučelje SuceljeSigurnosti i sve sigurnosne mehanizme A-PZI. Razred pruža:

Tablice5.1, 5.2 i 5.3 ukratko opisuju ne privatne članove razreda.


Varijable i konstante

Tip

Ime i opis

static byte[]

APP_PROVIDER_PIN

Inicijalni PIN izdavača kartične aplikacije.

static byte[]

CARD_ISSUER_PIN

Inicijalni PIN izdavača kartice.

static byte[]

CARDHOLDER_PIN

Inicijalni PIN korisnika kartice.

static short

PRINCIPAL_APP_PROVIDER

Ovo svojstvo sigurnosti označava autentifikaciju identifikatorom izdavača kartične aplikacije.

static short

PRINCIPAL_CARD_ISSUER

Ovo svojstvo sigurnosti označava autentifikaciju identifikatorom izdavača kartice.

static short

PRINCIPAL_CARDHOLDER

Ovo svojstvo sigurnosti označava autentifikaciju identifikatorom korisnika kartice.

static byte

PROPERTY_INPUT_CONFIDENTIALITY

Ovo svojstvo sigurnosti označava tajnost dolazne poruke ostvareno kriptiranjem.

static byte

PROPERTY_INPUT_INTEGRITY

Ovo svojstvo sigurnosti označava integritet dolazne poruke ostvaren digitalnim potpisom i zaštitnom sumom.

static byte

PROPERTY_OUTPUT_CONFIDENTIALITY

Ovo svojstvo sigurnosti označava tajnost odlazne poruke ostvareno kriptiranjem.

static byte

PROPERTY_OUTPUT_INTEGRITY

Ovo svojstvo sigurnosti označava integritet odlazne poruke ostvaren digitalnim potpisom i zaštitnom sumom.

Tablica 5.1. Varijable i konstante razreda UslugaSigurnosti


Konstruktori

Prototip

Prototip i opis

UslugaSigurnosti()

Podrazumjevani konstruktor koji inicijalizira sve sigurnosne mehanizme i postavlja identifikator korisnika kartice na unaprijed određenu vrijednost PIN-a određenu sa CARDHOLDER_PIN.

UslugaSigurnosti
(byte[] PIN, short offset, byte duljina)

Konstruktor koji inicijalizira sve sigurnosne mehanizme i postavlja identifikator korisnika kartice na vrijednost iz niza PIN od pozicije offset u duljini duljina.

Tablica 5.2. Konstruktori razreda UslugaSigurnosti


Metode

Povratna vrijednost

Opis

void

Autoriziraj(short razinaOvlastenja)

Metoda koja provjerava da li je uspostavljen sigurni komunikacijski kanal, da li su primljeni podaci konzistentni, te da li je naredba ovlaštena.

protected void

dekriptirajAPDU(byte[] buffer)

Metoda koja dekriptira APDU naredbu.

protected void

init(byte[] buffer)

Metoda koja inicijalizira sve potrebne ključeve (javni i privatni ključ kartice, javni ključ izdavača kartice) i identifikator kartice (serijski broj digitalnog certifikata).

boolean

isAuthenticated(short razina)

Metoda koja provjerava da li je tražena razina ovlaštenja autorizirana PIN-om.

boolean

isChannelSecure(byte trazenaSvojstva)

Metoda koja provjerava da li postoji sigurni kanal izmedu kartice i terminala.

boolean

isCommandSecure(byte trazenaSvojstva)

Metoda koja provjerava da li su primljeni podaci konzistentni.

protected void

kriptirajAPDU(byte[] buffer)

Metoda koja kriptira APDU naredbu.

protected void

ostvariSigurniKanal(byte[] buffer)

Metoda "rukovanja" koja izmjenjuje ključeve i stvara sigurni komunikacijski kanal.

void

postprocesirajAPDU(byte[] buffer)

Metoda koja postprocesira APDU naredbu - kriptira, stavlja zaštitnu sumu i generira digitalni potpis.

protected void

potpisiAPDU(byte[]buffer)

Metoda koja digitalno potpisuje ADPU naredbu.

protected void

potpisiPodatke(byte[] buffer)

Metoda koja digitalno potpisuje podatke.

boolean

predprocesirajAPDU(byte[] buffer)

Metoda koja predprocesira APDU naredbu - dekriptira, miče zaštitnu sumu i provjerava digitalni potpis.

boolean

procesirajAPDU(byte[] buffer)

Metoda koja procesira APDU naredbu. Podržava sljedeće funkcije:

inicijalizacija sigurnosnih mehanizama kartice,
provjera PIN-a, promjena PIN-a,
uspostava sigurnog komunikacijskog kanala,
potpisivanje podataka.

protected void

promijeniPIN(byte[] buffer)

Metoda koja mijenja PIN.

protected boolean

provjeriMakniChecksum(byte[] buffer)

Metoda koja dekriptira APDU naredbu.

protected void

provjeriPIN(byte[] buffer)

Metoda koja provjerava primljeni PIN.

void

resetiraj(byte[] buffer) 

Metoda koja poništava ostvareni sigurnosni kanal.

protected void

staviChecksum(byte[] buffer)

Metoda koja izračunava zaštitnu sumu i stavlja SW1 i SW2 na kraj APDU naredbe.

Tablica 5.3. Ne privatne metode razreda UslugaSigurnosti



5.1.2.1. Korištenje razreda UslugaSigurnosti


Kako bi se koristio razred UslugaSigurnosti potrebno je jednim od konstruktora stvoriti primjerak razreda. Opisi konstruktora se nalaze u tablici 5.2. Prvi konstruktor (podrazumijevani) jednostavno poziva drugi na način prikazan slikom 5.2.

public UslugaSigurnosti(){
this(CARDHOLDER_PIN, (short) 0, PIN_SIZE);
}

Slika 5.2. Podrazumijevani konstruktor razreda UslugaSigurnosti


Podrazumijevani konstruktor inicijalizira PIN korisnika kartice na unaprijed određenu vrijednost “11223344”.

Konstruktor UslugaSigurnosti(byte[] PIN, short offset, byte duljina) inicijalizira sve sigurnosne mehanizme (PIN, kriptiranje, generiranje kriptografskih sažetaka i stvaranje generatora pseudo slučajnih brojeva) te stvara objekte koji će sadržavati sve potrebne kriptografske ključeve (slika 5.3). PIN-ovi izdavača kartice i izdavača kartične aplikacije se inicijaliziraju redom na unaprijed definirane vrijednosti 87654321 i 12345678. Razred UslugaSigurnosti koristi sljedeće kriptografske algoritme i ključeve:

public UslugaSigurnosti(byte[] PIN, short offset,byte duljina) {
//stvori nove PIN-ove
cardholderPIN = new OwnerPIN( (byte) 2, PIN_SIZE);
cardIssuerPIN = new OwnerPIN( (byte) 2, PIN_SIZE);
appProviderPIN = new OwnerPIN( (byte) 2, PIN_SIZE);
//inicijaliziraj PIN-ove
cardholderPIN.update ( PIN , offset , duljina);
cardIssuerPIN.update (CARD_ISSUER_PIN,(short)0,PIN_SIZE);
appProviderPIN.update(APP_PROVIDER_PIN,(short)0,PIN_SIZE);
//stvaranje kriptatora
kriptator_sim = Cipher.getInstance (Cipher.ALG_DES_ECB_ISO9797_M2,false);
kriptator_asim = Cipher.getInstance (Cipher.ALG_RSA_PKCS1,false);
//stvaranje generatora kriptografskog sažetka
sazetak = MessageDigest.getInstance(MessageDigest.ALG_SHA,false);
//stvaranje držača tajnog sjedničkog ključa
sjednickiKljuc = (DESKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_DES_TRANSIENT_DESELECT,
KeyBuilder.LENGTH_DES3_2KEY,
true);
//stvaranje držač javnog i privatnog ključa kartice
KdKe_kartice = new KeyPair(KeyPair.ALG_RSA, KeyBuilder.LENGTH_RSA_1024);
//stvaranje držača javnog ključa izdavača kartice
Ke_izdavac = (PublicKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_RSA_PUBLIC,
KeyBuilder.LENGTH_RSA_1024,
true);
//stvaranje držača javnog ključa terminala
Ke_terminala = (PublicKey)KeyBuilder.buildKey(
KeyBuilder.TYPE_RSA_PUBLIC,
KeyBuilder.LENGTH_RSA_1024,
true);
//stvaranje generatora pseudoslučajnih brojeva
RNG = RandomData.getInstance(RandomData.ALG_SECURE_RANDOM);
//stvaranje binarne reprezentacije serijskog broja digitalnog certifikata
Id = new byte [4];
//stvaranje nans-ova
Nt = new byte [16];
Nk = new byte [16];
//Stvara primjerak niza okteta duzine 512
velikiBuffer = JCSystem.makeTransientByteArray((short)512, JCSystem.CLEAR_ON_RESET);
//Stvara primjerak niza okteta duzine 256
pomBuffer = JCSystem.makeTransientByteArray((short)256, JCSystem.CLEAR_ON_RESET);
//Stvara primjerak niza okteta duzine 256
temp = JCSystem.makeTransientByteArray((short)256, JCSystem.CLEAR_ON_RESET);
}

Slika 5.3. Osnovni konstruktor razreda UslugaSigurnosti


Javno sučelje razreda UslugaSigurnosti sastoji se od 8 metoda:

kojekartičnoj aplikaciji pružaju potpuno transparentnu sigurnost, ali bez mogućnosti uplitanja u rad sigurnosnih mehanizama.

Javno dostupne metode možemo podijeliti u tri skupine:



5.1.2.2. Metoda predprocesirajAPDU


Metoda predprocesirajAPDU(byte[]) provjerava i miče 16-bitnu zaštitnu sumu, te potom ako je uspostavljen sigurni komunikacijski kanal obavlja dekriptiranje pristigle APDU naredbe ili provjerava digitalni potpis, ovisno da li je pristigla kriptirana naredba ili digitalni potpis.

Zaštitna suma je 16-bitna suma svih okteta podatkovnog dijela APDU naredbe, osim Lc polja, prikazana u dvojnom komplementu (2'k). Slika 5.4. prikazuje izvorni tekst programa zaštićene (engl. protected) metode

boolean provjeriMakniChecksum(byte [] buffer)

koja provjerava i miče zaštitnu sumu APDU naredbe.

protected boolean provjeriMakniChecksum(byte [] buffer) {
//dohvati veličinu podataka
shortLc = (short) (buffer[ISO7816.OFFSET_LC] & 0x00FF);
//mora postojati barem zaštitna suma
if (Lc < 2) return false;
//makni veličinu zaštitne sume
buffer[ISO7816.OFFSET_LC] -= (byte)2;
//duljina podatkovnog polja APDU naredbe
Lc -=(byte)2;
short csum = 0;
for (short i = ISO7816.OFFSET_CDATA;
i < (short)(Lc+ISO7816.OFFSET_CDATA); ++i)
{
csum += (short)(buffer[i] & 0x00FF);
}
//vrati da li izraćunata zaštitna suma jednaka dobivenoj
return (csum == Util.getShort(buffer, (short)(ISO7816.OFFSET_CDATA+Lc)));
}

Slika 5.4. Zaštićena metoda provjeriMakniChecksum


Dekriptiranje obavlja metoda zaštićena metoda

void dekriptirajAPDU(byte[] buffer)

čiji je izvorni tekst programa prikazan na slici 5.5.


protected void dekriptirajAPDU(byte[] buffer) {
//inicijalizacija kriptatora za dekriptiranje
kriptator_sim.init(sjednickiKljuc,Cipher.MODE_DECRYPT);
//dohvati veličinu podataka
short Lc = (short)(buffer[ISO7816.OFFSET_LC]& 0x00FF);
//kopiraj podatke u pomoćni međuspremnik
Util.arrayCopy(buffer,ISO7816.OFFSET_CDATA,pomBuffer,(short)0,Lc);
//dekriptiranje podataka i promjena veličine APDU naredbe
buffer[ISO7816.OFFSET_LC]=(byte)kriptator_sim.doFinal
(pomBuffer,(short)0,Lc, buffer, ISO7816.OFFSET_CDATA);
}

Slika 5.5. Zaštićena metoda dekriptirajAPDU


Provjeru digitalnog potpisa obavlja privatna metoda

booleanprovjeriPotpis(  byte[] podaci, short offsetPodaci, short duljinaPodataka,

byte[] potpis, short offsetPotpis, short duljinaPotpisa,
Key kljuc)



koja prvo na temelju primljenih podataka (podaci) izračunava SHA-1 kriptografski sažetak, potom kriptira sažetak pomoću RSA algoritma s primljenim ključem (kljuc), te na kraju uspoređuje generirani digitalni potpis sa primljenim (potpis).

Metoda predprocesirajAPDU vraća tip boolean kojim ukazuje da li je potrebno dolaznu APDU naredbu dodatno procesirati ili ne. Ako vrati true onda je procesiranje gotovo, što znači da je APDU naredba zapamćena i da se očekuje digitalni potpis. Ukoliko vrati false procesiranje se može nastaviti na nizu koji je predan metodi. Ovaj niz sada sadrži cijelu dekriptiranu ADPU naredbu zajedno sa zaglavljem.


5.1.2.3. Metoda procesirajAPDU



Metoda procesirajAPDU(byte[]) podržava sljedeće funkcije:

Ovisno o CLA (razred pripadnosti) i INS (instrukcija) poljima ADPU naredbe pozivaju se razne, inače javno nedostupne, metode (slika 5.6.).


public boolean procesirajAPDU(byte [] buffer) throws UserException {
//Provjerava da li je stigao zahtjev za inicijalizacija //sigurnosnih mehanizama
if(buffer[ISO7816.OFFSET_CLA] == SuceljeSigurnosti.CLA_SIG_INIT)
{
if(inicijalizirana >= 6)
UserException.throwIt(SuceljePZI.ZAHTJEV_ODBIJEN);
init(buffer);
return true;
}
//Provjerava da li je stigao zahtjev za provjeru PIN-a
else if( buffer[ISO7816.OFFSET_CLA] == SuceljeSigurnosti.CLA_AUTH &&
buffer[ISO7816.OFFSET_INS] == SuceljeSigurnosti.INS_AUTH)
{
provjeriPIN(buffer);
buffer[0]= (byte)1;
return true;
}
//Provjerava da li je stigao zahtjev za promjenu PIN-a
else if( buffer[ISO7816.OFFSET_CLA] == SuceljeSigurnosti.CLA_AUTH &&
buffer[ISO7816.OFFSET_INS] == SuceljeSigurnosti.INS_CHANGE) {
promijeniPIN(buffer);
buffer[0]= (byte)1;
return true;
}
//Provjerava da li je stigla poruka koja je dio uspostave //sigurne veze
else if(buffer[ISO7816.OFFSET_CLA] == SuceljeSigurnosti.CLA_HAND)
{
ostvariSigurniKanal(buffer);
return true;
}
//Provjerava da li je stigao zahtjev za potpisivanje //podataka
else if(buffer[ISO7816.OFFSET_CLA] == SuceljeSigurnosti.CLA_SIGN)
{
potpisiPodatke(buffer);
return true;
}
return false;
}

Slika 5.6. Metoda procesirajAPDU razreda UslugaSigurnosti



5.1.2.4. Inicijalizacija sigurnosnih mehanizama


Inicijalizacija sigurnosnih mehanizama se obavlja pomoću metode init(). Inicijalizira se javni i privatni ključ kartice i identifikator kartice (serijski broj digitalnog certifikata).

Za cijeli postupak inicijalizacije potrebne su četiri poruke. Šalje se:

  1. Eksponent javnog ključa kartice

  2. Eksponent privatnog ključa kartice

  3. Modul ključeva kartice

  4. Identifikator kartice

Postupak se obavlja samo jednom prije prve upotrebe kartice. Pokušaj reinicijalizacije kartice završiti će greškom.



5.1.2.5. Uspostava sigurnog komunikacijskog kanala


Svrha protokola je dogovor tajnog sjedničkog ključa između terminala i kartice i autentifikacija kartice. Terminal posjeduje svoj javni ključ, svoj privatni ključ i certifikat izdavača kartice. Kartica posjeduje svoj javni ključ, svoj privatni ključ i serijski broj svog digitalnog certifikata. Pretpostavlja se da terminal može na temelju serijskog broja certifikata kartice dohvatiti i provjeriti njen digitalni certifikat. Zbog toga što kartica nema mogućnosti provjere terminala (prvenstveno zato što Java Card platforma ne podržava korištenje digitalnih certifikata), protokol pretpostavlja povjerenje u terminal.

Uspostava sigurnog komunikacijskog kanala se odvija prema sljedećem protokolu koji je inspiriran preporučenim X.509 autentifikacijskim protokolom s tri poruke:

  1. Terminal kartici šalje svoj javni ključ (KETerminala ) te jedan 16 bitni slučajni broj Nt (engl. Number used only once – nonce) potpisan svojim privatnim ključem (KDTerminala). Slučajan broj se koristi kako bi uveo dodatnu komponentu slučajnosti u protokol i osigurava da poruka nije ponovljena. Digitalnim potpisom osigurava se integritet, autentičnost i neporecivost poruke.

    M1=[KETerminala, E(Nt,KDTerminala)]

  2. Kartica pomoću javnog ključa terminala dekriptira Nt. Nakon toga terminalu šalje, kriptirano terminalovim javnim ključem i potpisano svojim privatnim ključem ( KDKartice), Nt, novi 16 bitni slučajni broj Nk i svoj identifikator IDk, pomoću kojeg će terminal dohvatiti kartičin digitalni certifikat. Kriptiranjem poruke postiže se tajnost, tj. nitko osim terminala ne može doznati sadržaj poruke. Digitalnim potpisom postiže se integritet, autentičnost i neporecivost poruke, tj. terminal može biti siguran da je primljene podatke poslala kartica:

    M2=[E((Nk, Nt, IDk),KETerminala), E(H(Nk, Nt, Idk),KDKartice)]

  3. Terminal dekriptira svojim privatnim ključem prvi dio poruke i doznaje Nt', Nk, IDk. Provjerava Nt' sa Nt koji je on generirao. Ako su slučajni brojevi isti terminal zna da kartica odgovara na zadnje poslanu poruku. Korištenjem slučajnih brojeva onemogućuje se ponavljanje poruka. Na temelju IDk terminal doznaje kartičin digitalni certifikat iz kojeg saznaje javni ključ kartice (KEKartice ). Pomoću tog ključa provjerava digitalni potpis poruke, a time autentificira digitalni potpis poruke. Terminal potom generira tajni sjednički ključ K i šalje ga kriptiranog javim ključem kartice i digitalno potpisanim svojim privatnim ključem. Šalje i Nk koji je digitalno potpisao svojim privatnim ključem. Kriptiranje sjedničkog ključa s javnim ključem kartice osigurava se da ključ može saznati jedino dotična kartica. Provjerom digitalnog potpisa ključa kartica može biti sigurna da je ključ poslao terminal.

    M3=[E(Nk,KDTerminala), E(K,KEKartice),E(H(K),KDTerminala)]

  4. Kartica po primitku ove zadnje poruke doznaje Nk' te ga provjerava sa Nk koji je ona generirala. Ako su slučajni brojevi isti kartica zna da terminal odgovara na zadnje poslanu poruku. Doznaje tajni sjednički ključ K koji će koristiti za kriptiranje svih poruka do kraja sjednice.



Slika 5.7. prikazuje opisani protokol.



Handshake

Slika 5.7. Protokol uspostave sigurnog komunikacijskog kanala



Navedeni protokol je otporan na pasivno prisluškivanje jer napadač ne može saznati tajni sjednički ključ. Napadač može doznati javni ključ terminala (KETerminala), Nt, Nk, H(K) i identifikator kartice (IDk), koji predstavlja serijski broj digitalnog certifikata kartice.

Što se tiče aktivnih napada kao što je napad čovjekom u sredini (engl. man in the middle), napadač bi mogao “glumiti” terminal kada se obraća kartici (pod uvjetom da napadač može doznati digitalni certifikat kartice na temelju njegovog serijskog broja), jer kartica nema mogućnosti provjere terminala, ali da bi se predstavio pravom terminalu kao kartica morao bi i sam biti u sustavu zdravstva sa valjanim digitalnim certifikatom koji je potpisao dotični osiguravajući zavod. Zbog nemogućnosti kartice da provjeri terminal, lažni terminal bi mogao uspostaviti sigurnu komunikacijski kanal sa karticom. Zato se predpostavlja povjerenje u terminal i ne preporuča korištenje bezkontaktnih kartica.

Navedeni problemi su prisutni samo uz pretpostavku da napadač može doznati digitalni certifikat kartice na temelju njegovog serijskog broja. Ukoliko bi osiguravajući zavod koristio digitalne certifikate svojih osiguranika samo u svrhu pametnih zdravstvenih iskaznica i time ih učinio javno nedostupnim navedeni problemi bi nestali. Naravno ovo bi bilo u suprotnosti s osnovnim načelima digitalnih certifikata koji nalažu javnu dostupnost.

PZI koristi autorizaciju pomoću PIN-a, koju pruža razred UslugaSigurnosti, tako da svaka naredba mora biti adekvatno autorizirana bilo PIN-om korisnika, izdavača kartice ili izdavača kartične aplikacije. Mogući problem koji proizlazi iz korištenja ove vrste autorizacije je sličan problemu koji se često susreće u bankarstvu prilikom korištenja bankomata, tj. svaki korisnik treba biti siguran u autentičnost terminala prije upisivanja PIN-a.

Sustav PZI koristi potpisivanje svih uputnica i recepata tako da niti jedan recept ili uputnica neće biti izdan dok se ne uspostavi da je digitalno potpisan od strane liječnika.


5.1.2.6. Provjera PIN-a


Zaštićena metoda

void provjeriPIN(byte [] buffer)

obavlja funkciju provjere primljenog PIN-a (podatkovni dio APDU naredbe predstavljene sa byte [] buffer) sa tri raspoloživa PIN-a:

Ukoliko je primljeni PIN kraći od očekivanog metoda baca iznimku javacard.framework.UserException sa razlogom “KRIVI PIN” definiranim u sučelju SuceljeSigurnosti. Ukoliko primljeni PIN odgovara jednom od PIN-ova metoda uspješno završava i postavlja se određena razina autorizacije koja je prisutna tijekom sjednice. Ukoliko primljeni PIN ne odgovara niti jednom PIN-u umanjuje broj preostalih pokušaja unosa PIN-a korisnika kartice, ukoliko taj PIN nije već zaključan. Ukoliko je zaključan umanjuje se broj pokušaja PIN-a izdavača kartice. Ukoliko je on također zaključan umanjuje se broj pokušaja PIN-a izdavača kartične aplikacije. Na ovaj način uspostavljena je trorazinska autorizacija PIN-om.


5.1.2.7. Promjena PIN-a


Zaštićena metoda

void promijeniPIN(byte [] buffer)

omogućuje promjenu bilo kojeg PIN-a tijekom normalnog rada PZI. Promjena dotičnog PIN-a mora biti autorizirana PIN-om te ili više razine, što omogućuje izdavaču kartice da mijenja PIN korisnika, ali istovremeno onemogućuje korisniku kartice da mijenja bilo koji PIN osim vlastitog. Izvorni tekst programa je prikazan na slici 5.8.


protected void promijeniPIN(byte [] buffer) throws UserException
{
//APDU|CLA_AUTH|INS_AUTH|MSB(razina)|LSB(razina)|Lc|PIN|
short razina = Util.makeShort( buffer[ISO7816.OFFSET_P1],
buffer[ISO7816.OFFSET_P2]);
Autoriziraj(razina);
switch(razina) {
case PRINCIPAL_CARDHOLDER :
cardholderPIN.update(buffer, ISO7816.OFFSET_CDATA, PIN_SIZE);
break;
case PRINCIPAL_CARD_ISSUER :
cardholderPIN.update(buffer, ISO7816.OFFSET_CDATA, PIN_SIZE);
break;
case PRINCIPAL_APP_PROVIDER :
appProviderPIN.update(buffer, ISO7816.OFFSET_CDATA, PIN_SIZE);
break;
}
}

Slika 5.8. Zaštićena metoda promijeniPIN



5.1.2.8. Potpisivanje podataka



Zaštićena metoda

void potpisiPodatke(byte [] buffer)

omogućuje digitalno potpisivanje podataka s ključem kartice (slika 5.9).

protected void potpisiPodatke(byte[] buffer){
//izračunaj sažetak
short n = sazetak.doFinal(
buffer,ISO7816.OFFSET_CDATA,
(short)(buffer[ISO7816.OFFSET_LC]&0x00FF),
temp,(short)0
);
//digitalno potpisivanje
buffer[0] = (byte)(kriptiraj( temp,(short)0,
buffer,(short)1,
n,
KdKe_kartice.getPrivate(),
Cipher.MODE_ENCRYPT)+1
);
}

Slika 5.9. Zaštićena metoda potpisiPodatke



5.1.2.9. Metoda postprocesirajAPDU


Metoda

void  postprocesirajAPDU(byte[])

ako je uspostavljen sigurni komunikacijski kanal obavlja kriptiranje odlaznog APDU odgovora ili generira digitalni potpis (ovisno o fazi odgovora u kojoj se nalazi), te neovisno o sigurnosti komunikacijskog kanala stavlja 16-bitnu zaštitnu sumu na kraj APDU paketa.

Kriptiranje obavlja zaštićena metoda

void kriptirajAPDU(byte[] buffer)

čiji je izvorni tekst programa prikazan na slici 5.10.


protected void kriptirajAPDU(byte[] buffer) {
//inicijalizacija kriptatora za kriptiranje
kriptator_sim.init(sjednickiKljuc,Cipher.MODE_ENCRYPT);
//dohvati veličinu podataka
short Lc = (short)((buffer[0]& 0x00FF)-1);
//kopiraj podatke u pomoćni međuspremnik
Util.arrayCopy(buffer,(short)1,velikiBuffer,(short)0,Lc);
//kriptiranje podataka i promjena veličine APDU naredbe
buffer[0]=(byte)(kriptator_sim.doFinal(
velikiBuffer,(short)0,
Lc,
buffer,(short)1)+1);
}

Slika 5.10. Zaštićena metoda kriptirajAPDU


Izračunavanje digitalnog potpisa obavlja privatna metoda

short potpisi(  byte[] inBuffer, short inOffset,
byte[] outBuffer,short outOffset,
short duljina,
Key kljuc)


koja prvo na temelju primljenih podataka (inBuffer) izračunava SHA-1 kriptografski sažetak, potom kriptira sažetak pomoću RSA algoritma sa primljenim ključem (kljuc).

Zaštitna suma je 16-bitna suma svih okteta podatkovnog dijela APDU odgovora, prikazana u dvojnom komplementu (2'k). Slika 5.11. prikazuje izvorni tekst programa zaštićene (engl. protected) metode

void staviChecksum(byte [] buffer)

koja izračunava i stavlja zaštitnu sumu.

protected void staviChecksum(byte [] buffer){
short csum = 0;
//dohvati veličinu odgovora
short Le = (short)(buffer[0]& 0x00FF);
//racunaj zaštitnu sumu
for (short i = 0; i < Le; ++i) {
csum += (short)(buffer[i] & 0x00FF);
}
//dodaj zaštitnu sumu na kraj
javacard.framework.Util.setShort(buffer,(short)(Le),csum);
//povećaj polje Le
buffer[0]=(byte)(Le+2);
}
Slika 5.11. Zaštićena metoda staviChecksum



Metoda postprocesirajAPDU mijenja primljeni međuspremnik koje se po povratku iz metode može proslijediti terminalu.


5.1.2.10. Metode za ispitivanje određenih uvjeta


Metoda

void Autoriziraj(short razinaOvlastenja)

provjerava da li je uspostavljen sigurni komunikacijski kanal, da li su primljeni podaci konzistentni i da li je naredba ovlaštena. U slučaju da podaci nisu konzistentni, nije ostvaren sigurni komunikacijski kanal ili naredba nije ovlaštena baca se javacard.framework.UserException iznimka redom sa sljedećim razlozima: SuceljePZI.KORUPTIRANI_PODACI, SuceljePZI.ZAHTJEV_ODBIJEN, SuceljePZI.ZAHTJEV_ODBIJEN. Slika 5.12 prikazuje izvorni tekst programa metode.

public void Autoriziraj(short razinaOvlastenja) throws UserException {
//provjera konzistentonsti primljenih podataka
if (!isCommandSecure(PROPERTY_INPUT_INTEGRITY))
UserException.throwIt(SuceljePZI.KORUPTIRANI_PODACI);
//provjera sigurnosti komunikacijskog kanala
if (!isChannelSecure(PROPERTY_INPUT_CONFIDENTIALITY))
UserException.throwIt(SuceljePZI.ZAHTJEV_ODBIJEN);
//provjera razine ovlaštenja
if (!isAuthenticated(razinaOvlastenja))
UserException.throwIt(SuceljePZI.ZAHTJEV_ODBIJEN);
}
Slika 5.12 Metoda Autoriziraj


Metoda

boolean isCommandSecure(byte trazenaSvojstva)

provjerava da li su primljeni podaci konzistentni. Metoda

boolean isChannelSecure(byte trazenaSvojstva)

provjerava da li postoji sigurni kanal između kartice i terminala. Navedene metode provjeravaju uvjete bitovno (engl. bit-wise), tj. sve konstante koje se koriste kao uvjeti koji se predaju ovim metodama imaju samo jednu jedinicu u svom binarnom zapisu (potencije broja 2) tako da metode daju kao rezultat istinu ako je u zapamćenoj privatnoj varijabli sigurnost “uključen” određeni bit. Metoda

boolean isAuthenticated(short razina)

provjerava da li je tražena razina ovlaštenja autorizirana PIN-om, tako da usporedi da li je razina s kojom se korisnik autorizirao pomoću PIN-a veća ili jednaka traženoj razini ovlaštenja. Slika 5.13. prikazuje izvorni tekst programa ovih metoda.


public boolean isCommandSecure(byte trazenaSvojstva) {
return (sigurnost & trazenaSvojstva) != 0;
}
public boolean isChannelSecure(byte trazenaSvojstva) {
return (sigurnost & trazenaSvojstva) != 0;
}
public boolean isAuthenticated(short razina) {
return (autentificirano >= razina);
}

Slika 5.13. Metode isChannelSecure,isChannelSecure,isAuthenticated

Engleski nazivi objašnjenih metoda kao i engleski nazivi nekih konstanti preuzeti su iz paketa javacard.framework.service koji postoji u specifikaciji Java Card 2.2.1 platforme (pri implementaciji ovih sigurnosnih mehanizama korištena je Java Card 2.1.1 platforma).


5.2. Paket terminalPZI


Paket terminalPZI sadrži jedno sučelje DohvatacCertifikata i dva razreda DatotecniDohvatacCertifikata i SigurnaAPDUVeza koji ostvaruju sigurnost.
Osnovi razred ovog paketa je SigurnaAPDUVeza koji proširuje razred hr.fer.zemris.diplomski.terminalPZI.APDUVeza i implementira sigurnosne mehanizme oka što su: zaštitna suma, kriptiranje/dekriptiranje i digitalno potpisivanje,....



5.2.1. Razred SigurnaAPDUVeza


Razred SigurnaAPDUVeza je apstraktan i predstavlja osnovu za daljnje razvijanje aplikacija koje moraju sigurno komunicirati sa kartičnom aplikacijom. Razred je zamišljen kao neka vrsta sigurnosnog međusloja (engl. middleware) pomoću kojeg se će davatelj kartične aplikacije napraviti razred za pristup mogućnostima kartične aplikacije i tako u potpunosti sakriti detalje sigurnosti i kartične aplikacije od aplikacijskog programera koji će razvijati aplikaciju s grafičkim korisničkim sučeljem (engl.Graphical User Interface - GUI) namijenjenu korisniku. Razred nasljeđuje razred APDUVeza čime nasljeđuje sve metode nužne za rad sa kartičnom aplikacijom. Razred pruža:

Tablice5.4, 5.5 i 5.6 ukratko opisuju ne privatne članove razreda.



Varijable i konstante


Ime i opis

SigurnaAPDUVeza

vezaPotpisivaca

Veza prema potpisivaču.

Tablica 5.4. Varijable i konstante razreda SigurnaAPDUVeza

Konstruktori

Prototip

Opis

SigurnaAPDUVeza(opencard.core.service.CardService veza)

			

Osnovni konstruktor koji prima primjerak razreda CardService kojem se pri komunikaciji s pametnom karticom prosljeđuje APDU naredba i koji prima povratni APDU odgovor.

SigurnaAPDUVeza( opencard.core.service.CardServiceveza, SigurnaAPDUVeza vezaPotpisivaca )

Konstruktor koji prima primjerak razreda CardService kojem se pri komunikaciji s pametnom karticom prosljeđuje APDU naredba i koji prima povratnu APDU odgovor te referencu tipa SigurnaAPDUVeza koja predstavlja vezu prema drugoj kartici koja će se koristiti za digitalno potpisivanje podataka na zahtjev.

Tablica 5.5. Konstruktori razreda SigurnaAPDUVeza


Metode

Povratna vrijednost

Opis

protected void

dekriptirajAPDU(byte[]buffer)

Metoda koja dekriptira APDU naredbu.

boolean

identificirajKorisnika(byte[] PIN) 

Metoda koja slanjem PIN-a identificira korisnika kartice.

void

initKarticu(java.security.PublicKey Ke, java.security.PrivateKey Kd, java.math.BigInteger Id)

Metoda koja inicijalizira karticu sa njenim parom asimetričnih ključeva i serijskim brojem njenog digitalnog certifikata.

void

initSigurnost(java.lang.String algoritam, java.lang.String nacin, java.lang.String nadopuna, int velicnaKljuca) 

Metoda koja inicijalizira kriptografske mehanizme.

protected byte[]

izmijeniAPDU(byte[] inBuffer)

Metoda koja šalje primljenu APDU naredbu (inBuffer) i vraća odgovor.

protected void

kriptirajAPDU(byte[]buffer)

Metoda koja kriptira APDU naredbu.

void

ostvariSigurniKanal() 

Metoda "rukovanja" koja izmjenjuje ključeve i stvara sigurni komunikacijski kanal.

protected void

potpisiAPDU(byte[] buffer) 

Metoda koja digitalno potpisuje ADPU naredbu.

java.security.cert.

Certificate

procitajCertifikat(java.lang.String ime datoteke)

Metoda koja iz datoteke čita digitalni certifikat u ASN.1 DER, PKCS#10 kompatibilnom formatu, Base64 kôdiran.

java.security.

PrivateKey

procitajPrivatanKljuc( java.lang.String imeDatoteke ) 

Metoda koja iz datoteke čita privatan ključ u binarnom nekriptiranom PKCS#8 formatu.

protected boolean

provjeriMakniChecksum(byte[] buffer) 

Metoda koja provjerava i miče zaštitnu sumu.

boolean

provjeriPotpis(byte[] podaci, byte[] potpis, int brojCertifikata) 

Metoda koja dohvaća digitalni certifikat serijskog broja brojCertifikata te sa javnim ključem iz tog digitalnog certifikata provjerava digitalni potpis.

protected void

staviCheckSum(byte[] buffer) 

Metoda koja izračunava zaštitnu sumu i stavlja je na kraj APDU naredbe.

byte[]

traziPotpisPodataka(byte[] podaci, int offset, int duljina) 

Metoda koja šalje kartici podatke na potpisivanje.

boolean

vezaSigurna() 

Metoda koja odgovara na pitanje: "Da li je ostvaren sigurni komunikacijski kanal?".

Tablica 5.6. Ne privatne metode razreda SigurnaAPDUVeza


5.2.1.1. Korištenje razreda SigurnaAPDUVeza


Razred SigurnaAPDUVeza je apstraktan tako da ga je potrebno naslijediti da bi se mogao koristiti. Svaki nasljeđujući razred mora pozvati jedan od konstruktora kako bi inicijalizirao objekt razreda opencard.core.service.CardService iz osnovnog razreda (APDUVeza) pomoću koga se komunicira sa karticom. Postoje dva konstruktora. Prvi konstruktor jednostavno proslijeđuje primljenu referencu konstruktoru osnovnog razreda. Drugi dodatno pamti referencu na dodatnu vezu prema kartičnoj aplikaciji za potrebe digitalnog potpisivanja podataka. Nakon poziva konstruktora i stvaranja primjerka razreda potrebno je pozvati metodu initSigurnost (detaljno objašnjena u poglavlju 5.2.1.2) kojom se inicijaliziraju sigurnosni mehanizmi npr.:

initSigurnost("DESede","ECB", "PKCS5Padding", 192) .

Nakon poziva ove metode sve je spremno za daljnji rad. Daljnji redoslijed poziva metoda nije uvjetovan, ali logični slijed bi bio odabiranje appleta metodom

void odaberiApplet(byte[] AID)

iz osnovnog razreda APDUVeza te uspostavljanje sigurnog komunikacijskog kanala metodom

void ostvariSigurniKanal().

Uspostava sigurnog komunikacijskog kanala je detaljno objašnjena u poglavlju 5.1.2.5.Ukoliko se radi o neinicijaliziranoj kartici umjesto metode ostvariSigurniKanal bilo bi logično pozvati metodu

void initKarticu( java.security.PublicKey Ke, java.security.PrivateKey Kd,
                  java.math.BigInteger Id ),


koja će inicijalizirati karticu sa njenim parom asimetričnih ključeva i serijskim brojem njenog digitalnog certifikata.

Javno sučelje razreda sastoji se od 9 metoda:

koje omogućuju:

Najvažnija metoda ovog razreda je :

protected byte[] izmijeniAPDU(byte[] inBuffer).

To je zaštićena metoda koja šalje APDU naredbu kartici te prima APDU odgovor (detaljno objašnjena u poglavlju 5.2.1.4).



5.2.1.2. Metoda initSigurnost


Metoda initSigurnost inicijalizira sve potrebne kriptografske mehanizme. Metoda prima sljedeće parametre sa sljedećim značenjima:

Vrijednosti parametara algoritam,nacin,nadopuna,velicinaKljuca su definirani sa Java 2 SDK Security API (vidjeti poglavlje 4.6.1 ili "Java Cryptography Extension Reference Guide, Appendix A: Standard Names"). Metoda initSigurnost inicijalizira generator simetričnih ključeva ovisno o parametru algoritam, veličinu budućeg simetričnog sjedničkog ključa na velicinaKljuca, objekt za simetrično kriptiranje prema parametrima algoritam, nacin,nadopuna, objekt za asimetrično kriptiranje RSA algoritmom sa nadopunom prema PKCS#1 i generator kriptografskih SHA-1 sažetaka. Metoda potom poziva privatnu metodu void procitajConfigDatoteku() koja čita konfiguracijsku datoteku u potrazi za putanjima prema datotekama koje sadrže digitalni certifikat izdavača, digitalni certifikat terminala, privatni ključ terminala te direktorijima koji sadrže ključeve i digitalne certifikate. Format konfiguracijske datoteke je sljedeći:

primjer konfiguracijske datoteke je:

RootCER = certifikati/CER_HZZO_HZZO.pem
TermCER = certifikati/CER_term1_HZZO.pem
TermKey = kljucevi/Kd_term1_PKCS8.der
KeyDIR = kljucevi
CERDIR = certifikati

Nakon čitanja konfiguracijske datoteke čitaju se digitalni certifikati izdavača i terminala te privatni ključ terminala. Digitalni certifikati moraju biti u ASN.1 DER,PKCS#10 kompatibilnom formatu zapisani u Base64 formatu. Privatni ključevi moraju biti u binarnom nekriptiranom PKCS#8 formatu. Veličina asimetričnih ključeva nije uvjetovana, ali radi kompatibilnosti sa kartičnom aplikacijom koriste se 1024 bitni ključevi.

Zadnja stvar koju metoda obavlja je stvaranje repozitorija digitalnih certifikata, koji će se koristiti prilikom dohvaćanja digitalnog certifikata kartice pri uspostavi sigurnog komunikacijskog kanala, te pri provjeri digitalnog potpisa uputnica i recepata. Repozitorij je primjerak razreda DatotecniDohvatacCertifikata. Taj razred implementira sučelje DohvatacCertifikata koje definira sve potrebne metode za dohvat digitalnih certifikata prema određenom kriteriju. Na ovaj način je postignuto da se jednostavno može zamijeniti datotečni dohvatać sa nekim drugim promjenom samo jedne linije izvornog teksta programa. Sučelje DohvatacCertifikata je detaljnije opisano u poglavlju 5.2.2 a razred DatotecniDohvatacCertifikata u poglavlju 5.2.3.Slika 5.14. prikazuje izvorni tekst programa metode initSigurnost.


public void initSigurnost(String algoritam, String nacin, String nadopuna, int velicnaKljuca)
throws NoSuchAlgorithmException, NoSuchPaddingException,
NoSuchProviderException, CertificateException,
FileNotFoundException, IOException,
InvalidKeySpecException,InvalidAlgorithmParameterException
{
//inicijalizacija generatora simetričnih ključeva
if(simKljucGenerator == null)
simKljucGenerator = KeyGenerator.getInstance(algoritam);
velicinaSjednickogKljuca = velicnaKljuca;
//inicijalizacija simetričnog kiptatora
if(cipher_sim == null)
cipher_sim = Cipher.getInstance(algoritam+"/"+nacin+"/"+nadopuna);
//inicijalizacija asimetricnog kiptatora
if(cipher_asim == null)
cipher_asim = Cipher.getInstance("RSA/NONE/PKCS1Padding");
//inicijalizacija generatora digitalnih sažetaka
if(sazetak == null)
sazetak = MessageDigest.getInstance("SHA-1");
//čitanje i parsiranje configuracijske datoteke
procitajConfigDatoteku();
//čitanje digitalnog certifikata izdavaca
CER_korijena = procitajCertifikat(pathRootCER);
//čitanje digitalnog certifikata terminala
CER = procitajCertifikat(pathCER);
//čitanje privatnog kljuca terminala
Kd = procitajPrivatanKljuc(pathKey);
//stvaranje repozitorija digitalnih certifikata
certifikati = new DatotecniDohvatacCertifikata(pathDirCER);
}

Slika 5.14. Metoda
initSigurnost


T-PZI koristi sljedeće kriptografske algoritme i ključeve:


Neki od ovdje navedenih mehanizama nisu podržani od strane JCE davatelja koji dolaze sa Sun-ovom instalacijom Java platforme. Konkretno SunJCE ne podržava nadopunu prema ISO 7816-4 i kriptiranje RSA algoritmom. Zato je potrebno instalirati i registrirati (poglavlje 4.1.6) JCE davatelja (davatelje) koji podržava navedene mehanizme.

U razvojnoj i testnoj okolini PZI-a korišten je besplatni i vrlo moćni “The Legion Of The Bouncy Castle” (http://www.bouncycastle.org)JCE davatelj.



5.2.1.3. Metoda initKarticu


Metoda

initKarticu( java.security.PublicKey Ke,java.security.PrivateKey Kd, java.math.BigInteger Id)

inicijalizira javni i privatni ključ kartice i identifikator kartice (serijski broj digitalnog certifikata). Metoda prima tri parametra: javni ključ kartice, privatni ključ kartice i serijski broj digitalnog certifikata kartice predstavljen kao BigInteger. Metoda je prilagođena 1024-bitnim RSA ključevima, a serijski broj certifikata može biti maksimalno 32-bitni 2'k cijeli broj. Ograničenja prvenstveno postoje zbog ograničenosti kartične aplikacije. Za cijeli postupak inicijalizacije potrebne su četiri poruke. Šalje se:

  1. Eksponent javnog ključa kartice

  2. Eksponent privatnog ključa kartice

  3. Modul ključeva kartice

  4. Identifikator kartice



5.2.1.4. Metoda izmijeniAPDU

Metoda izmijeniAPDU je osnovna komunikacijska metoda ovog razreda. Ona šalje primljenu APDU naredbu i vraća odgovor. Prilikom slanja prvo obavlja svo potrebno predprocesiranje poruke, a po primitku odgovora svo potrebno postprocesiranje. Slanje poruke se obavlja na sljedeći način: ukoliko je CLA polje APDU naredbe 0x00 ne obavlja se nikakvo predprocesiranje niti se odgovor postprocesira. Ovo omogućuje slanje naredbi koje neće biti procesirane od strane sigurnosno osviještenog appleta već neke treće strane. Primjer je APDU naredba za odabiranje appleta sa APDU zaglavljem : 0x00, 0xA4, 0x04, 0x00. Ovakvo ponašanje je zapravo ekvivalentno ponašanju orginalne metode izmijeniAPDU iz razreda ADPUVeza. Ukoliko CLA polje nije jednako 0x00 obavlja se barem minimalno predprocesiranje. Minimalno predprocesiranje predstavlja stavljanje 16-bitne zaštitne sume. Ukoliko je ostvaren sigurni komunikacijski kanal i veličina poruke je veća od 0 obavlja se dodatno predprocesiranje koje uključuje kriptiranje sjedničkim ključem i digitalno potpisivanje poruke. Zbog ograničenja maksimalne veličine ADPU poruke definirane sa ISO7816-4 od 255 okteta, kriptirana poruka se šalje odvojeno od digitalnog potpisa. Nakon slanja svakog dijela poruke čeka se odgovor o uspješnosti slanja i procesiranje poruke na kartici. Slanje zadnjeg dijela poruke ujedno označava početak primanja odgovora na poslanu APDU naredbu.

Postprocesiranje se obavlja slično kao predprocesiranje, ali donekle obrnutim postupkom. Ukoliko je CLA polje poslane APDU naredbe bilo 0x00 postprocesiranje se preskače. U suprotnom se prvo miče i provjerava 16-bitna zaštitna suma. Ukoliko zaštitna suma ne odgovara primljenim podacima baca se iznimka java.io.IOException sa razlogom “KORUPTIRANI PODACI”. Ukoliko je ostvaren sigurni komunikacijski kanal i veličina primljenih podataka je veća od 0 obavlja se dodatno postprocesiranje (prvi oktet primljenog odgovora određuje veličinu odgovora – karakteristično za PZI) koje uključuje dekriptiranje poruke i provjera primljenog digitalnog potpisa. Primitkom prvog odgovora, koji predstavlja kriptiranu poruku sjedničkim ključem, obavlja se dekriptiranje i pamćenje dekriptirane poruke. Potom se od kartične aplikacije traži digitalni popis, slanjem orginalnog zaglavlja, ali bez tijela poruke. Primitkom drugog odgovora provjerava se digitalni potpis i u slučaju neispravnosti baca iznimka java.security.SignatureException sa razlogom "KRIVI DIGITALNI POTPIS".

Metoda izmijeniAPDU vraća dekriptirani APDU odgovor bez ikakvih dodataka i time ostvaruje transparentnost sigurnosnih mehanizama.

Na slici 5.15 prikazan je protokol izmjene APDU paketa u slučaju kada je ostvaren sigurni komunikacijski kanal.





Slika protokola razmjene podataka

Slika 5.15. Protokol razmjene podataka



5.2.1.5. Metoda traziPotpisPodataka


Metoda traziPotpisPodataka šalje kartici podatke na potpisivanje. Metoda šalje APDU naredbu s poljem CLA postavljenim na vrijednost SuceljeSigurnosti.CLA_SIGN što uzrokuje metodu procesirajAPDU (poglavlje 5.1.2.3) da pozove metodu potpisiPodatke (poglavlje 5.1.2.8) koja će generirati digitalni potpis podataka pomoću privatnog ključa kartice. U sklopu PZI metoda se koristi prilikom digitalnog potpisivanja uputnica i recepata. Slika 5.16 prikazuje izvorni tekst programa metode.


public byte [] traziPotpisPodataka(byte[] podaci, int offset, int duljina)
throws IOException, CardServiceImplementationException, GeneralSecurityException
{
byte [] buffer = new byte[duljina+5];
buffer[ISO7816.OFFSET_CLA] = CLA_SIGN;
//preskačemo polja za INS, P1 i P2
//veličina polja
buffer[ISO7816.OFFSET_LC] = (byte)duljina;
//PIN
System.arraycopy(podaci, offset, buffer, ISO7816.OFFSET_CDATA, duljina);
//šalji APDU naredbu i primi odgovor
byte [] vracenPotpis = izmijeniAPDU(buffer);
byte [] potpis = new byte [(vracenPotpis[0]&0xff)-1];
System.arraycopy(vracenPotpis,1,potpis,0,potpis.length);
return potpis;
}

Slika 5.16. Metoda traziPotpisPodataka



5.2.1.6. Metoda identificirajKorisnika


Metoda identificirajKorisnika služi za identifikaciju korisnika pomoću PIN-a. Metoda šalje ADPU naredbu sa CLA poljem SuceljeSigurnosti.CLA_AUTH i INS poljem SuceljeSigurnosti.INS_AUTH. Metoda vraća logičku istinu ukoliko je cijeli proces prošao bez pogrešaka. U slučaju da nastane bilo koja pogreška tj. ukoliko se uhvati bilo koja iznimka metoda vraća logičku laž. Slika 5.17 prikazuje izvorni tekst programa metode.

public boolean identificirajKorisnika(byte[] PIN) {
byte[] buffer = new byte[PIN_SIZE + 5];
buffer[ISO7816.OFFSET_CLA] = CLA_AUTH;
buffer[ISO7816.OFFSET_INS] = INS_AUTH;
//preskačemo polja za P1 i P2
//veličina polja
buffer[ISO7816.OFFSET_LC] = PIN_SIZE;
//PIN
System.arraycopy(PIN, 0, buffer, ISO7816.OFFSET_CDATA, PIN_SIZE);
//pošalji APDU naredbu
try {
buffer = izmijeniAPDU(buffer);
}
catch (Exception e) {
return false;
}
return true;
}

Slika 5.17. Metoda identificirajKorisnika



5.2.1.7. Metoda provjeriPotpis


Metoda

boolean provjeriPotpis( byte[] podaci, byte[] potpis,int brojCertifikata)

dohvaća digitalni certifikat serijskog broja određenog parametrom brojCertifikata iz repozitorija digitalnih certifikata te sa javnim ključem iz tog digitalnog certifikata provjerava digitalni potpis primljenih podatka. Metoda se koristi u T-PZI prilikom poništavanja uputnica i recepata. Slika 5.18 prikazuje izvorni tekst programa metode.

public boolean provjeriPotpis(byte[] podaci, byte[] potpis, int brojCertifikata)
throws GeneralSecurityException
{
X509CertSelector trazeniCert = new X509CertSelector();
//kriterij za odabiranje digitalnih certifikata
trazeniCert.setSerialNumber(new BigInteger(brojCertifikata+""));
//dohvačanje provjerenih certifikata koji zadovoljavaju
//navedene kriterije
Collection cert = certifikati.dohvatiProvjereneCertifikate(
trazeniCert, CER_korijena.getPublicKey());
//ukoliko niti jedan provjereni certifikat ne zadovoljava
//kriterije
if(!cert.iterator().hasNext())
throw new GeneralSecurityException(
"U nemogucnosti uspostaviti sigurni komunikacijski kanal!\n" +
"Povreda sigurnosti: traženi korisnik ne postoji!" + brojCertifikata);
//dohvaćanje prvog certifikata
Certificate CER = (Certificate)cert.iterator().next();
//provjera podataka pomoću digitalnog certifikata
return provjeriPotpis(podaci,1,(podaci[0]&0x00FF)-1, potpis,1,(potpis[0]&0x00FF)-1,CER);
}
Slika 5.18. Metoda provjeriPotpis



5.2.2. Sučelje DohvatacCertifikata


Sučelje koje definira opčenito sučelje za dohvaćanje traženih digitalnih certifikata. Sučelje definira dvije metode: dohvatiCertifikate i dohvatiProvjereneCertifikate.

Metoda

java.util.Collection dohvatiCertifikate (java.security.cert.CertSelector uvjet)

dohvaća sve digitalne certifikate koji zadovoljavaju navedeni uvjet. Uvjet se zadaje objektom razreda java.security.cert.CertSelector (pogledati 4.1.2). Metoda vraća sve digitalne certifikate koji zadovoljavaju naveden uvjet u obliku objekta razreda java.util.Collection. Ukoliko nastane pogreška prilikom dohvaćanja digitalnih certifikata baca se iznimka java.security.cert.CertStoreException.

Metoda

java.util.Collection dohvatiProvjereneCertifikate (java.security.cert.CertSelector uvjet, java.security.PublicKey javniKljuc)

dohvaća sve provjerene (točan potpis i važeće) digitalne certifikate koji zadovoljavaju navedeni uvjet. Sve navedeno za prethodnu metodu (dohvatiCertifikate) vrijedi i ovdje. Metoda prima javni ključ s kojim se provjeravaju digitalni certifikati.



5.2.3. Razred DatotecniDohvatacCertifikata


Razred DatotecniDohvatacCertifikata implementira sučelje DohvatacCertifikata i pruža mogućnost dohvaćanje digitalnih certifikata iz u memoriji napravljenog repozitorija. Datotečni dohvatać certifikata, kao što mu ime govori, je razred koji čita digitalne certifikate iz datoteka sa tvrdog diska, te ih sprema u repozitorij u memoriji računala. Razred sadrži jedan javno dostupan konstruktor koji prima putanju do direktorija gdje se nalaze digitalni certifikati. Konstruktor čita sve datoteke sa ekstenzijom "pem" (eng. Privacy-enhanced Electronic Mail) iz navedenog direktorija u nastojanju da stvori digitalne certifikate. Svi digitalni certifikati moraju biti u tipa X.509 u ASN.1 DER, PKCS#10 java.security.cert.CertStore kompatibilnom formatu zapisani u Base64 formatu. Jednom pročitani digitalni certifikati spremaju se u repozitorij tipa (poglavlje 4.1.2). Slika 5.19 prikazuje izvorni tekst programa konstruktora.


public DatotecniDohvatacCertifikata(String dir)
throws InvalidAlgorithmParameterException,
NoSuchAlgorithmException,CertificateException,
FileNotFoundException, IOException
{
this.dir = new File(dir);
String [] lista = this.dir.list(newFilterDir("pem"));
//stvaranje digitalnih X.509 certifikata
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate CER;
BufferedInputStream bis;
Vector vektor = new Vector(10,10);
//stvaranje niza digitalnih certifikata
for(int i=0;i<lista.length;i++) {
bis = new BufferedInputStream(new
FileInputStream(dir+"/"+lista[i]));
CER = cf.generateCertificate(bis);
bis.close();
vektor.add(CER);
}
//generiranje repozitorija na temelju pročitanih digitalnih
//certifikata
repozitorijCER = CertStore.getInstance("Collection",
new CollectionCertStoreParameters(vektor));
}
Slika 5.19. Metoda konstruktor razreda DatotecniDohvatacCertifikata


Razred implementira dvije metode definirane sučeljem
DohvatacCertifikata: dohvatiCertifikate i dohvatiProvjereneCertifikate. Funkcionalnost metoda je objašnjena u predhodnom poglavlju. Slike 5.20 i 5.21 prikazuju izvorni tekst programa metoda.


public Collection dohvatiCertifikate(CertSelector uvjet)
throwsCertStoreException
{
//dohvati digitalne certifikate koji zadovoljavaju uvjet
return repozitorijCER.getCertificates(uvjet);
}
Slika 5.20. Metoda dohvatiCertifikate


public Collection dohvatiProvjereneCertifikate (CertSelector uvjet, PublicKey javniKljuc)
throws CertStoreException
{

//dohvati digitalne certifikate koji zadovoljavaju uvjet
Collection cers = repozitorijCER.getCertificates(uvjet);
Iterator i = cers.iterator();
Certificate cer;
Vector v = new Vector(cers.size());
//iteracija po digitalnim certifikatima
while(i.hasNext()) {
cer = (Certificate)i.next();
try {
//provjera potpisa
cer.verify(javniKljuc);
//provjera da li je certifikat važeći
((X509Certificate)cer).checkValidity();
//dodavanje u listu
v.add(cer);
}
catch(Exception e) {
}
}
//vraćanje liste digitalnih certifikata
return v;
}
Slika 5.21. Metoda dohvatiProvjereneCertifikate


6. Zaključak


Ovaj diplomski rad pokazuje kako su Java i Java Card platforme pogodne za implementaciju raznih i sigurnih kartičnih sustava.

Jedan od većih problema implementacije ovog sigurnosnog modula bilo je usklađivanje kriptografskih algoritama između terminala i kartice. Terminal s jedne strane koristi Java RE koji inicijalno ne dolazi s potpunom kriptografskom podrškom zbog izvoznih pravila SAD-a pa je potrebno nabaviti dodatne module koji će se koristiti pri razvitku ovog sigurnosnog modula. Korištene kartice (Axalto Cyberflex Access 64K) s druge strane implementiraju samo podskup sigurnosnih mehanizama definiranih Java Card platformom 2.1.1 što dodatno otežava usklađivanje sigurnosnih mehanizama kartice i terminala.

Najveći problem implementacije ovog sigurnosnog modula bilo je korištenje, inače zahtjevnih, sigurnosnih mehanizama na vrlo ograničenoj platformi kao što je Java Card. Upotreba kriptografskih mehanizama uzrokovala je potrebu prijenosa velike količine podataka što se pokazalo kao velik problem i drastično usporilo komunikaciju terminala s karticom.

Kako raste tržište pametnih kartica tako će se poboljšavati svojstva čipova koji se ugrađuju u pametne kartice te je za očekivati da će u bliskoj budućnosti pametne kartice imati jednako brze procesore kao današnja slabija ručna računala (PDA - engl. Personal Digital Assistant), a da će se kartični protokoli adekvatno modificirati da omoguće brži prijenos većih količina podatka.



7. Literatura


  1. JavaTM 2 SDK, Standard Edition Documentation, version 1.4.2, 1.4.1

  2. “JavaTM 2 Platform, Standard Edition, v 1.4.2 API Specification”, “Java 2 Platform, Standard Edition, v 1.4.2 Software Development Kit (SDK)”, dostupno na Internet adresi: http://java.sun.com/j2se/1.4.2/download.html

  3. “ JavaTM Cryptography Extension Reference Guide for the JavaTM 2 SDK, Standard Edition, v 1.4”, “Java 2 Platform, Standard Edition, v 1.4.2 SDK”

  4. Java Card™ 2.1.1 Application Programming Interface

  5. “ISO/IEC 7816 Part 4: Interindustry command for interchange”, http://www.ttfn.net/techno/smartcards/iso7816_4.html

  6. A. Galinović, Pametna turistička kartica, Seminarski rad, Fakultet elektrotehnike i računarstva, Zagreb, 2004. http://sigurnost.zemris.fer.hr/pk/2004_galinovic/index.html

  7. L. Budin, Operacijski sustavi II, predavanja iz predmeta Operacijski sustavi, pp 11.8, 2003./2004.



Dodatak: Kazalo pojmova i korištenih kratica


2'k - broj prikazan u dvojnom komplementu

A-PZI - Applet Pametne Zdravstvene Iskaznice

AES - Advanced Encription Standard, tj. Rijndael

AID - Application Identifier

API - Application Programming Interface

APDU - Application Protocol Data Unit

ASN.1 - Abstract Syntax Notation One

bit - Binary Digit

CA - Certificate Authority

CAD - Card Acceptance Device

CBC - Cipher Block Chaining

CEI - Commission Electrotechnique Internationale

CFB - Cipher Feedback Mode

CRL - Certificate Revocation Lists

CSR - Certificate Signing Request

DER - Distinguished Encoding Rules

DES - Data Encription Standard

DES3 - Triple DES

DESede - Triple DES EDE

DFA - Differential Fault Analysis

DPA - Differential Power Analysis

DSA - Digital Signature Algorithm

ECB - Electronic Codebook

EDE - Encrypt Decrypt Encrypt

EEPROM - Electronically Erasable Programmable ROM

EMV'96 - Europay MasterCard VISA

FIPS - Federal Information Processing Standards

FTP - File Transfer Protocol

GSM - Global System for Mobile Communications

GUI - Graphical User Interface

HMAC - Keyed-Hash MAC

HTTP - Hypertext Transfer Protocol

IEEE - Institute of Electrical and Electronics Engineers

IEC - International Electrotechnical Commission

ISO - International Standardization Organization

JAR - Java Archive

JASS - Java Authentication and Authorization Service

Java Byte kôd - sklopovski neovisan međukôd specifičan za Javu

Java RE - Java Runtime Environment

Java SDK - Java Software Development Kit

JCA - Java Cryptography Architecture

JCAPI - Java Card API

JCE - JavaTM Cryptography Extension

JCRE - Java Card Runtime Environment

JCVM - Java Card Virtual Machine

JDK - Java Development Kit

JGSS - Java Generic Security Services

JKS - Java Key Store, Sun-ovo ostvarenje repozitorija ključeva

JSSE - Java Secure Socket Extension

JVM - Java Virtual Machine

KiB - Kibi Byte, 1024 okteta, prema CEI/IEC 60027-2, siječanj 1999.

LDAP - Lightweight Directory Access Protocol

MAC - Message Authentication Code

MD2 - Message Digest 2

MD5 - Message Digest 5

MP3 - MPEG 1 sloj 3

MPEG - Moving Picture Experts Group

NIST - National Institute of Standards and Technology

OAEP - Optimal Asymmetric Encryption Padding

OFB - Output Feedback Mode

OFB - Output Feedback Mode

PBE - Password-Based Encryption

PCBC - Propagating Cipher Block Chaining

PDA - Personal Digital Assistant

PEM - Privacy-enhanced Electronic Mail

PIN - Personal Identification Number

PKCS - Public-Key Cryptography Standards

PKCS#1 - RSA Cryptography Standard

PKCS#3 - Diffie-Hellman Key Agreement Standard

PKCS#5 - Password-Based Cryptography Standard

PKCS#8 - Private-Key Information Syntax Standard

PKCS#10 - Certification Request Syntax Standard

PKCS#12 - Personal Information Exchange Syntax Standard

PKIX - Public-Key Infrastructure X.509 group

PZI - Pametna Zdravstvena Iskaznica

RACE - Research and Development in Advanced Communications Technologies in Europe

RAM - Random Access Memory

RC2 - Rivest Cipher 2 ili alternativno Ron's Code 2

RC4 - Rivest Cipher 4 ili alternativno Ron's Code 4

RC5 - Rivest Cipher 5 ili alternativno Ron's Code 5

RFC - Request for Comments

RFU - Reserved for Future Use

RIPEMD - RACE Integrity Primitives Evaluation Message Digest

ROM - Read Only Memory

RSA - Rivest, Shamir, Adleman

SAD - Sjedinjene Američke Države

SDK - Software Development Kit

SIM - Subscriber Identity Module

SHA - Secure Hash Algorithm

SPI - Service Provider Interface

SSL - Secure Sockets Layer

SunJCE - Sun's Java Cryptography Extension

T-PZI - Terminal Pametne Zdravstvene Iskaznice

TCP - Transmission Control Protocol

TLS - Transport Layer Security

UML - Unified Modeling Language


Program


  1. izvorni tekst terminala pametne zdravstvene iskaznice

  2. izvorni tekst appleta pametne zdravstvene iskaznice

  3. aplikacija terminala pametne zdravstvene iskaznice

  4. API dokumentacija