Skip to content
Goran Rakic edited this page Nov 5, 2015 · 41 revisions

 


Kod u skladištu je podeljen na JFreesteel biblioteku (u direktorijumu /jfreesteel) i GUI aplikaciju eIdViewer koja koristi biblioteku (u direktorijumu /eidviewer). Tu je i Java aplet koji omogućava čitanje lične karte iz JavaScripta (u direktorijumu /eidapplet). Biblioteka i aplet su objavljeni pod GNU LGPLv3 slobodnom licencom. Aplikacija je objavljena pod GNU Affero GPLv3 licencom pošto koristi iText biblioteku za izradu PDF izveštaja.

Za kontakt u vezi komercijalne podrške posetite DEVBASE IT KONSALTING.



Zakpre možete poslati na e-adresu grakic@devbase.net ili kao pull request kroz GitHub. Pogledajte stranice GitWorkflow i CodeStyle. Kopiju koda pravite naredbom:

git clone git://github.com/grakic/jfreesteel.git

Projekat koristi Maven.

U korenskoj fascikli definisan je meta-projekat jfreesteel-project, biblioteka se nalazi u jfreesteel, a aplikacija i aplet u svojim nezavisnim projektima.

Za više detalja o kodu pogledajte stranicu CodeReview, a korisni će biti i slajdovi sa prezentacije JFreesteel - čitanje elektronske lične karte u Javi.

Kratko uputstvo na engleskom o korišćenju API-a se nalazi u README datoteci.

 

Veb sajt

Na adresi: http://jfreesteel.devbase.net

 

Napomena o sigurnosti

Aplikacija i biblioteka čitaju samo javno dostupne podatke tako da ne mogu zaključati ili na drugi način oštetiti ličnu kartu. Ova tvrdja je data u dobroj nameri, ali je ograničena nepostojanjem bilo kakve garancije na rad programa i biblioteke kako je već navedeno u GNU LGPLv3 i GNU AGPLv3 licencama.

Čitanje lične karte ne treba da bude sredstvo autentifikacije, zlonamerni korisnik može da priredi i pošalje proizvoljne podatke aplikaciji, da koristi virtuelni PC/SC terminal ili da podatke upiše u praznu pametnu karticu. U svakom slučaju čitanje lične karte, kako je implementirano u biblioteci, je sasvim pogodno za unos podataka, kada treba brzo i zgodno preneti podatke iz lične karte u neku aplikaciju.

Integritet očitanih podataka moguće je proveriti proverom elektronskog potpisa podataka koji se takođe nalazi na ličnoj karti. Zvanična aplikacija Čelik+ omogućava ovu funkciju ali ona nije implementirana u JFreesteel biblioteci. Ovo se nalazi u spisku ideja za budući razvoj i bilo bi lepo kada bi bilo podržano u biblioteci. Čak i sa proverom integriteta očitavanje ne bi bilo pouzdano sredstvo autentikacije.

Autentikacija korisnika može da se obavi pomoću para ključeva i nekvalifikovanog elektronskog sertifikata za autentikaciju koji se nalazi na ličnoj karti (tzv. prijava klijentskim sertifikatom). Postoji problem da se kod ličnih karata sa Apollo OS-om privatni ključ koji odgovara nekvalifikovanom sertifikatu može iskopirati van kartice. To je relativno mali rizik, ali treba ga biti svestan.

Privatni ključ iz para ključeva koji odgovara kvalifikovanom elektronskom sertifikatu za elektronski potpis je bezbedno upisan na karticu, ali prema standardima njega ne treba koristiti za autentikaciju jer se tako korisnik može navesti da elektronski potpiše neki dokument mimo svoje namere.

 

Ideje za dalji razvoj

Ako želite da pripomognete razvoj, evo nekih ideja:
  • Issue #1 Pronaći gde se čuva elektronski potpis podataka na ličnoj karti (verovatno PKCS7 format) i implementirati kontrolu tog potpisa iz biblioteke i aplikacije. Commons eID - BeIDIntegrity ima i poseban API u kome čita podatke sa proverom, što je zanimljiv uz funkcije koje bi radile samo proveru.
  • Dokumentovati nepoznate tagove 0x628 i 0x629 u strukturi adrese prebivališta, ako se oni uopšte koriste. Ako imate ove podatke zapisane u ličnoj karti pošaljite dopunu ili samo opišite gde je šta.
  • Zameniti upotrebu iTexta sa Apache PDFBox bibliotekom u aplikaciji kako bi ceo projekat mogao da bude objavljen pod GNU LGPL licencom
  • Implementirati asinhroni neblokirajući interfejs za čitanje podataka čije naznake postoje u komentarisanom delu EidCard.java
  • Testirati i ispraviti greške u slučaju kada se biblioteka koristi sa više ReaderListenera istovremeno. Ovo će verovatno zahtevati refaktorisanje u jednu nit koja pristupa kartici (neki card transmit queue) i listenere kao klijente. To bi trebalo da spreči sve blokade iako se i sada koristi beginExclusive/endExclusive u kodu i omogući propisnu implementaciju neblokirajućeg interfejsa. Takođe ovo je bitno za mogućnost poziva čitanja iz Runnable callbackova kada se implementira GUI aplikacija.
  • Proveriti najbolji način za dodavanje palete alatki (engl. toolbar) u GUIPanel, za sada je to omogućeno nasleđivanjem panela i postavkom iz konstruktora. Primer postoji u EidViewerPanel konstrukturu u EidViewer.java
  • Završiti kod koji omogućava izvoz putanje X.509 sertifikata koji se nalazi u komentarisanom delu EidCard.java. Proveriti još jednom da li se MUPCARoot sertifikat nalazi negde na kartici. Videti najzgodniji način za lep prikaz sertifikata u viewer aplikaciji.
  • Omogućiti PAdES potpisivanje izveštaja na MS Windows kroz iText (korišćenjem zvaničnog CSP midlvera, za ostale sisteme trenutno nema rešenja). Potpisan izveštaj garantuje integritet, a korisnik samim potpisom potvrđuje autentičnost. Pri potpisu obavezan je prikaz podataka kako bi korisnik znao šta potpisuje.
  • Napisati kod za proveru da li je lična karta istekla, i proveru validnosti i da li su sertifikati opozvani
  • Dodati funkcionalnost očitavanja nepovratno nepovezujućeg jedinstvenog identifikatora zasnovanog na JMBG polju: HMAC-SHA1(APP_PREFIX, JMBG). Nepovratno nepovezujući jedinstveni identifikator može predstavljati zapis o građaninu unutar aplikacije, bez oktiravanja JMBG podatka.
  • Pouzdana provera godišta na vebu bez otkrivanja identiteta. Pouzdan servis koji očitava LK kroz aplet i proverom potpisa podataka sa LK utvrđuje da je validna. Iako teorijski može, ovaj servis ne očitava identitet, a pozivaocu servisa samo saopštava status provere.
  • Sastaviti dokumentaciju o biblioteci, popularisati slobodnu biblioteku pod GNU LGPLv3 u domaćoj Java zajednici
  • Napisati viki članak koji dokumentuje strukturu podataka na kartici
  • Ne bi bilo loše da podaci iz aplikacije mogu da se kopiraju; negde mi treba JMBG, pa da ga ne bih kucao selektujem JMBG iz GUIa i kopiram. Da iole znam programiranje, rado bih se uključio u projekta. -- Neky

 

 


Predlozi za druge eID projekte

  • Implementirati digital identity provider preko PKI infrastrukture (OpenID, ili neki drugi federation login servis)
  • Napisati programče za promenu PIN koda

    Beleška: Za promenu pina koriste se 0F 13, 0F A1 i 0F A3. VERIFY (0x00 0x20) instrukcija radi nad prvim ključem za poređenje. Kada se pozove bez podataka, vraća broj preostalih pokušaja. Kasnije u procesu promene šalje joj se neki niz od 8 bajtova (izgleda da ne zavisi od samog pina več od kartice, nije mi to baš najjasnije) nakon čega sledi UPDATE BINARY (0x00 0xD6) instrukcija koja ažurira 0F 13 nizom od 6 bajtova zaglavlja EF i 54 bajtova nekih podataka. Od tih 54 bajtova prvih 4 i poslednjih 5 je fiksno između različitih promena, a 45 nosi informaciju o izabranom pinu. Nema nikakve magije, nakon promene sadržaja, čitanje pročita upravo prethodno upisano. Deluje da je uvek dužina 45 bajtova i da ne zavisi od izabrane dužine pina ali treba to još jednom da proverim. Pogledaću u PKCS15 ima li šta zanimljivo na tu temu mada nisam siguran da je to pravo mesto za traženje informacija.

    Pretpostavljam da je ideja da se pročitaju neki ključevi iz 0F A1 (6+20 bajtova) i 0F A3 (6+14 bajtova), zatraže ovlašćenja sa VERIFY i tim nekim osmobajtnim nizom pa onda novi pin šifruje i zapakuje u niz koji se upiše nazad u 0F 13. Na kraju se bira MF (koreni direktorijum) verovatno kako bi se prekinula ovlašćenja ili resetovalo nešto slično.

  • Napisati Java Crypto Provider (kao u Commons eID) na nivou APDU funkcija sa PKI funkcijama kartice kao zamena za midlver. Za početak tu je http://code.google.com/p/rsidlib/.
  • Razviti slobodan midlver za GNU/Linux, moguće zasnovan na OpenSC
  • ...