Tarjeta Java
Java Card es una tecnología de software que permite que aplicaciones basadas en Java (applets) se ejecuten de forma segura en tarjetas inteligentes y, en general, en dispositivos seguros similares con un uso reducido de memoria, denominados "seguros". elementos" (SE). Hoy en día, un elemento seguro no se limita a sus tarjetas inteligentes y otros factores de forma de tokens criptográficos extraíbles; También se utilizan ampliamente los SE integrados soldados en una placa de dispositivo y nuevos diseños de seguridad integrados en chips de uso general. Java Card aborda esta fragmentación y especificidades del hardware al tiempo que conserva la portabilidad del código aportada por Java.
Java Card es la plataforma Java más pequeña destinada a dispositivos integrados. Java Card brinda al usuario la capacidad de programar los dispositivos y hacerlos específicos para aplicaciones. Se utiliza ampliamente en diferentes mercados: telecomunicaciones inalámbricas dentro de tarjetas SIM y SIM integradas, pagos con tarjetas bancarias y pagos móviles NFC y para documentos de identidad, tarjetas sanitarias y pasaportes. Varios productos de IoT, como las puertas de enlace, también utilizan productos basados en Java Card para proteger las comunicaciones con un servicio en la nube, por ejemplo.
La primera Java Card fue introducida en 1996 por la división de tarjetas de Schlumberger, que más tarde se fusionó con Gemplus para formar Gemalto. Los productos Java Card se basan en las especificaciones de Sun Microsystems (más tarde una subsidiaria de Oracle Corporation). Muchos productos de tarjetas Java también se basan en las especificaciones GlobalPlatform para la gestión segura de las aplicaciones en la tarjeta (descarga, instalación, personalización, eliminación).
Los principales objetivos de diseño de la tecnología Java Card son la portabilidad, la seguridad y la compatibilidad con versiones anteriores.
Portabilidad
Java Card tiene como objetivo definir un entorno informático de tarjeta inteligente estándar que permita que el mismo subprograma Java Card se ejecute en diferentes tarjetas inteligentes, de forma muy similar a como un subprograma Java se ejecuta en diferentes computadoras. Al igual que en Java, esto se logra utilizando la combinación de una máquina virtual (la máquina virtual de tarjeta Java) y una biblioteca de tiempo de ejecución bien definida, que abstrae en gran medida al subprograma de las diferencias entre tarjetas inteligentes. La portabilidad sigue mitigada por problemas de tamaño de la memoria, rendimiento y soporte de tiempo de ejecución (por ejemplo, para protocolos de comunicación o algoritmos criptográficos).
Seguridad
La tecnología Java Card se desarrolló originalmente con el fin de proteger la información confidencial almacenada en tarjetas inteligentes. La seguridad está determinada por varios aspectos de esta tecnología:
- Encapsulación de datos
- Los datos se almacenan dentro de la aplicación, y las aplicaciones Java Card se ejecutan en un entorno aislado (la tarjeta Java VM), separado del sistema operativo subyacente y el hardware.
- Manzana cortafuegos
- A diferencia de otros VM Java, una tarjeta Java VM suele administrar varias aplicaciones, cada una controlando datos sensibles. Por lo tanto, diferentes aplicaciones se separan entre sí por un cortafuegos de manzana que restringe y comprueba el acceso de elementos de datos de un applet a otro.
- Cryptography
- algoritmos de clave simétricos de uso común como DES, Triple DES, AES y algoritmos de clave asimétricos como RSA, criptografía de curvas elípticas se soportan, así como otros servicios criptográficos como la firma, generación de claves e intercambio de claves.
- Applet
- El applet es una máquina estatal que procesa únicamente las solicitudes de comando entrantes y responde enviando datos o palabras de estado de respuesta al dispositivo de interfaz.
Diseño
A nivel de lenguaje, Java Card es un subconjunto preciso de Java: todas las construcciones del lenguaje de Java Card existen en Java y se comportan de manera idéntica. Esto llega al punto de que, como parte de un ciclo de compilación estándar, un compilador de Java compila un programa Java Card en un archivo de clase Java; el archivo de clase es postprocesado por herramientas específicas de la plataforma Java Card.
Sin embargo, muchas funciones del lenguaje Java no son compatibles con Java Card (en particular, los tipos char, double, float y long; el calificador transitorio; enumeraciones; matrices de más de una dimensión; finalización; clonación de objetos; subprocesos). Además, muchas tarjetas inteligentes reales no proporcionan algunas características comunes de Java en tiempo de ejecución (en particular, el tipo int
, que es el tipo predeterminado de una expresión Java; y la recolección de basura de objetos).
Código de bytes
El código de bytes de Java Card ejecutado por la máquina virtual de Java Card es un subconjunto funcional del código de bytes de Java 2 ejecutado por una máquina virtual de Java estándar, pero con una codificación diferente para optimizar el tamaño. Por lo tanto, un subprograma Java Card normalmente utiliza menos código de bytes que el subprograma Java hipotético obtenido al compilar el mismo código fuente Java. Esto conserva la memoria, una necesidad en dispositivos con recursos limitados como las tarjetas inteligentes. Como compensación de diseño, no hay soporte para algunas características del lenguaje Java (como se mencionó anteriormente) y limitaciones de tamaño. Existen técnicas para superar las limitaciones de tamaño, como dividir el código de la aplicación en paquetes por debajo del límite de 64 KiB.
Biblioteca y tiempo de ejecución
La biblioteca de clases estándar de Java Card y el soporte de tiempo de ejecución difieren mucho de los de Java, y el subconjunto común es mínimo. Por ejemplo, la clase Java Security Manager no es compatible con Java Card, donde las políticas de seguridad las implementa la máquina virtual de Java Card; y los transitorios (variables de RAM rápidas y no persistentes que pueden ser miembros de una clase) se admiten a través de una biblioteca de clases Java Card, mientras que tienen soporte de lenguaje nativo en Java.
Características específicas
El tiempo de ejecución y la máquina virtual de Java Card también admiten funciones específicas de la plataforma Java Card:
- Persistencia
- Con Java Card, los objetos se almacenan por defecto en memoria persistente (RAM es muy escaso en tarjetas inteligentes, y sólo se utiliza para objetos temporales o sensibles a la seguridad). Por lo tanto, el entorno de tiempo de ejecución y el código de byte se han adaptado para gestionar objetos persistentes.
- Atomicity
- Como las tarjetas inteligentes son alimentadas externamente y dependen de la memoria persistente, las actualizaciones persistentes deben ser atómicas. Por lo tanto, las operaciones de escritura individuales realizadas por instrucciones individuales de código bytecode y métodos API están garantizadas atómico, y el Java Card Runtime incluye un mecanismo de transacción limitado.
- El aislamiento de Applet
- Java El firewall de la tarjeta es un mecanismo que aísla los diferentes applets presentes en una tarjeta uno del otro. También incluye un mecanismo de intercambio que permite a un applet poner explícitamente un objeto a disposición de otros applets.
Desarrollo
Las técnicas de codificación utilizadas en un programa Java Card práctico difieren significativamente de las utilizadas en un programa Java. Aún así, el hecho de que Java Card utilice un subconjunto preciso del lenguaje Java acelera la curva de aprendizaje y permite utilizar un entorno Java para desarrollar y depurar un programa Java Card (advertencia: incluso si la depuración se produce con el código de bytes de Java, asegúrese de que el archivo de clase se adapta a las limitaciones del lenguaje Java Card convirtiéndolo al código de bytes de Java Card y pruébelo en una tarjeta inteligente Java Card real desde el principio para tener una idea del rendimiento); Además, se puede ejecutar y depurar tanto el código de la tarjeta Java para la aplicación que se integrará en una tarjeta inteligente como una aplicación Java que estará en el host utilizando la tarjeta inteligente, todos trabajando conjuntamente en el mismo entorno.
Versiones
Oracle ha publicado varias especificaciones de la plataforma Java Card y proporciona herramientas SDK para el desarrollo de aplicaciones. Por lo general, los proveedores de tarjetas inteligentes implementan solo un subconjunto de algoritmos especificados en el objetivo de la plataforma Java Card. y la única manera de descubrir qué subconjunto de especificaciones se implementa es probar la tarjeta.
- Versión 3.2 (30.01.2023)
- Apoyo introducido para (D)TLS1.3 protocolos
- Agregó las aclaraciones de API para ayudar a los desarrolladores de aplicaciones y aumentar significativamente el nivel de interoperabilidad en múltiples implementaciones
- Versión 3.1 (17.12.2018)
- Añadido soporte de generación de pares clave configurable, llamado soporte de curvas elípticas, nuevos algoritmos y soporte de operaciones, modos AES adicionales y algoritmos chinos.
- Versión 3.0.5 (03.06.2015)
- Oracle SDK: Java Card Classic Development Kit 3.0.5u1 (03.06.2015)
- Apoyo añadido para la exponencia modular Diffie-Hellman, Conservación de Datos de Dominio para Diffie-Hellman, Curva Elíptica y teclas DSA, RSA-3072, SHA3, ECDSA, AES CMAC, AES CTR.
- Versión 3.0.4 (06.08.2011)
- Oracle SDK: Java Card Classic Development Kit 3.0.4 (06.11.2011)
- Se agregó soporte para DES MAC8 ISO9797.
- Versión 3.0.1 (15.06.2009)
- Oracle SDK: Java Card Development Kit 3.0.3 RR (11.11.2010)
- Añadido soporte para SHA-224, SHA-2 para todos los algoritmos de firma.
- Versión 2.2.2 (03.2006)
- Oracle SDK: Java Card Development Kit 2.2.2 (03.2006)
- Añadido support for SHA-256, SHA-384, SHA-512, ISO9796-2, HMAC, Korean SEED MAC NOPAD, Korean SEED NOPAD.
- Versión 2.2.1 (10.2003)
- Oracle SDK: Java Card Development Kit 2.2.1 (10.2003)
- Versión 2.2 (11.2002)
- Soporte añadido para la encapsulación de claves de criptografía AES, algoritmos de CRC, encapsulación de claves de curvas Elípticas, intercambio de clave Diffie-Hellman usando ECC, teclas ECC para curvas de polinomio binario y para curvas de enteros primarios, AES, ECC y RSA con longitudes de teclas variables.
- Versión 2.1.1 (18.05.2000)
- Oracle SDK: Java Card Development Kit 2.1.2 (05.04.2001)
- Se agregó soporte para RSA sin relleno.
- Versión 2.1 (07.06.1999)
Tarjeta Java 3.0
La versión 3.0 de la especificación Java Card (borrador publicado en marzo de 2008) está separada en dos ediciones: la Classic Edition y la Connected Edition.
- El Edición clásica (actualmente en la versión 3.0.5 publicada en junio de 2015) es una evolución de la versión 2 de Java Card Platform (que la última versión 2.2.2 fue lanzada en marzo de 2006), que soporta los folletos tradicionales de tarjetas en dispositivos con recursos como Smart Cards. Los applets más antiguos son generalmente compatibles con dispositivos de edición clásica más nuevos, y los applets para estos nuevos dispositivos pueden ser compatibles con dispositivos antiguos si no se refiere a nuevas funciones de biblioteca. Tarjetas inteligentes que implementan Java Card Classic Edition han sido certificados de seguridad por múltiples proveedores, y están disponibles comercialmente.
- El Edición conectada (actualmente en la versión 3.0.2 publicada en diciembre de 2009) pretende proporcionar una nueva máquina virtual y un entorno de ejecución mejorado con características orientadas a la red. Las aplicaciones pueden ser desarrolladas como applets de tarjetas clásicas solicitados por comandos APDU o como servlets usando HTTP para apoyar esquemas de comunicación basados en web (HTML, REST, SOAP...) con la tarjeta. El tiempo de ejecución utiliza un subconjunto de Java (1.)6 bytecode, sin Floating Point; soporta objetos volátiles (colección de basura), multithreading, inter-application communications facilities, persistence, transactions, card management facilities... A partir de 2021, ha habido poca adopción en tarjetas inteligentes disponibles comercialmente, tanto que la referencia a Java Card (incluyendo en la página actual de Wikipedia) a menudo excluye implícitamente los Edición conectada.
Tarjeta Java 3.1
Java Card 3.1 se lanzó en enero de 2019.
Nuevo formato de archivo CAP y modelo de implementación de subprogramas
- La funcionalidad de Applet se puede dividir en múltiples Paquetes Java
- Los tamaños de archivos CAP pueden exceder 64KB
Nuevo marco de E/S y periféricos confiables
- Se admite una variedad de capas físicas y protocolo de aplicación, más allá de protocolos de tarjetas inteligentes definidos en ISO 7816
- Se facilita el acceso lógico a periféricos de dispositivos mediante aplicaciones de elementos seguros
Mejoras en la plataforma principal
- Vistas de Array (vistas en un subconjunto de un array), Recursos Estaticos incrustados dentro de un archivo CAP y Ampliación de API
Servicios de seguridad
- API de certificados, API de derivación clave, API de contador monotónico, API de tiempo de sistema
Nuevas extensiones criptográficas
- Generación de pares claves configurables, llamadas curvas elípticas como Edwards-Curves, modos AES adicionales (CFB & XTS), Algoritmos chinos (SM2 - SM3 - SM4)