Articulo de referencia

Tarjeta Java

Java Card es una tecnología de software que permite ejecutar de forma segura aplicaciones basadas en Java ( applets ) en tarjetas inteligentes y, en general, en dispositivos sim...

Java Card es una tecnología de software que permite ejecutar de forma segura aplicaciones basadas en Java ( applets ) en tarjetas inteligentes y, en general, en dispositivos similares de memoria reducida y segura [ 1 ] , denominados " elementos seguros " (SE). Actualmente, un elemento seguro no se limita a las tarjetas inteligentes y otros tokens criptográficos extraíbles; también se utilizan ampliamente los SE integrados soldados a una placa de circuito impreso y los nuevos diseños de seguridad integrados en chips de propósito general. Java Card aborda esta fragmentación y especificidades del hardware, manteniendo la portabilidad del código propia de Java.

Java Card es la plataforma Java más pequeña, diseñada para dispositivos integrados. Permite al usuario programar los dispositivos y adaptarlos a aplicaciones específicas. Se utiliza ampliamente en diversos mercados: telecomunicaciones inalámbricas en tarjetas SIM y SIM integradas (eSIM), pagos con tarjetas bancarias [ 2 ] y pagos móviles RFID ( NFC ), así como en tarjetas de identidad, tarjetas sanitarias y pasaportes. Varios productos de IoT, como las pasarelas, también utilizan productos basados ​​en Java Card para proteger las comunicaciones con un servicio en la nube, por ejemplo.

La primera tarjeta Java Card fue lanzada en 1996 por la división de tarjetas de Schlumberger , que posteriormente se fusionó con Gemplus para formar Gemalto . Los productos Java Card se basan en las especificaciones de Sun Microsystems (adquirida por Oracle Corporation en 2010). Muchos productos Java Card también utilizan las especificaciones de GlobalPlatform para la gestión segura de las aplicaciones en la tarjeta (descarga, instalación, personalización y eliminación).

Los principales objetivos de diseño de la tecnología Java Card son la portabilidad, la seguridad y la retrocompatibilidad. [ 3 ]

Portabilidad

Java Card tiene como objetivo definir un entorno informático estándar para tarjetas inteligentes que permita que el mismo applet de Java Card se ejecute en diferentes tarjetas inteligentes, de forma similar a como un applet de Java se ejecuta en diferentes ordenadores. Al igual que en Java, esto se logra mediante la combinación de una máquina virtual (la Máquina Virtual de Java Card) y una biblioteca de tiempo de ejecución bien definida, que abstrae en gran medida el applet de las diferencias entre las tarjetas inteligentes. La portabilidad se ve limitada por problemas de tamaño de memoria, rendimiento y soporte de tiempo de ejecución (por ejemplo, para protocolos de comunicación o algoritmos criptográficos). Además, los proveedores suelen exponer API propietarias específicas de su ecosistema, lo que limita aún más la portabilidad de los applets que dependen de dichas llamadas. Para abordar estas limitaciones, Vasilios Mavroudis y Petr Svenda presentaron JCMathLib, una biblioteca de envoltura criptográfica de código abierto para Java Card, que permite realizar cálculos criptográficos de bajo nivel no compatibles con la API estándar. [ 4 ] [ 5 ] [ 6 ]

Seguridad

La tecnología JavaCard se desarrolló originalmente con el propósito 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 máquina virtual Java Card), separado del sistema operativo y el hardware subyacentes.
Cortafuegos de applet
A diferencia de otras máquinas virtuales Java, una máquina virtual JavaCard suele gestionar varias aplicaciones, cada una de las cuales controla datos confidenciales. Por lo tanto, las distintas aplicaciones están separadas entre sí por un cortafuegos de applets que restringe y verifica el acceso de los elementos de datos de un applet a otro.
Criptografía
Se admiten algoritmos de clave simétrica de uso común como DES , Triple DES y AES , así como algoritmos de clave asimétrica como RSA y la criptografía de curva elíptica , además de otros servicios criptográficos como la firma, la generación de claves y el intercambio de claves.
Applet
El applet es una máquina de estados que procesa únicamente las solicitudes de comandos entrantes y responde enviando datos o palabras de estado de respuesta al dispositivo de interfaz.

Diseño

A nivel lingüístico, Java Card es un subconjunto preciso de Java: todas las construcciones de Java Card existen en Java y se comportan de forma idéntica. Esto llega al punto de que, como parte de un ciclo de compilación estándar, un programa Java Card se compila en un archivo de clase Java mediante un compilador Java; dicho archivo de clase se procesa posteriormente con herramientas específicas de la plataforma Java Card.

Sin embargo, Java Card no admite muchas características del lenguaje Java (en particular, los tipos char, doubley float; longel transientcalificador; enumeraciones ; matrices de más de una dimensión ; finalización ; clonación de objetos; subprocesos ). Además, muchas tarjetas inteligentes actuales no proporcionan en tiempo de ejecución algunas características comunes de Java (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 applet de Java Card suele usar menos código de bytes que un applet de Java hipotético obtenido al compilar el mismo código fuente de Java. Esto ahorra memoria, algo esencial en dispositivos con recursos limitados como las tarjetas inteligentes. Como contrapartida de diseño, no se admiten algunas características del lenguaje Java (como se mencionó anteriormente) y existen limitaciones de tamaño. Existen técnicas para superar estas limitaciones, como dividir el código de la aplicación en paquetes por debajo del límite de 64 KiB . 

Biblioteca y entorno de ejecución

La biblioteca de clases y el soporte en tiempo de ejecución estándar de Java Card difieren mucho de los de Java, y el subconjunto común es mínimo. La mayoría de los paquetes ofrecidos en la biblioteca estándar de Java SE no están presentes. Por ejemplo, la clase Java Security Manager no es compatible con Java Card, donde las políticas de seguridad se implementan mediante la Máquina Virtual de Java Card; y las variables transitorias (variables RAM rápidas y no persistentes que pueden ser miembros de clase) son compatibles a través de una biblioteca de clases de Java Card, mientras que tienen soporte nativo en Java. Por ejemplo, Java Card no tiene Stringun tipo, solo byte[](similar a C , donde las cadenas de C se representan como char[]). La mayoría de las primitivas están ausentes excepto byte, short, inty boolean. [ 7 ]

Java.*

El java.langpaquete contiene clases fundamentales de la tecnología Java Card, que incluyen las dos clases Object(la raíz de la jerarquía de clases), Throwable(que tiene solo una subclase conocida Exception, ya que Errorno está presente) y excepciones relevantes. Como se mencionó anteriormente, java.lang.Stringno existe en Java Card debido a las limitaciones de la plataforma, en su lugar representa cadenas como byte[]. Los arreglos ( T[]) tienen el lengthcampo.

No existen clases envoltorio Byte, Short, Integery Booleanpara los tipos primitivos byte, short, inty boolean.

Todas las excepciones, excepto java.io.IOExceptiony, javacard.framework.CardExceptionson instancias de java.lang.RuntimeException.

El paquete java.rmiincluye la interfaz Remotepara los métodos que se invocan desde una aplicación cliente de un dispositivo de aceptación de tarjetas (CAD).

javacard.*

El javacard.frameworkpaquete contiene el marco de clases para crear applets de Java Card. es Appletuna clase abstracta para un applet. La Utilclase contiene métodos de utilidad en matrices de bytes ( byte[]) y shorts.

El javacard.securitypaquete contiene interfaces y clases para trabajar con funcionalidades criptográficas y de seguridad.

javacardx.*

Estos son paquetes de extensión para complementar los javacard.*paquetes.

Los javacardx.framework.*paquetes contienen varias utilidades, como la clase javacardx.framework.math.BigNumber(operaciones con números grandes), javacardx.framework.nio(un paquete para búferes, contenedores de datos), javacardx.framework.string.StringUtil(una clase que proporciona métodos en cadenas codificadas en UTF-8, todavía representadas como byte[]), el paquete javacardx.framework.timeque contiene clases SysTime(para la hora del sistema) y TimeDuration(para representar una cantidad de tiempo), y javacardx.framework.util.intx.JCintpara trabajar con int.

El javacardx.security.*paquete incluye funcionalidades para trabajar con certificados, funciones de derivación criptográfica y mucho más.

Esta javacardx.biometryclase contiene funcionalidades para marcos biométricos en Java Card. javacardx.biometry.BioBuilderSe utiliza para crear plantillas de referencia biométricas y contiene varias constantes que representan diferentes métodos de identificación biométrica.

Características específicas

El entorno de ejecución y la máquina virtual de Java Card también admiten características específicas de la plataforma Java Card:

Persistencia
Con Java Card, los objetos se almacenan por defecto en memoria persistente (la RAM es muy escasa en las tarjetas inteligentes y solo se utiliza para objetos temporales o que requieren información confidencial). Por lo tanto, tanto el entorno de ejecución como el código de bytes se han adaptado para gestionar objetos persistentes.
Atomicidad
Dado que las tarjetas inteligentes se alimentan externamente y dependen de memoria persistente, las actualizaciones persistentes deben ser atómicas. Por lo tanto, se garantiza que las operaciones de escritura individuales realizadas por las instrucciones de código de bytes y los métodos de la API sean atómicas, y el entorno de ejecución de Java Card incluye un mecanismo de transacciones limitado.
Aislamiento de applets
El cortafuegos de JavaCard es un mecanismo que aísla entre sí los diferentes applets presentes en una tarjeta. También incluye un mecanismo de compartición que permite que un applet ponga un objeto a disposición de otros applets de forma explícita.

Desarrollo

Las técnicas de codificación utilizadas en un programa práctico de Java Card difieren significativamente de las utilizadas en un programa Java. Sin embargo, 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 de Java Card (advertencia: incluso si la depuración se realiza con bytecode de Java, asegúrese de que el archivo de clase se ajuste a las limitaciones del lenguaje Java Card convirtiéndolo a bytecode de Java Card; y pruebe 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 Java Card para la aplicación que se integrará en una tarjeta inteligente, como una aplicación Java que estará en el host que utiliza la tarjeta inteligente, todo funcionando conjuntamente en el mismo entorno.

Ejemplo

Este es un ejemplo de programa "¡Hola, mundo!" en Java Card.

paquete org.wikipedia.examples ;import javacard.framework.APDU ; import javacard.framework.Applet ; import javacard.framework.ISO7816 ; import javacard.framework.ISOException ; import javacard.framework.Util ;public class HelloWorldApplet extends Applet { // Byte INS (instrucción) para "decir hola" final static byte HELLO_INS = ( byte ) 0x01 ;// AID (Identificador de aplicación) para el applet private static final byte [] HELLO_APPLET_AID = { ( byte ) 0xA0 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x00 , ( byte ) 0x62 , ( byte ) 0x03 , ( byte ) 0x01 , ( byte ) 0x0C , ( byte ) 0x01 };protected HelloWorldApplet () { registrar (); }public static void install ( byte [] byteArray , short byteOffset , byte byteLength ) { // No es necesario asignar la referencia // Solo necesitamos llamar al constructor HelloWorldApplet app = new HelloWorldApplet (); }public void process ( APDU apdu ) { byte [] buffer = apdu . getBuffer ();if ( selectingApplet ()) { return ; }byte ins = buffer [ ISO7816 . OFFSET_INS ] ;if ( ins == HELLO_INS ) { sendHello ( apdu ) ; } else { ISOException.throwIt ( ISO7816.SW_INS_NOT_SUPPORTED ) ; } }envío vacío privadoHola ( APDU apdu ) { byte [] buffer = apdu . obtenerBuffer (); byte [] hola = { 'H' , 'e' , 'l' , 'l' , 'o' };longitud corta = ( corto ) hola.longitud ; Util.arrayCopyNonAtomic ( hola , ( corto ) 0 , buffer , ( corto ) 0 , longitud ) ; apdu.setOutgoingAndSend ( ( corto ) 0 , longitud ) ; } }

Versiones

Oracle ha publicado varias especificaciones de la plataforma Java Card y proporciona herramientas SDK para el desarrollo de aplicaciones. Por lo general, los fabricantes de tarjetas inteligentes implementan solo un subconjunto de los algoritmos especificados en la plataforma Java Card, y la única forma de descubrir qué subconjunto de la especificación se implementa es probando la tarjeta. [ 8 ]

  • Versión 3.2 (30.01.2023) [ 9 ]
    • Se ha introducido compatibilidad con los protocolos (D)TLS1.3.
    • Se han añadido aclaraciones a la API para ayudar a los desarrolladores de aplicaciones y aumentar significativamente el nivel de interoperabilidad entre múltiples implementaciones.
  • Versión 3.1 (17.12.2018) [ 10 ]
    • Se ha añadido compatibilidad con la generación de pares de claves configurables, compatibilidad con curvas elípticas con nombre, compatibilidad con nuevos algoritmos y operaciones, modos AES adicionales y algoritmos chinos.
  • Versión 3.0.5 (03.06.2015)
    • SDK de Oracle: Kit de desarrollo Java Card Classic 3.0.5u1 (03.06.2015)
    • Se agregó compatibilidad con la exponenciación modular de Diffie-Hellman, la conservación de datos de dominio para Diffie-Hellman, las claves de curva elíptica y DSA, RSA-3072, SHA3, ECDSA simple, AES CMAC y AES CTR.
  • Versión 3.0.4 (06.08.2011)
    • Kit de desarrollo de Oracle SDK: Java Card Classic Development Kit 3.0.4 (06.11.2011)
    • Se ha añadido compatibilidad con DES MAC8 ISO9797.
  • Versión 3.0.1 (15.06.2009)
    • SDK de Oracle: Kit de desarrollo de JavaCard 3.0.3 RR (11.11.2010)
    • Se ha añadido compatibilidad con SHA-224 y SHA-2 para todos los algoritmos de firma.
  • Versión 2.2.2 (03.2006)
    • Kit de desarrollo de Oracle SDK: JavaCard 2.2.2 (03.2006)
    • Se agregó soporte para SHA-256, SHA-384, SHA-512, ISO9796-2, HMAC, Korean SEED MAC NOPAD, Korean SEED NOPAD.
  • Versión 2.2.1 (10.2003)
    • SDK de Oracle: Kit de desarrollo de JavaCard 2.2.1 (10.2003)
  • Versión 2.2 (11.2002)
    • Se ha añadido compatibilidad con la encapsulación de claves de criptografía AES, algoritmos CRC, encapsulación de claves de criptografía de curva elíptica, intercambio de claves Diffie-Hellman mediante ECC, claves ECC para curvas polinómicas binarias y para curvas de enteros primos, AES, ECC y RSA con longitudes de clave variables.
  • Versión 2.1.1 (18.05.2000)
    • SDK de Oracle: Kit de desarrollo de JavaCard 2.1.2 (05.04.2001)
    • Se ha añadido compatibilidad con 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) se divide en dos ediciones: la Edición Clásica y la Edición Conectada . [ 11 ]

  • La edición clásica (actualmente en la versión 3.0.5, lanzada en junio de 2015) es una evolución de la plataforma Java Card versión 2 (cuya última versión, la 2.2.2, se lanzó en marzo de 2006), que admite applets de tarjetas tradicionales en dispositivos con recursos limitados, como las tarjetas inteligentes. Los applets antiguos suelen ser compatibles con los dispositivos más recientes de la edición clásica, y los applets para estos dispositivos más recientes pueden ser compatibles con los dispositivos antiguos si no hacen referencia a nuevas funciones de la biblioteca. Las tarjetas inteligentes que implementan Java Card Classic Edition han sido certificadas en materia de seguridad por varios proveedores y están disponibles comercialmente.
  • La Connected Edition (actualmente en la versión 3.0.2, lanzada en diciembre de 2009) tiene como objetivo proporcionar una nueva máquina virtual y un entorno de ejecución mejorado con características orientadas a la red. Las aplicaciones se pueden desarrollar como applets de tarjeta clásicos solicitados por comandos APDU o como servlets que utilizan HTTP para admitir esquemas de comunicación basados ​​en web ( HTML , REST , SOAP ...) con la tarjeta. El entorno de ejecución utiliza un subconjunto del bytecode de Java (1.)6, sin punto flotante; admite objetos volátiles ( recolección de basura ), multihilo , facilidades de comunicación entre aplicaciones, persistencia , transacciones , facilidades de administración de tarjetas... A partir de 2021, ha habido poca adopción en tarjetas inteligentes disponibles comercialmente, tanto que la referencia a Java Card (incluida en la presente página de Wikipedia) a menudo excluye implícitamente la Connected Edition .

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 applets

  • La funcionalidad de un applet se puede dividir en varios paquetes Java.
  • El tamaño de los archivos CAP puede superar los 64 KB.

Nuevo marco de E/S y periféricos de confianza

  • Se admite una variedad de capas físicas y protocolos de aplicación, más allá de los protocolos de tarjetas inteligentes definidos en la norma ISO 7816.
  • Se facilita el acceso lógico a los periféricos del dispositivo mediante aplicaciones de elementos seguros.

Mejoras en la plataforma principal

  • Vistas de matrices (vistas de un subconjunto de una matriz), recursos estáticos integrados en un archivo CAP y extensibilidad de API mejorada.

Servicios de seguridad

  • API de certificados, API de derivación de claves, API de contador monótono, API de tiempo del sistema

Nuevas extensiones criptográficas

  • Generación de pares de claves configurable, curvas elípticas con nombre como las curvas de Edwards , modos AES adicionales ( CFB y XTS ), algoritmos chinos (SM2 - SM3 - SM4 ).

Véase también

Referencias

  1. Chen, Z. (2000). Tecnología Java Card para tarjetas inteligentes: arquitectura y guía del programador . Serie Java de Addison-Wesley. Addison-Wesley. ISBN 978-0-201-70329-0Consultado el 9 de abril de 2019 .
  2. Biblioteca de aprendizaje de Oracle (30/01/2013), Desarrollo de aplicaciones Java Card , archivado del original el 13/12/2021 , consultado el 18/04/2019.
  3. Ahmed Patel; Kenan Kalajdzic; Laleh Golafshan; Mona Taghavi (2011). "Diseño e implementación de un marco de autenticación de conocimiento cero para Java Card" . Revista Internacional de Seguridad y Privacidad de la Información . 5 (3). IGI: 1– 18. doi : 10.4018/ijisp.2011070101 .
  4. Mavroudis, Vasilios; Svenda, Petr (2020). "JCMathLib: Biblioteca criptográfica envolvente para applets JavaCard transparentes y certificables". 2020 IEEE European Symposium on Security and Privacy Workshops (EuroS&PW) . IEEE. pp. 383–390 . arXiv : 2008.11362 . doi : 10.1109/EuroSPW51379.2020.00056 . 
  5. "JCMathLib" . GitHub . Consultado el 12 de abril de 2025 .
  6. "OpenCrypto: Liberando el ecosistema JavaCard" . YouTube . Consultado el 12 de abril de 2025 .
  7. "Descripción general (API de Java Card, edición clásica)" . docs.oracle.com . Oracle Corporation . Consultado el 13 de octubre de 2025 .
  8. "JCAlgTest - base de datos de algoritmos JavaCard compatibles" . Consultado el 27 de enero de 2016 .
  9. Ponsini, Nicolas (30 de enero de 2023). "Anuncio del lanzamiento de Java Card 3.2" . Blog de Java Card . Consultado el 6 de febrero de 2023 .
  10. Ponsini, Nicolas. "Presentación de Java Card 3.1: Nuevas extensiones criptográficas" . blogs.oracle.com . Consultado el 18 de abril de 2019 .
  11. Samoylov, N. (2018). Introducción a la programación: Aprende a programar en Java con estructuras de datos, algoritmos y lógica . Packt Publishing. pág. 13. ISBN  978-1-78883-416-2Consultado el 9 de abril de 2019 .
  • Descripción general de JavaCard (Oracle)
  • Defcon 21: La vida secreta de las tarjetas SIM en YouTube
  • JavaCards-OpenSC