Введение

Умная карта Java Card – это программная технология, позволяющая безопасно запускать приложения на основе Java (апплеты) на смарт-картах и, в более общем смысле, на аналогичных защищенных устройствах с ограниченным объемом памяти, называемых «защищенными элементами» (SE). Сегодня защищенный элемент не ограничивается смарт-картами и другими съемными криптографическими токенами; широко используются также встроенные SE, припаянные к плате устройства, и новые решения по безопасности, интегрированные в чипы общего назначения. Java Card решает проблему аппаратной фрагментации и ее особенностей, сохраняя при этом переносимость кода, обеспечиваемую Java. Java Card – это самая компактная из платформ Java, предназначенная для встраиваемых устройств. Java Card предоставляет пользователю возможность программировать устройства и адаптировать их для конкретных приложений. Она широко применяется в различных областях: беспроводная связь в SIM-картах и встроенных SIM-картах, платежи в банковских картах и мобильные платежи NFC, а также для удостоверений личности, медицинских карт и паспортов. Некоторые продукты IoT, такие как шлюзы, также используют продукты на основе Java Card для обеспечения безопасной связи, например, с облачным сервисом. Первая Java Card была представлена в 1996 году подразделением Schlumberger, которое впоследствии объединилось с Gemplus и образовало Gemalto. Продукты Java Card основаны на спецификациях Sun Microsystems (позднее – дочерняя компания Oracle Corporation). Многие продукты Java Card также используют спецификации GlobalPlatform для безопасного управления приложениями на карте (загрузка, установка, персонализация, удаление). Основными целями разработки технологии Java Card являются переносимость, безопасность и обратная совместимость.

Переносимость

Java Card стремится определить стандартную вычислительную среду для смарт-карт, позволяющую одному и тому же Java Card апплету работать на различных смарт-картах, подобно тому, как Java апплет работает на разных компьютерах. Как и в Java, это достигается благодаря сочетанию виртуальной машины (Java Card Virtual Machine) и чётко определённой библиотеки времени выполнения, которая в значительной степени скрывает от апплета различия между смарт-картами. Переносимость всё ещё ограничена проблемами, связанными с объёмом памяти, производительностью и поддержкой среды выполнения (например, протоколов связи или криптографических алгоритмов).

Безопасность

Технология Java Card была первоначально разработана для защиты конфиденциальной информации, хранящейся на смарт-картах. Безопасность определяется различными аспектами этой технологии:
Инкапсуляция данных. Данные хранятся внутри приложения, а приложения Java Card выполняются в изолированной среде (Java Card VM), отделенной от базовой операционной системы и аппаратного обеспечения. В отличие от других виртуальных машин Java, виртуальная машина Java Card обычно управляет несколькими приложениями, каждое из которых контролирует конфиденциальные данные. Различные приложения, таким образом, разделены друг от друга межприложениевым брандмауэром, который ограничивает и проверяет доступ элементов данных одного апплета к элементам данных другого. Криптография. Поддерживаются широко используемые алгоритмы симметричного шифрования, такие как DES, Triple DES, AES, а также алгоритмы асимметричного шифрования, такие как RSA, криптография на эллиптических кривых, а также другие криптографические сервисы, такие как подпись, генерация ключей и обмен ключами. Апплет. Апплет – это конечный автомат, который обрабатывает только входящие командные запросы и отвечает, отправляя данные или слова состояния ответа обратно на интерфейсное устройство.

Дизайн

На языковом уровне Java Card является точным подмножеством Java: все языковые конструкции Java Card существуют в Java и ведут себя идентично. Это доходит до того, что в рамках стандартного цикла сборки программа Java Card компилируется в Java-файл класса компилятором Java; этот файл класса затем обрабатывается инструментами, специфичными для платформы Java Card. Однако многие возможности языка Java не поддерживаются Java Card (в частности, типы char, double, float и long; модификатор transient; перечисления; массивы с более чем одним измерением; финализация; клонирование объектов; потоки). Более того, некоторые распространенные возможности Java не предоставляются во время выполнения многими реальными смарт-картами (в частности, тип int, который является типом по умолчанию для Java-выражений; и сборка мусора для объектов).

Байт-код

Байт-код Java Card, исполняемый виртуальной машиной Java Card, представляет собой функциональное подмножество байт-кода Java 2, исполняемого стандартной виртуальной машиной Java, но с другим кодированием для оптимизации по размеру. Таким образом, аплет Java Card обычно использует меньше байт-кода, чем гипотетический аплет Java, полученный компиляцией того же исходного кода Java. Это позволяет экономить память, что необходимо для устройств с ограниченными ресурсами, таких как смарт-карты. В качестве компромисса в дизайне отсутствует поддержка некоторых возможностей языка Java (как указано выше) и существуют ограничения по размеру. Существуют способы преодоления этих ограничений по размеру, например, разделение кода приложения на пакеты, размер которых не превышает 64 КБ.

Библиотека и время выполнения

Стандартная библиотека классов Java Card и среда выполнения значительно отличаются от таковых в Java, а их общая часть минимальна. Например, класс Java Security Manager не поддерживается в Java Card, поскольку политики безопасности реализуются виртуальной машиной Java Card; а транзиенты (непостоянные, быстрые переменные оперативной памяти, которые могут быть членами класса) поддерживаются посредством библиотеки классов Java Card, в то время как в Java для них предусмотрена встроенная языковая поддержка.

Разработка

Методы программирования, используемые в практической программе для Java Card, значительно отличаются от тех, что применяются в обычной программе на Java. Однако тот факт, что Java Card использует точное подмножество языка Java, упрощает освоение и позволяет использовать среду Java для разработки и отладки программы Java Card (важно: даже если отладка выполняется с использованием байт-кода Java, убедитесь, что файл класса соответствует ограничениям языка Java Card, преобразовав его в байт-код Java Card; и протестируйте на реальной смарт-карте Java Card на ранних этапах, чтобы оценить производительность). Кроме того, можно одновременно запускать и отлаживать как код Java Card для приложения, которое будет встроено в смарт-карту, так и Java-приложение, работающее на хост-системе, использующей эту смарт-карту, при этом все они взаимодействуют в одной среде.

Java Card 3.0 (код Java)

Версия 3.0 спецификации Java Card (проект, выпущенный в марте 2008 года) разделена на два издания: Classic Edition и Connected Edition. Классическое издание (в настоящее время версия 3.0.5, выпущенная в июне 2015 года) является развитием платформы Java Card версии 2 (последняя версия 2.2.2 была выпущена в марте 2006 года), поддерживающей традиционные апплеты карт на устройствах с ограниченными ресурсами, таких как смарт-карты. Более старые апплеты, как правило, совместимы с новыми устройствами Classic Edition, а апплеты для этих новых устройств могут быть совместимы со старыми устройствами, если не используют новые функции библиотеки. Смарт-карты, реализующие Java Card Classic Edition, сертифицированы по безопасности многими поставщиками и доступны в коммерческой продаже. Connected Edition (в настоящее время версия 3.0.2, выпущенная в декабре 2009 года) предназначена для обеспечения новой виртуальной машиной и расширенной средой выполнения с сетевыми возможностями. Приложения могут быть разработаны как классические апплеты карт, вызываемые командами APDU, или как сервлеты, использующие HTTP для поддержки веб-схем связи (HTML, REST, SOAP) с картой. Среда выполнения использует подмножество байт-кода Java (1. )6, без поддержки чисел с плавающей точкой; она поддерживает временные объекты (сборку мусора), многопоточность, средства межприложенческой коммуникации, сохранение данных, транзакции и средства управления картой. По состоянию на 2021 год Connected Edition получила незначительное распространение в коммерчески доступных смарт-картах, поэтому упоминание Java Card (включая на данной странице Википедии) часто подразумевает исключение Connected Edition.

Карта Java 3.1

Java Card 3.1 был выпущен в январе 2019 года.