Capire Java Card 2.0

Questo articolo inizia con una panoramica delle smart card e una breve rassegna di ISO 7816, lo standard delle smart card. Dato il background sulle smart card nelle precedenti colonne di Java Developer , questa puntata inizierà con una risposta alla domanda "Che cos'è una Java Card?" e una panoramica dell'architettura del sistema Java Card. Successivamente, ci concentreremo sui molti problemi specifici della Java Card, incluso il ciclo di vita della Java Card; il sottoinsieme del linguaggio Java Card 2.0 e le classi della libreria API; e sicurezza Java Card. Quindi discuteremo l'ambiente di runtime Java Card e mostreremo come viene eseguita una Java Card. Concluderemo con un esempio illuminante: un'applicazione di portafoglio elettronico scritta solo per la Java Card.

Da qui in poi, tutti i riferimenti a Java Card si riferiscono implicitamente alla Java Card 2.0.

Cos'è una smart card?

Identica alle dimensioni di una carta di credito, una smart card memorizza ed elabora le informazioni attraverso i circuiti elettronici incorporati nel silicio nel substrato di plastica del suo corpo. Esistono due tipi fondamentali di smart card: una smart card intelligente contiene un microprocessore e offre capacità di lettura, scrittura e calcolo, come un piccolo microcomputer. Una scheda di memoria , invece, non ha un microprocessore ed è destinata solo alla memorizzazione delle informazioni. Una scheda di memoria utilizza la logica di sicurezza per controllare l'accesso alla memoria.

Tutte le smart card contengono tre tipi di memoria: memoria persistente non modificabile; memoria mutevole persistente; e memoria mutabile non persistente. ROM, EEPROM e RAM sono le memorie più utilizzate per i tre rispettivi tipi nelle attuali smart card. La memoria persistente è anche chiamata memoria non volatile. Useremo i termini persistente e non volatile in modo intercambiabile in questo articolo.

ISO 7816 parte 1-7, definito dall'International Standard Organization, contiene una serie di standard che copre vari aspetti delle smart card. ISO 7816 è costituito da:

  • Caratteristiche fisiche (parte 1)

  • Dimensioni e posizione dei contatti (parte 2)

  • Segnali elettronici e protocolli di trasmissione (parte 3)

  • Comandi intersettoriali per l'interscambio (parte 4)

  • Identificatori dell'applicazione (Parte 5)

  • Elementi di dati intersettoriali (Parte 6)

  • Comandi intersettoriali per SCQL (parte 7)

Il diagramma seguente illustra le caratteristiche fisiche di una smart card, definite nella ISO 7816, parte 1.

Per ulteriori informazioni su ISO 7816 e smart card, vedere "Smart card: una guida introduttiva".

Normalmente, una smart card non contiene un alimentatore, un display o una tastiera. Interagisce con il mondo esterno utilizzando l'interfaccia di comunicazione seriale tramite i suoi otto punti di contatto. Le dimensioni e la posizione dei contatti sono trattate nella parte 2 di ISO 7816. Questo diagramma mostra i contatti su una smart card.

Una smart card viene inserita in un dispositivo CAD (Card Acceptance Device), che può connettersi a un altro computer. Altri termini utilizzati per il dispositivo di accettazione della carta sono terminale , lettore e IFD (dispositivo di interfaccia). Forniscono tutte le stesse funzioni di base, vale a dire alimentare la scheda e stabilire una connessione per il trasporto dei dati.

Quando due computer comunicano tra loro, si scambiano pacchetti di dati, che vengono costruiti seguendo una serie di protocolli. Allo stesso modo, le smart card parlano al mondo esterno utilizzando i propri pacchetti di dati, chiamati APDU (Application Protocol Data Units). APDU contiene un comando o un messaggio di risposta. Nel mondo delle carte, viene utilizzato il modello master-slave in cui una smart card gioca sempre il ruolo passivo. In altre parole, una smart card attende sempre un comando APDU da un terminale. Quindi esegue l'azione specificata nell'APDU e risponde al terminale con una risposta APDU. Gli APDU di comando e gli APDU di risposta vengono scambiati alternativamente tra una scheda e un terminale.

Le seguenti tabelle illustrano rispettivamente i formati APDU di comando e risposta. La struttura APDU è descritta nella ISO 7816, parte 4.

Comando APDU
Intestazione obbligatoria Corpo condizionale
CLA INS P1 P2 Lc Campo dati Le

L'intestazione codifica il comando selezionato. Consiste di quattro campi: classe (CLA), istruzione (INS) e parametri 1 e 2 (P1 e P2). Ogni campo contiene 1 byte:

  • CLA: byte di classe. In molte smart card, questo byte viene utilizzato per identificare un'applicazione.

  • INS: byte di istruzione. Questo byte indica il codice dell'istruzione.

  • P1-P2: byte di parametri. Questi forniscono ulteriori qualifiche al comando APDU.

Lc indica il numero di byte nel campo dati del comando APDU; Le indica il numero massimo di byte attesi nel campo dati della seguente risposta APDU.

Risposta APDU
Corpo condizionale Trailer obbligatorio
Campo dati SW1 SW2

I byte di stato SW1 e SW2 indicano lo stato di elaborazione del comando APDU in una scheda.

Cos'è una Java Card?

Una Java Card è una smart card in grado di eseguire programmi Java. La specifica Java Card 2.0 è stata pubblicata su //www.javasoft.com/javacard. Contiene informazioni dettagliate per la creazione della macchina virtuale Java Card e dell'interfaccia di programmazione dell'applicazione (API) nelle smart card. Il requisito minimo di sistema è 16 kilobyte di memoria di sola lettura (ROM), 8 kilobyte di EEPROM e 256 byte di memoria ad accesso casuale (RAM).

L'architettura del sistema sulla Java Card è illustrata nella figura seguente.

Come mostrato nella figura, la Java Card VM è costruita su uno specifico circuito integrato (IC) e un'implementazione del sistema operativo nativo. Il livello JVM nasconde la tecnologia proprietaria del produttore con un linguaggio e un'interfaccia di sistema comuni. Il framework Java Card definisce una serie di classi API (Application Programming Interface) per lo sviluppo di applicazioni Java Card e per fornire servizi di sistema a tali applicazioni. Un'industria o un'azienda specifica può fornire librerie aggiuntive per fornire un servizio o per perfezionare la sicurezza e il modello di sistema. Le applicazioni Java Card sono chiamate applet . Più applet possono risiedere su una scheda. Ogni applet è identificata in modo univoco dal suo AID (identificatore dell'applicazione), come definito nella ISO 7816, parte 5.

Un punto importante da tenere a mente è cosa non sono le smart card : non sono personal computer. Hanno risorse di memoria e potenza di calcolo limitate. Gli utenti non dovrebbero pensare a Java Card 2.0 semplicemente come una versione ridotta del JDK.

La durata di una Java Card

La durata della Java Card inizia quando il sistema operativo nativo, la Java Card VM, le librerie di classi API e, facoltativamente, le applet vengono masterizzate nella ROM. Questo processo di scrittura dei componenti permanenti nella memoria non mutabile di un chip per eseguire i comandi in arrivo è chiamato mascheramento .

Prima che arrivi nel tuo portafoglio, una Java Card deve essere inizializzata e personalizzata. L'inizializzazione si riferisce al caricamento di dati generali nella memoria non volatile di una scheda. Questi dati sono identici per un gran numero di carte e non sono specifici per un individuo; un esempio potrebbe essere il nome dell'emittente o del produttore.

Il passaggio successivo, la personalizzazione, prevede l'assegnazione di una carta a una persona. Può avvenire tramite personalizzazione fisica o personalizzazione elettronica. La personalizzazione fisica si riferisce alla goffratura o all'incisione laser del proprio nome e numero di carta sulla superficie di plastica di una carta. La personalizzazione elettronica si riferisce al caricamento dei dati personali nella memoria non volatile di una scheda, ad esempio la chiave personale, il nome e il numero pin.

L'inizializzazione e la personalizzazione variano da fornitore a fornitore e da emittente a emittente. In entrambi, EEPROM (un tipo di memoria non volatile) viene spesso utilizzata per la memorizzazione dei dati.

A questo punto, la Java Card è pronta per l'uso. Puoi ottenere una Java Card da un emittente o acquistarla da un rivenditore. Le carte vendute da un rivenditore sono generiche, nel qual caso la personalizzazione viene spesso omessa.

Ora puoi inserire la tua Java Card in un lettore e inviare comandi APDU alle applet che risiedono sulla scheda o scaricare più applet o dati sulla scheda.

Una Java Card rimane attiva fino a quando non è scaduta o bloccata a causa di un errore irreversibile.

Durata di una macchina virtuale Java Card

A differenza della macchina virtuale Java (JVM) in un PC o in una workstation, la macchina virtuale Java Card viene eseguita per sempre.

La maggior parte delle informazioni memorizzate sulla carta devono essere conservate anche quando l'alimentazione viene rimossa, ovvero quando la carta viene rimossa dal lettore. La Java Card VM crea oggetti in EEPROM per contenere le informazioni persistenti. La durata di esecuzione della Java Card VM è la durata della scheda. Quando l'alimentazione non viene fornita, la VM viene eseguita in un ciclo di clock infinito.

La durata di applet e oggetti Java Card

La vita di un'applet inizia quando è correttamente installata e registrata nella tabella del registro di sistema e termina quando viene rimossa dalla tabella. Lo spazio di un'applet rimossa può essere riutilizzato o meno, tuttavia, a seconda che la raccolta dei rifiuti sia implementata sulla scheda. Un applet su una carta è in una fase inattiva fino a quando non viene esplicitamente selezionato dal terminale.

Gli oggetti vengono creati nella memoria persistente (ad esempio, EEPROM). Potrebbero essere persi o raccolti in modo indesiderato se altri oggetti persistenti non li fanno riferimento. Tuttavia, è mille volte più lento scrivere su EEPROM che su RAM.

Ad alcuni oggetti si accede frequentemente e il contenuto dei loro campi non deve essere persistente. Il Java Card supporti transitoria (temporanea) oggetti in RAM. Una volta che un oggetto è stato dichiarato transitorio, il suo contenuto non può essere spostato nuovamente nella memoria persistente.

Sottoinsieme del linguaggio Java Card 2.0

I programmi Java Card sono, ovviamente, scritti in Java. Vengono compilati utilizzando comuni compilatori Java. A causa delle risorse di memoria e della potenza di calcolo limitate, non tutte le funzioni del linguaggio definite nella specifica del linguaggio Java sono supportate sulla Java Card. Nello specifico, la Java Card non supporta:

  • Caricamento dinamico della classe

  • Manager della sicurezza

  • Thread e sincronizzazione

  • Clonazione di oggetti

  • Finalizzazione

  • Tipi di dati primitivi grandi (float, double, long e char)

Non sorprende che anche le parole chiave che supportano queste funzionalità vengano omesse dalla lingua. Gli implementatori di VM possono decidere di supportare il tipo intero a 32 bit o metodi nativi per le applet successive all'emissione se stanno lavorando su una smart card più avanzata con più memoria. Le applet successive all'emissione sono quelle applet installate su una Java Card dopo che la carta è stata rilasciata al titolare della carta.

Il framework Java Card 2.0

Le smart card sono sul mercato da 20 anni e la maggior parte di esse sono generalmente compatibili con ISO 7816 Parti 1-7 e / o EMV. Abbiamo già esaminato ISO 7816. Cos'è l'EMV? Lo standard EMV, definito da Europay, MasterCard e Visa, si basa sulla serie di standard ISO 7816 con caratteristiche proprietarie aggiuntive per soddisfare le esigenze specifiche del settore finanziario. Java Card Framework è progettato per supportare facilmente sistemi e applicazioni con smart card. Nasconde i dettagli dell'infrastruttura della smart card e fornisce agli sviluppatori di applicazioni Java Card un'interfaccia di programmazione relativamente semplice e diretta.

Il framework Java Card contiene quattro pacchetti:

Nome del pacchetto Descrizione
javacard.framework Questo è il pacchetto principale sulla carta. Definisce classi come e , che sono gli elementi costitutivi fondamentali per i programmi Java Card e , e , che forniscono runtime e servizi di sistema ai programmi Java Card, come la gestione APDU e la condivisione di oggetti
javacardx.framework Questo pacchetto fornisce un design orientato agli oggetti per un file system compatibile con ISO 7816-4. Supporta file elementari (EF), file dedicati (DF) e APDU orientati ai file come specificato in ISO7816
javacardx.crypto e javacardx.cryptoEnc Questi due pacchetti supportano la funzionalità crittografica richiesta nelle smart card

Conformemente alla convenzione di denominazione Java, i pacchetti Java Cardx sono estensioni del framework Java Card. Non è necessario che tu li supporti sulla carta.

Sicurezza della Java Card

Le applet Java sono soggette a limitazioni di sicurezza Java, tuttavia il modello di sicurezza dei sistemi Java Card differisce da Java standard in molti modi.

La classe Security Manager non è supportata su Java Card. Le politiche di sicurezza della lingua vengono implementate dalla macchina virtuale.

Le applet Java creano oggetti che archiviano e manipolano i dati. Un oggetto è di proprietà dell'applet che lo crea. Anche se un'applet può avere il riferimento a un oggetto, non può richiamare i metodi dell'oggetto, a meno che non possieda l'oggetto o l'oggetto non sia esplicitamente condiviso. Un'applet può condividere uno qualsiasi dei suoi oggetti con una particolare applet o con tutte le applet.

Un'applet è un'entità indipendente all'interno di una Java Card. La sua selezione, esecuzione e funzionalità non sono influenzate da altre applet che risiedono sulla stessa scheda.

Come le cose funzionano insieme all'interno di una Java Card

All'interno di una Java Card, JCRE (Java Card Runtime Environment) si riferisce alla macchina virtuale Java Card e alle classi in Java Card Framework. Ogni applet all'interno di una Java Card è associata a un AID univoco assegnato da JCRE.

Dopo che un'applet è stata caricata correttamente nella memoria persistente della scheda e collegata a Java Card Framework e ad altre librerie sulla scheda, JCRE chiama il metodo di installazione dell'applet come ultimo passaggio del processo di installazione dell'applet. Un metodo statico pubblico install,, deve essere implementato da una classe applet per creare un'istanza dell'applet e registrarla con JCRE. Poiché la memoria è limitata, è una buona pratica di programmazione, a questo punto, creare e inizializzare gli oggetti di cui l'applet avrà bisogno durante la sua vita.