MokaByte
Numero 28 - Marzo 1999
|
|||
|
|
||
Francesco Ancona |
|||
Presentato allo scorso JavaOne di S.Francisco, il Java Ring non è solo una esercitazione di stile o prova di fattiblità, ma già perfettamente funzionate, rappresenta la base per lo sviluppo di quegli accessori di cui non potremo fare a meno nel prossimo futuro. |
Introduzione
Ormai e' una
constatazione: il digitale con tutte le sue innovazioni sta penetrando
in tutte le nostre vite e i nostri costumi. Provate solo a pensare a quante
volte in un giorno utilizziamo un telefonino, il bancomat, la carta di
credito, compact disc, e questo senza coinvolgere dispositivi prettamente
informatici. Sotto la spinta di Internet, di Java (e di grandi compagnie
quali Oracle, Sun) c'e' il tentativo di globalizzare, coinvolgere e far
dialogare tutto questi dipositivi digitali. In un contesto del genere si
puo' intuire qual'e' uno dei grandi problemi connessi: la sicurezza.
Scopo dell'applicazione
Strutturalmente
il JavaRing o iButton e' stato costruito pensando di mantenere alta la
riservatezza dei dati memorizzati al proprio interno e di poter velocemente
risalire all'identita' del possessore del Ring.
In pratica, settato il PIN, per accedere alle chiavi di accesso memorizzate bisogna sapere qualcosa (PIN) e portare qualcosa (RING). Questo consente all'utente di utilizzare le chiavi di accesso in maniera trasparente delegando all'applicativo la gestione di tutte le eventuali password che usa nella vita quotidiana. Avendo come linea guida questa possibilita' ci si puo' sbizzarrire nel trovare delle applicazioni che coinvolgano un qualunque tipo di accesso; addirittura si puo'pensare l'iButton come chiave per una porta o per l'accensione dell'automobile (da notare che applicazioni di quest genere esistono già). Una volta che il Ring ha scaricato le chiavi sull' host quest'ultimo con un database interno o simile, verifica le password e consente l'accesso. Si potrebbero anche ipotizzare delle applicazioni che utilizzando le chiavi dal JavaRing si connettono a host remoti o a server protetti, il tutto, e lo ripeto, in maniera trasparente all'utente. Codice Ogni applicazione
con il javaRing deve almeno avere 2 parti: la prima, che gestisce i dati,
nel Ring, la seconda, che interagisce con l'utente, sull'host system.
Applet inserito nel javaring Gli applet dentro
i Ring non iniziano con init() ma in questo caso l'inizializzazione e'
divisa in 2 fasi:
loginApp() { register(); data_log_in = new byte[0]; login = new byte[0]; password = new byte[0]; } public static void install(APDU apdu){ new loginApp(); } 2- attivazione durante la comunicazionepublic void process(APDU apdu) throws ISOException { [..]switch (buffer[ISO.OFFSET_INS]){default:// Don't know what to do with this instructionthrow new ISOException(ISO.SW_INS_NOT_SUPPORTED);case LAST_LOG_IN_STORE:loginAppStore(apdu);break;case LAST_LOG_IN_RETRIEVE:loginAppRetrieve(apdu);break;case LOG_PASWD_STORE:passwdAppStore(apdu);break;case LOG_PASWD_RETRIEVE:passwdAppRetrieve(apdu);break;}} protected void loginAppRetrieve(APDU apdu){ temp = new byte[6+data_log_in.length]; int i=0; int j=0; for (i=0;i<data_log_in.length;i++) {temp[j]=data_log_in[i]; j++;} if (temp != null){ //questa e' la normale sequenza di ritorno dei pacchetti //setta il modo per spedire i dati apdu.setOutgoing(); //setta la lunghezza apdu.setOutgoingLength((short)temp.length); //setta i dati, indice inizio , e fine offset apdu.sendBytesLong(temp, (short) 0, (short) temp.length); } }NOTE: queste sono le variabili (sono uguali anche sull'host) final static byte LOGIN_CLA = (byte) 0x80; final static byte LAST_LOG_IN_STORE = (byte) 0x10; final static byte LAST_LOG_IN_RETRIEVE = (byte) 0x20; final static byte LOG_PASWD_STORE = (byte) 0x30; final static byte LOG_PASWD_RETRIEVE = (byte) 0x40; final static byte SELECT_LOGIN_CLA = 0x01; final static byte SELECT_LOGIN_INS = (byte) 0xA5; //parametri per gli inserimenti final static byte BC_P1_SET_LENGTH = 0x01; final static byte BC_P1_NEXT_PACKET = 0x02; final static byte BC_P1_LAST_PACKET = 0x03; final static short SW_BAD_INS_SEQUENCE = (short) 0x9101; byte[] data_log_in; byte[] login; byte[] password; short offset; int totalLength; byte[] temp;
Applet (o applicazione) caricato da un browser Attraverso vari
tipi interfacce e strati sw sia opensource che specifici del costruttore
dell' iButton, l'applet nel browser "sente" il ring, nel senso che si accorge
se il JavaRing e' collegato o meno alla seriale, permettendo all'utente
di interagire con esso naturalmente anche attraverso l'implementazione
di una GUI.
//sente che l'anello e' inserito public void cardInserted(CardTerminalEvent event){ System.out.println("Java iButton inserted"); blueDot = event.getSlot(); channel = blueDot.getCardTerminal().openSlotChannel(blueDot); terminal = (iButtonCardTerminal)channel.getCardTerminal(); iButtonInserted = true; //qui si attuano le chiamate per il Ring [..] } //sente che l'anello e' stato rimosso public void cardRemoved(CardTerminalEvent event){ System.out.println("Java iButton removed"); blueDot = event.getSlot(); if (blueDot.getSlotID() != 0) return; iButtonInserted = false; blueDot = null; terminal = null;} Secondo aspetto quello relativo alla registrazione //registra l'anello e setta le seriali che utilizza protected void startPolling(String nativeDevString) { try { SmartCard.start(); CardTerminalRegistry registry = CardTerminalRegistry.getRegistry(); registry.addCTListener(this); } catch (Exception e){ e.printStackTrace(); } }Infine la lettura public void read() throws loginException { byte[] buffer = new byte[0]; try{ //costruisce il comandAPDU cie' il contenitore per dati e parametri CommandAPDU businessCardAPDU = new CommandAPDU((byte)LOGIN_CLA, (byte) LAST_LOG_IN_RETRIEVE, (byte)0, (byte)0, buffer, (byte)0); //cattura il response APDU l'oggetto al cui // interno vi sono i dati letti ResponseAPDU response = channel.sendAPDU(businessCardAPDU); //ba[] rappresenta i dati byte[] ba=response.data(); [...] } catch (CardTerminalException e) { System.out.println("non riesco a comunicare con la card"+e.statusWord()); } }Alcune considerazioni sugli strati SW utilizzati Come si puo' valutare dagli import immessi nel codice Java implementato, tutte le API provengono da 3 pacchetti:
|
|
|
||
MokaByte ricerca
nuovi collaboratori.
|
||
|