# Java Card

Java Card es una tecnología que permite ejecutar de forma segura pequeñas aplicaciones Java (applets) en tarjetas inteligentes y similares dispositivos empotrados.
Java Card da al usuario la capacidad de programar aplicaciones que se ejecutan en la tarjeta de modo que ésta tenga una funcionalidad práctica en un dominio de aplicación específico (pe. identificación, pago, etc.). Esta tecnología se usa ampliamente en las tarjetas SIM (utilizadas en teléfonos móviles GSM) y en tarjetas monedero electrónico.
La primera tarjeta Java fue presentada en 1997 por varias empresas entre las que estaban Axalto (división de tarjetas de Schlumberger) y Gemplus. Los productos Java Card están basados en la Plataforma Java Card cuyas especificaciones han sido desarrolladas por Sun Microsystems. La última versión de la plataforma JavaCard es la especificación 3.0.5, liberada por Oracle en el 2015.
Las principales características de esta tecnología son la portabilidad y la seguridad.

## Portabilidad

Java Card tiene por objeto la definición de un estándar de tarjeta inteligente que permite a la misma applet funcionar en diferentes tarjetas inteligentes, de forma muy parecida a cómo un applet de Java se ejecuta en diferentes ordenadores. Al igual que en Java, esto se consigue utilizando la combinación de una máquina virtual (la Máquina virtual de Java Card), y unas librerías cuya API está especificada. La portabilidad, en todo caso, sigue siendo obviada en muchos casos por cuestiones de tamaño de la memoria, el rendimiento y tiempo de ejecución (por ejemplo para los protocolos de comunicación o algoritmos criptográficos).

## Seguridad

La tecnología Java Card fue desarrollada originalmente con el propósito de asegurar la información sensible almacenada en las tarjetas inteligentes. La seguridad está determinada por diversos aspectos de esta tecnología:
* Applet. El applet es una máquina de estados que solo procesa los comandos recibidos a través del dispositivo lector enviando y respondiendo con códigos de estado y datos.
* Separación de applets. Las distintas aplicaciones están, además, separadas unas de otras por un cortafuegos que limita el acceso y control de los elementos de datos de un subprograma a otro.
* Encapsulación de datos. Los datos se almacenan en la aplicación y las aplicaciones Java Card se ejecutan en un entorno aislado (la tarjeta de Java VM), separada del sistema operativo y del equipo en que se lee la tarjeta.
* Criptografía. En esta plataforma están implementados los algoritmos criptográficos más comúnmente utilizados como DES, 3DES, AES, RSA (incluyendo el uso de criptografía de curva elíptica). Otros servicios como la firma electrónica o la generación de claves de intercambio también están soportados.

## Java Card frente a Java
### Lenguaje

A nivel de lenguaje, Java Card es un subconjunto de Java: todas las construcciones del lenguaje Java Card existen en Java y se comportan de la misma manera. Esto va hasta el punto de que, como parte de un ciclo estándar de desarrollo, un applet Java Card se compila en un archivo de clase Java (.class) por un compilador Java normal, sin ningún tipo de opción especial (aunque el fichero compilado será procesado posteriormente por herramientas específicas para la plataforma Java Card).
No obstante, muchas características del lenguaje Java no son compatibles con Java Card (en particular algunos tipos básicos (char, double', float y long); los enums; los arrays de más de una dimensión; los hilos (threads);... y algunas características son opcionales y están ausentes en la mayoría de las tarjetas inteligentes (pe. el tipo int, en particular, que es el valor por defecto de un tipo de expresión de Java, la recolección de basura).

### Bytecode

El bytecode de Java Card gestionado por la máquina virtual de Java Card es un subconjunto funcional de Java (Java 2 Standard Edition) aunque utiliza una codificación diferente optimizada para ocupar menos espacio.

### Librerías de ejecución fe

Las librerías estándar de Java Card difieren en mucho de las de Java, y el subconjunto común es mínimo. Por ejemplo, la clase del Java Security Manager no es compatible con Java Card, donde las políticas de seguridad son ejecutadas por la máquina virtual de la tarjeta.

### Desarrollo

Las técnicas de codificación utilizadas en la programación de Java Cards difieren significativamente de las que se utilizan en un programa Java. Aun así, al utilizar Java Card un subconjunto del lenguaje Java se acelera la curva de aprendizaje, y permite utilizar un entorno Java para desarrollar y depurar un programa Java Card.