Comprensión de Java Card 2.0

Este artículo comienza con una descripción general de las tarjetas inteligentes y una breve revisión de ISO 7816, el estándar de tarjetas inteligentes. Dado el trasfondo de las tarjetas inteligentes en las columnas anteriores de Java Developer , esta entrega comenzará con una respuesta a la pregunta "¿Qué es una Java Card?" y una descripción general de la arquitectura del sistema Java Card. A continuación, nos centraremos en los muchos problemas específicos de la Java Card, incluido el ciclo de vida de la Java Card; el subconjunto del lenguaje Java Card 2.0 y las clases de biblioteca API; y seguridad Java Card. Luego, discutiremos el entorno de ejecución de Java Card y mostraremos cómo se ejecuta una Java Card. Terminaremos con un ejemplo esclarecedor: una aplicación de billetera electrónica escrita solo para Java Card.

A partir de aquí, todas las referencias a Java Card se refieren implícitamente a Java Card 2.0.

¿Qué es una tarjeta inteligente?

Idéntica al tamaño de una tarjeta de crédito, una tarjeta inteligente almacena y procesa información a través de los circuitos electrónicos incrustados en silicio en el sustrato plástico de su cuerpo. Hay dos tipos básicos de tarjetas inteligentes: Una tarjeta inteligente inteligente contiene un microprocesador y ofrece capacidad de lectura, escritura y cálculo, como una pequeña microcomputadora. Una tarjeta de memoria , por otro lado, no tiene un microprocesador y está destinada únicamente al almacenamiento de información. Una tarjeta de memoria utiliza lógica de seguridad para controlar el acceso a la memoria.

Todas las tarjetas inteligentes contienen tres tipos de memoria: memoria persistente no mutable; memoria mutable persistente; y memoria mutable no persistente. ROM, EEPROM y RAM son las memorias más utilizadas para los tres tipos respectivos en las tarjetas inteligentes actuales. La memoria persistente también se llama memoria no volátil. Usaremos los términos persistente y no volátil indistintamente en este artículo.

ISO 7816 parte 1-7, definida por la Organización Internacional de Normalización, contiene un conjunto de normas que cubre varios aspectos de las tarjetas inteligentes. ISO 7816 consta de:

  • Características físicas (parte 1)

  • Dimensiones y ubicación de los contactos (parte 2)

  • Señales electrónicas y protocolos de transmisión (parte 3)

  • Comandos intersectoriales para el intercambio (parte 4)

  • Identificadores de aplicaciones (Parte 5)

  • Elementos de datos interindustriales (Parte 6)

  • Comandos entre industrias para SCQL (Parte 7)

El siguiente diagrama ilustra las características físicas de una tarjeta inteligente, que se definen en ISO 7816, parte 1.

Para obtener más información sobre ISO 7816 y tarjetas inteligentes, consulte "Tarjetas inteligentes: introducción".

Normalmente, una tarjeta inteligente no contiene una fuente de alimentación, una pantalla o un teclado. Interactúa con el mundo exterior utilizando la interfaz de comunicación en serie a través de sus ocho puntos de contacto. Las dimensiones y la ubicación de los contactos se tratan en la parte 2 de ISO 7816. Este diagrama muestra los contactos en una tarjeta inteligente.

Se inserta una tarjeta inteligente en un dispositivo de aceptación de tarjetas (CAD), que puede conectarse a otra computadora. Otros términos utilizados para el dispositivo de aceptación de tarjetas son terminal , lector e IFD (dispositivo de interfaz). Todos proporcionan las mismas funciones básicas, a saber, alimentar la tarjeta y establecer una conexión de transporte de datos.

Cuando dos computadoras se comunican entre sí, intercambian paquetes de datos, que se construyen siguiendo un conjunto de protocolos. De manera similar, las tarjetas inteligentes se comunican con el mundo exterior utilizando sus propios paquetes de datos, llamados APDU (Unidades de datos de protocolo de aplicación). APDU contiene un comando o un mensaje de respuesta. En el mundo de las tarjetas, se utiliza el modelo maestro-esclavo en el que una tarjeta inteligente siempre juega el papel pasivo. En otras palabras, una tarjeta inteligente siempre espera una APDU de comando desde un terminal. Luego ejecuta la acción especificada en la APDU y responde al terminal con una APDU de respuesta. Las APDU de comando y las APDU de respuesta se intercambian alternativamente entre una tarjeta y un terminal.

Las siguientes tablas ilustran los formatos de APDU de comando y respuesta, respectivamente. La estructura de la APDU se describe en ISO 7816, parte 4.

Mando APDU
Encabezado obligatorio Cuerpo condicional
CLA EN S P1 P2 Lc Campo de datos Le

El encabezado codifica el comando seleccionado. Consta de cuatro campos: clase (CLA), instrucción (INS) y parámetros 1 y 2 (P1 y P2). Cada campo contiene 1 byte:

  • CLA: Byte de clase. En muchas tarjetas inteligentes, este byte se utiliza para identificar una aplicación.

  • INS: Byte de instrucción. Este byte indica el código de instrucción.

  • P1-P2: Bytes de parámetro. Estos proporcionan una calificación adicional al comando APDU.

Lc denota el número de bytes en el campo de datos del comando APDU; Le denota el número máximo de bytes esperados en el campo de datos de la siguiente APDU de respuesta.

Respuesta APDU
Cuerpo condicional Tráiler obligatorio
Campo de datos SW1 SW2

Los bytes de estado SW1 y SW2 indican el estado de procesamiento del comando APDU en una tarjeta.

¿Qué es una tarjeta Java?

Una Java Card es una tarjeta inteligente que puede ejecutar programas Java. La especificación Java Card 2.0 se publicó en //www.javasoft.com/javacard. Contiene información detallada para construir la máquina virtual Java Card y la interfaz de programación de aplicaciones (API) en tarjetas inteligentes. El requisito mínimo del sistema es de 16 kilobytes de memoria de solo lectura (ROM), 8 kilobytes de EEPROM y 256 bytes de memoria de acceso aleatorio (RAM).

La arquitectura del sistema en la Java Card se ilustra en la siguiente figura.

Como se muestra en la figura, la Java Card VM está construida sobre un circuito integrado (IC) específico y la implementación del sistema operativo nativo. La capa JVM oculta la tecnología patentada del fabricante con un lenguaje y una interfaz de sistema comunes. El marco de Java Card define un conjunto de clases de interfaz de programación de aplicaciones (API) para desarrollar aplicaciones de Java Card y para proporcionar servicios del sistema a esas aplicaciones. Una industria o empresa específica puede proporcionar bibliotecas complementarias para proporcionar un servicio o para perfeccionar el modelo de seguridad y sistema. Las aplicaciones de Java Card se denominan subprogramas . Varios subprogramas pueden residir en una tarjeta. Cada subprograma se identifica de forma única por su AID (identificador de aplicación), como se define en ISO 7816, parte 5.

Un punto importante a tener en cuenta es lo que no son las tarjetas inteligentes : no son computadoras personales. Tienen recursos de memoria y potencia de cálculo limitados. Los usuarios no deben pensar en Java Card 2.0 como simplemente una versión simplificada del JDK.

La vida útil de una tarjeta Java

La vida útil de la Java Card comienza cuando el SO nativo, la Java Card VM, las bibliotecas de clases API y, opcionalmente, los subprogramas se graban en la ROM. Este proceso de escribir los componentes permanentes en la memoria no mutable de un chip para ejecutar comandos entrantes se llama enmascaramiento .

Antes de que llegue a su billetera, una tarjeta Java debe pasar por inicialización y personalización. La inicialización se refiere a cargar datos generales en la memoria no volátil de una tarjeta. Estos datos son idénticos en una gran cantidad de tarjetas y no son específicos de un individuo; un ejemplo podría ser el nombre del emisor o del fabricante.

El siguiente paso, la personalización, consiste en asignar una tarjeta a una persona. Puede ocurrir por personalización física o por personalización electrónica. La personalización física se refiere a grabar en relieve o con láser su nombre y número de tarjeta en la superficie de plástico de una tarjeta. La personalización electrónica se refiere a cargar datos personales en la memoria no volátil de una tarjeta, por ejemplo, su clave personal, nombre y número de PIN.

La inicialización y personalización varían de un proveedor a otro y de un emisor a otro. En ambos, EEPROM (un tipo de memoria no volátil) se usa a menudo para almacenar datos.

En este punto, la Java Card está lista para usarse. Puede obtener una Java Card de un emisor o comprarla en un minorista. Las tarjetas que vende un minorista son de uso general, en cuyo caso a menudo se omite la personalización.

Ahora puede insertar su Java Card en un lector y enviar comandos APDU a los applets que residen en la tarjeta o descargar más applets o datos en la tarjeta.

Una Java Card permanece activa hasta que caduca o se bloquea debido a un error irrecuperable.

Vida útil de una máquina virtual Java Card

A diferencia de la máquina virtual Java (JVM) en una PC o estación de trabajo, la máquina virtual Java Card funciona para siempre.

La mayor parte de la información almacenada en la tarjeta debe conservarse incluso cuando se desconecta la alimentación, es decir, cuando se retira la tarjeta del lector. La Java Card VM crea objetos en EEPROM para contener la información persistente. La vida útil de ejecución de la Java Card VM es la vida útil de la tarjeta. Cuando no se proporciona energía, la VM se ejecuta en un ciclo de reloj infinito.

La vida útil de los objetos y subprogramas de Java Card

La vida de un subprograma comienza cuando se instala y registra correctamente en la tabla de registro del sistema y finaliza cuando se elimina de la tabla. Sin embargo, el espacio de un subprograma eliminado puede o no reutilizarse, dependiendo de si la recolección de basura está implementada en la tarjeta. Un subprograma en una tarjeta está en una etapa inactiva hasta que el terminal lo selecciona explícitamente.

Los objetos se crean en la memoria persistente (por ejemplo, EEPROM). Se pueden perder o recolectar basura si otros objetos persistentes no hacen referencia a ellos. Sin embargo, es mil veces más lento escribir en EEPROM que en RAM.

Se accede con frecuencia a algunos objetos y no es necesario que el contenido de sus campos sea persistente. La Java Card admite objetos transitorios (temporales) en RAM. Una vez que un objeto ha sido declarado como transitorio, su contenido no se puede volver a mover a la memoria persistente.

Subconjunto de idiomas Java Card 2.0

Los programas de Java Card están, por supuesto, escritos en Java. Se compilan utilizando compiladores comunes de Java. Debido a los recursos de memoria y la potencia de cálculo limitados, no todas las características del lenguaje definidas en la Especificación del lenguaje Java son compatibles con la Tarjeta Java. Específicamente, la Java Card no admite:

  • Carga dinámica de clases

  • Gerente de seguridad

  • Hilos y sincronización

  • Clonación de objetos

  • Finalización

  • Grandes tipos de datos primitivos (float, double, long y char)

No es de extrañar que las palabras clave que admiten esas funciones también se omitan del idioma. Los implementadores de VM pueden decidir admitir métodos nativos o de tipo entero de 32 bits para subprogramas posteriores a la emisión si están trabajando en una tarjeta inteligente más avanzada con más memoria. Los subprogramas posteriores a la emisión son los subprogramas que se instalan en una tarjeta Java después de que la tarjeta se emite al titular de la tarjeta.

El marco de Java Card 2.0

Las tarjetas inteligentes llevan 20 años en el mercado y la mayoría de ellas son generalmente compatibles con ISO 7816 Partes 1-7 y / o EMV. Ya hemos examinado la norma ISO 7816. ¿Qué es EMV? El estándar EMV, definido por Europay, MasterCard y Visa, se basa en la serie de estándares ISO 7816 con características patentadas adicionales para satisfacer las necesidades específicas de la industria financiera. Java Card Framework está diseñado para admitir fácilmente sistemas y aplicaciones de tarjetas inteligentes. Oculta los detalles de la infraestructura de la tarjeta inteligente y proporciona a los desarrolladores de aplicaciones de Java Card una interfaz de programación relativamente fácil y directa.

El marco de Java Card contiene cuatro paquetes:

Nombre del paquete Descripción
javacard.framework Este es el paquete básico de la tarjeta. Define clases como y , que son los bloques de construcción fundamentales para los programas de Java Card y , y , que proporcionan tiempo de ejecución y servicio del sistema a los programas de Java Card, como el manejo de APDU y el intercambio de objetos.
javacardx.framework Este paquete proporciona un diseño orientado a objetos para un sistema de archivos compatible con ISO 7816-4. Admite archivos elementales (EF), archivos dedicados (DF) y APDU orientadas a archivos como se especifica en ISO7816
javacardx.crypto y javacardx.cryptoEnc Esos dos paquetes admiten la funcionalidad criptográfica requerida en las tarjetas inteligentes.

De conformidad con la convención de nomenclatura de Java, los paquetes de Java Cardx son extensiones del marco de Java Card. No es necesario que los apoyes en la tarjeta.

Seguridad de la tarjeta Java

Los subprogramas de Java están sujetos a restricciones de seguridad de Java; sin embargo, el modelo de seguridad de los sistemas de tarjetas Java difiere del estándar Java en muchos aspectos.

La clase Security Manager no es compatible con Java Card. Las políticas de seguridad del idioma las implementa la máquina virtual.

Los applets de Java crean objetos que almacenan y manipulan datos. Un objeto es propiedad del subprograma que lo crea. Aunque un subprograma pueda tener la referencia a un objeto, no puede invocar los métodos del objeto, a menos que sea propietario del objeto o que el objeto se comparta explícitamente. Un subprograma puede compartir cualquiera de sus objetos con un subprograma en particular o con todos los subprogramas.

Un applet es una entidad independiente dentro de una Java Card. Su selección, ejecución y funcionalidad no se ven afectadas por otros applets que residen en la misma tarjeta.

Cómo funcionan las cosas juntas dentro de una tarjeta Java

Dentro de una Java Card, JCRE (Java Card Runtime Environment) se refiere a la máquina virtual Java Card y las clases en Java Card Framework. Cada subprograma dentro de una tarjeta Java está asociado con una AID única asignada por JCRE.

Una vez que un subprograma se carga correctamente en la memoria persistente de la tarjeta y se vincula con Java Card Framework y otras bibliotecas en la tarjeta, JCRE llama al método de instalación del subprograma como último paso en el proceso de instalación del subprograma. Un método estático público install, debe ser implementado por una clase de subprograma para crear una instancia del subprograma y registrarlo con JCRE. Debido a que la memoria es limitada, es una buena práctica de programación, en este punto, crear e inicializar los objetos que el applet necesitará durante su vida útil.