Articulo de referencia

Tarjeta Java

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

Java Card es una tecnología de software que permite ejecutar aplicaciones basadas en Java ( applets ) de forma segura en tarjetas inteligentes y, de forma más general, en dispositivos similares seguros con un pequeño tamaño de memoria [1], que se denominan "elementos seguros" (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; los SE integrados soldados a una placa de dispositivo y los nuevos diseños de seguridad integrados en chips de uso general también se utilizan ampliamente. Java Card aborda esta fragmentación y especificidades del hardware al tiempo que conserva la portabilidad del código que ofrece Java.

Java Card es la plataforma Java más pequeña de todas, diseñada para dispositivos integrados. Java Card ofrece al usuario la posibilidad de programar los dispositivos y hacerlos específicos para cada aplicación. Se utiliza ampliamente en diferentes mercados: telecomunicaciones inalámbricas dentro de tarjetas SIM y SIM integradas, pagos dentro de tarjetas bancarias [2] y pagos móviles NFC y para 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 fue presentada en 1996 por la división de tarjetas de Schlumberger , que más tarde se fusionó con Gemplus para formar Gemalto . Los productos de tarjetas Java se basan en las especificaciones de Sun Microsystems (posteriormente una subsidiaria de Oracle Corporation ). Muchos productos de tarjetas Java también se basan en las especificaciones de GlobalPlatform para la gestión segura de 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. [3]

Portabilidad

Java Card tiene como objetivo definir un entorno informático estándar para tarjetas inteligentes que permita que el mismo subprograma Java Card se ejecute en diferentes tarjetas inteligentes, de forma similar a como un subprograma Java se ejecuta en diferentes computadoras. Al igual que en Java, esto se logra mediante la combinación de una máquina virtual (la máquina virtual Java Card) y una biblioteca de tiempo de ejecución bien definida, que abstrae en gran medida el subprograma de las diferencias entre tarjetas inteligentes. La portabilidad sigue mitigada por cuestiones de tamaño de memoria, rendimiento y compatibilidad con el 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 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 VM Java Card), separado del sistema operativo y del hardware subyacentes.
Cortafuegos de subprograma
A diferencia de otras máquinas virtuales Java, una máquina virtual Java Card 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 subprogramas que restringe y controla el acceso de los elementos de datos de un subprograma a otro.
Criptografía
Se admiten algoritmos de clave simétrica de uso común, como DES , Triple DES , AES , y algoritmos de clave asimétrica como RSA y criptografía de curva elíptica , así como otros servicios criptográficos como firma, generación de claves e intercambio de claves.
Subprograma
El subprograma es una máquina de estados que procesa únicamente solicitudes de comandos 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 de 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 programa Java Card se compila en un archivo de clase Java mediante un compilador Java; el archivo de clase se posprocesa mediante herramientas específicas de la plataforma Java Card.

Sin embargo, muchas características del lenguaje Java no son compatibles con Java Card (en particular, los tipos char, double, float y long; el transientcalificador; las enumeraciones; las matrices de más de una dimensión; la finalización; la clonación de objetos; los subprocesos). Además, algunas características comunes de Java no se proporcionan en tiempo de ejecución en muchas tarjetas inteligentes actuales (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 bytecode de Java Card ejecutado por la máquina virtual Java Card es un subconjunto funcional del bytecode de Java 2 ejecutado por una máquina virtual Java estándar, pero con una codificación diferente para optimizar el tamaño. Por lo tanto, un subprograma de Java Card normalmente utiliza menos bytecode que el subprograma Java hipotético obtenido compilando el mismo código fuente Java. Esto conserva la memoria, una necesidad en dispositivos con recursos limitados como las tarjetas inteligentes. Como compensación por el 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 entorno de ejecución

La biblioteca de clases estándar de Java Card y la compatibilidad en tiempo de ejecución difieren mucho de las 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 se implementan mediante la máquina virtual de Java Card; y los transitorios (variables de 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 compatibilidad con lenguaje nativo en Java.

Características específicas

El entorno 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 la memoria persistente (la RAM es muy escasa en las tarjetas inteligentes y solo se utiliza para objetos temporales o sensibles a la seguridad). Por tanto, el entorno de ejecución y el código de bytes se han adaptado para gestionar objetos persistentes.
Atomicidad
Como las tarjetas inteligentes se alimentan externamente y dependen de una memoria persistente, las actualizaciones persistentes deben ser atómicas. Por lo tanto, se garantiza que las operaciones de escritura individuales realizadas por instrucciones de bytecode y métodos API sean atómicas, y Java Card Runtime incluye un mecanismo de transacción limitado.
Aislamiento de subprogramas
El cortafuegos de Java Card es un mecanismo que aísla entre sí los distintos subprogramas presentes en una tarjeta. También incluye un mecanismo de compartición que permite que un subprograma ponga explícitamente un objeto a disposición de otros subprogramas.

Desarrollo

Las técnicas de codificación utilizadas en un programa Java Card práctico 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 Java Card (advertencia: incluso si la depuración se realiza con código de bytes de Java, asegúrese de que el archivo de clase se ajuste a las limitaciones del lenguaje Java Card convirtiéndolo a código de bytes de Java Card; y realice pruebas 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 va a incrustar en una tarjeta inteligente como una aplicación Java que estará en el host que utiliza la tarjeta inteligente, todo ello trabajando conjuntamente en el mismo entorno.

Versiones

Oracle ha publicado varias especificaciones de la plataforma Java Card y ofrece 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 forma de descubrir qué subconjunto de especificaciones se implementa es probar la tarjeta. [4]

  • Versión 3.2 (30.01.2023) [5]
    • Se introdujo soporte para protocolos (D)TLS1.3
    • Se agregaron aclaraciones sobre la 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) [6]
    • Se agregó soporte para generación de pares de claves configurables, soporte para curvas elípticas con nombre, nuevos algoritmos y soporte para operaciones, modos AES adicionales y algoritmos chinos.
  • Versión 3.0.5 (03.06.2015)
    • SDK de Oracle: kit de desarrollo clásico de Java Card 3.0.5u1 (03.06.2015)
    • Se agregó soporte para exponenciación modular Diffie-Hellman, conservación de datos de dominio para Diffie-Hellman, curva elíptica y claves DSA, RSA-3072, SHA3, ECDSA simple, AES CMAC, AES CTR.
  • Versión 3.0.4 (06.08.2011)
    • SDK de Oracle: kit de desarrollo clásico de Java Card 3.0.4 (11.06.2011)
    • Se agregó soporte para DES MAC8 ISO9797.
  • Versión 3.0.1 (15.06.2009)
    • SDK de Oracle: kit de desarrollo de tarjetas Java 3.0.3 RR (11.11.2010)
    • Se agregó soporte para SHA-224, SHA-2 para todos los algoritmos de firma.
  • Versión 2.2.2 (03.2006)
    • SDK de Oracle: kit de desarrollo de tarjetas Java 2.2.2 (03.2006)
    • Se agregó soporte para SHA-256, SHA-384, SHA-512, ISO9796-2, HMAC, SEED MAC NOPAD coreano, SEED NOPAD coreano.
  • Versión 2.2.1 (10.2003)
    • SDK de Oracle: kit de desarrollo de tarjetas Java 2.2.1 (10.2003)
  • Versión 2.2 (11.2002)
    • Se agregó soporte para 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 usando ECC, claves ECC para curvas polinomiales binarias y para curvas de números 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 tarjetas Java 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) se divide en dos ediciones: la Edición Clásica y la Edición Conectada . [7]

  • La 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 la plataforma Java Card (cuya última versión, 2.2.2, se publicó en marzo de 2006), que admite applets de tarjetas tradicionales en dispositivos con recursos limitados, como las tarjetas inteligentes. Los applets más antiguos son generalmente compatibles con los dispositivos Classic Edition más nuevos, y los applets para estos dispositivos más nuevos pueden ser compatibles con dispositivos más antiguos si no hacen referencia a nuevas funciones de biblioteca. Las tarjetas inteligentes que implementan Java Card Classic Edition han sido certificadas en cuanto a 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 funciones orientadas a la red. Las aplicaciones se pueden desarrollar como applets de tarjeta clásicos solicitados por comandos APDU o como servlets utilizando HTTP para soportar 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 coma flotante; admite objetos volátiles ( recolección de basura ), multithreading , facilidades de comunicación entre aplicaciones, persistencia , transacciones , facilidades de gestió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 página actual 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 subprogramas

  • La funcionalidad del subprograma se puede dividir en varios paquetes Java
  • Los tamaños de archivos CAP pueden superar los 64 KB

Nuevo marco de E/S y periféricos confiables

  • Se admite una variedad de capas físicas y protocolos de aplicación, más allá de los protocolos de tarjetas inteligentes definidos en 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 matriz (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 certificado, API de derivación de claves, API de contador monótono, API de hora del sistema

Nuevas extensiones criptográficas

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

Véase también

Referencias

  1. ^ Chen, Z. (2000). Tecnología de tarjetas Java para tarjetas inteligentes: arquitectura y guía del programador . Serie Java de Addison-Wesley. Addison-Wesley. ISBN 978-0-201-70329-0. Recuperado el 9 de abril de 2019 .
  2. ^ Oracle Learning Library (2013-01-30), Desarrollo de aplicaciones de Java Card, archivado desde el original el 2021-12-13 , consultado el 2019-04-18
  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 de la información y privacidad . 5 (3). IGI: 1–18. doi :10.4018/ijisp.2011070101.
  4. ^ "JCAlgTest - base de datos de algoritmos JavaCard compatibles" . Consultado el 27 de enero de 2016 .
  5. ^ 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 .
  6. ^ Ponsini, Nicolas. "Presentación de Java Card 3.1: nuevas extensiones criptográficas". blogs.oracle.com . Consultado el 18 de abril de 2019 .
  7. ^ Samoylov, N. (2018). Introducción a la programación: aprenda a programar en Java con estructuras de datos, algoritmos y lógica. Packt Publishing. p. 13. ISBN 978-1-78883-416-2. Recuperado el 9 de abril de 2019 .
  • Descripción general de la tarjeta Java (Oracle)
  • Defcon 21: La vida secreta de las tarjetas SIM en YouTube
  • Tarjetas Java-OpenSC
Retrieved from "https://en.wikipedia.org/w/index.php?title=Java_Card&oldid=1245572355"