Pull to refresh

Использование Java смарт-карт для защиты ПО. Глава 1. Общие сведения

Reading time7 min
Views16K
image

1. Введение


В данном цикле статей пойдет речь об использовании Java смарт-карт (более дешевых аналогов электронных ключей) для защиты программного обеспечения. Цикл разбит на несколько глав.

Для прочтения и осознания информации из статей вам понадобятся следующие навыки:
  • Основы разработки ПО для Windows (достаточно умения программировать в любой визуальной среде, такой как Delphi или Visual Basic)
  • Базовые знания из области криптографии (что такое шифр, симметричный, ассиметричный алгоритм, вектор инициализации, CBC и т.д. Рекомендую к обязательному прочтению Прикладную Криптографию Брюса Шнайера).
  • Базовые навыки программирования на любом языке, хотя бы отдаленно напоминающем Java по синтаксису (Java, C++, C#, PHP и т.д.)

Цель цикла — познакомить читателя с Ява-картами (литературы на русском языке по их использованию крайне мало). Цикл не претендует на статус «Руководства по разработке защиты ПО на основе Ява-карт» или на звание «Справочника по Ява-картам».

Состав цикла:




2. Допущения


Ни одна статья цикла не претендует на полноту и точность, хотя автор очень старался сделать всех их наиболее полными и точными.
При использовании любой информации из данного цикла статей помните, что вы делаете это на свой страх и риск. Автор не несет ответственности за любой ущерб, который вам может причинить использование этой информации.

В цикле статей идет речь о Java-картах, соответствующих стандарту GlobalPlatform версии 2.1.1 и JavaCard 2.2.1, таких, как NXP JCOP или Gemalto TOP GX. Вся информация данного цикла статей или ее часть может оказаться неприменимой к Java-картам, не соответствующим этим стандартам (исключение, конечно, составляют более поздние версии упомянутых стандартов). Использование карт, не соответствующих упомянутым стандартам для защиты ПО может оказаться небезопасным для проекта.

Поскольку одно только описание стандарта GlobalPlatform одной конкретной версии занимает около 350 печатных листов формата A4 автор сознательно идет на некоторое упрощения терминов и теорий, лежащих в основе архитектуры описываемых карт, по его мнению не противоречащее реальным данным.

3. Базовые сведения о Java-картах


Что же такое Java-карта? Java-карта — это маленький компьютер, заключенный в корпус SIM карты, подобной той, что вы используете в вашем сотовом телефоне. Этот микрокомпьютер имеет свой собственный микропроцессор (такой, как Philips P8WE5017, например), некоторый объем «flash»-памяти для хранения программ (обычно от 32 до 128 килобайт), криптографический сопроцессор.

C компьютером карта общается через специальный считыватель, обычно вставляющийся в USB порт. Но существуют и contactless карты, которые достаточно просто поднести к считывателю, чтобы установить соединение.

В памяти карты могут храниться программы, которые называются апплетами. Апплеты пишутся на слегка усеченном варианте языка Java (текстовый файл с расширением .java), затем компилируются в байт-код обычным Java-компилятором (получается *.class файл) и преобразовываются специальной программой-конвертером для непосредственной загрузки в карту (как правило, *.cap или *.ijc файл). Вариант языка Java, используемый для написания апплетов облегчен таким образом, чтобы апплеты были максимально быстрыми и компактными (например, из языка убрана поддержка таких типов, как string, а большая часть карточек не поддерживает и int. Сборщика мусора, как правило, нет — об этом в следующих статьях). Общение с картой производится путем отправки в карту команды, называемой APDU (Application protocol data unit), состоящей из заголовка, длиной в 5 байт и данных команды. В ответ карта может ответить двубайтовым кодом: либо кодом ошибки, либо кодом, означающим успешное выполнение операции (как правило, 90 00). Вместе с кодом успешного исполнения операции карта может передать приложению поток байт, соответствующий результату исполнения команды (например, расшифрованные данные).

На карте обычно по умолчанию уже существует как минимум один апплет, называемый ISD или Card Manager, который обеспечивает базовый функционал (например, установку и удаление апплетов). Иногда производитель устанавливает в карту и другие апплеты (например, апплет поддержки PKCS#11 или электронного кошелька).

Большинство Java-карт несут на себе криптографический сопроцессор, ускоряющий выполнение операций шифрования и расчетов контрольных сумм апплетами. К числу наиболее используемых относятся DES, AES, RSA и SHA1. Полный список поддерживаемых алгоритмов можно найти в JavaCard SDK. Список алгоритмов, поддерживаемых конкретной картой — в документации на конкретные карты (да, как правило, картой стандарт поддерживается не полностью, например, из-за экспортных ограничений).

Технически код апплета представляет собой экземпляр класса, унаследованного от некоторого абстрактного класса JavaCard API (Applet), методы которого обеспечивают базовый функционал (обработку установки, реакцию на команды от компьютера). Все члены класса апплета являются персистентными и хранятся в EEPROM карты. Таким образом, если у экземпляра класса апплета имеется поле short x = 5 и в результате исполнения APDU команды апплет поменял это значение, после удаления карты из компьютера и ее вставки обратно в считыватель, апплету будет доступно измененное значение.

Объем оперативной памяти карты (RAM) обычно невелик и зависит от реализации. Обычно не более 1Кб.

Для защиты карты используются ключи доступа. Обычно их три — ключ шифрования (ENC/AUTH), ключ подписи (MAC) и ключ шифрования важных данных (DEK/KEK), используется при изменении ключей доступа к карте, как правило). Обычно это 3DES2 ключи длиной 16 байт каждый. Знание этих ключей необходимо только для манипуляций с апплетом (запись и удаление, чтение списка установленных на карту апплетов). Отправка команды вашему апплету и получение ответа от него не требуют знания этих ключей.

Для общения с картой из вашего Windows-ПО используется SmartCard API, позволяющий прозрачно общаться со всеми картами, соответствующими стандарту, независимо от типа карты и считывателя. Во многих языках программирования (Java, .NET, Delphi и другие) существуют библиотеки-обертки для общения с картой, обеспечивающие требуемый функционал в удобной для разработчика форме классов / компонентов.

Некоторые карты на рынке (такие как Gemalto CyberFlex Egate 32k) имеют встроенный USB интерфейс и могут использоваться со считывателем, который можно «спаять» чуть ли не в домашних условиях. Правда, такие карты заметно дороже обычных. Стоимость считывателя для карт с USB интерфейсом при больших партиях может составлять около 1$. Стоимость стандартного считывателя, как правило, имеющего встроенные в Windows драйверы при производстве на китайских мощностях — несколько долларов.

Карты поставляются как в форм-факторе SIM-карты сотового телефона, так и в «большом» формате.

API для работы с картами умеет реагировать на вставку и извлечение карты, что позволяет реализовывать с использованием карт, например, систем учета рабочего времени сотрудников (надо уйти — поместил карту в ридер или сам ридер со своей картой в ПК. Софт отреагировал, попросил апплет подписать случайные данные, проверил подпись и произвел регистрацию).

4. Почему Java-карты удобно использовать для защиты ПО


В Java-карту владельцем может быть загружен один или несколько апплетов, реализующих практически любые алгоритмы (сложность, конечно, ограничена быстродействием процессора карты и объемом доступной памяти). Но эти апплеты не могут быть прочитаны из карты никем, включая владельца карты (апплет можно только стереть и записать новый на его место). Вы можете только передать апплету некоторую команду и получить ответ. Идеальный «черный ящик».

Стандарт GlobalPlatform допускает удаленное безопасное обновление апплетов, например, через Internet. При этом использованием криптографических алгоритмов гарантируется, что исходный код апплета не может быть перехвачен третьей стороной (мне приходилось писать клиент-серверные решения для таких операций. Не могу сказать, что все просто, поскольку карты все же разные, но, тем не менее, это вполне возможно).

Java-карта обычно защищена от электронного съема информации специальными методами (т.е. изготовить ее копию невозможно). Помните, что мы говорим о конкретных картах, реализующих конкретные стандарты. Некоторые карты Mifare, например, которые в прошлом использовал наш метрополитен, можно легко клонировать (правда, это не Java карта), тогда как произведенные по технологии IBM JCOP — обычно очень сложно.

Апплет может самостоятельно заблокировать (для разблокирования понадобится установить защищенную сессию, что требует знания ключей доступа к карте) или уничтожить карту (дальнейшая работа с ней любыми средствами будет невозможна, карта все время будет отвечать ошибкой).

Многие Java-карты сертифицированы по стандартам EAL (некоторые JCOP сертифицированы, например, по EAL4+, EAL5), что гарантирует надежную защиту. Некоторые карты используют, например, в качестве электронных кошельков такие компании как Visa.

Стоимость некоторых Java-карт при закупках в больших партиях очень мала (некоторые простые варианты JCOP стоят несколько евро при больших партиях). Сравните эту стоимость со стоимостью некоторых специализированных ключей защиты вроде HASP или Guardant, большинство вариантов которых, кстати, не позволяет располагать в памяти ключа произвольные алгоритмы.

Вариант языка Java, используемый для написания апплетов является предельно простым для изучения и использования
Все инструменты для работы с большинством карт, представленных на рынке, являются открытыми и бесплатными.

5. Можно ли взломать ПО, защищенное Java-картой?


Сложность взлома ПО, защищенного картой зависит от сложности алгоритма, который вы поместите в карту. Например, если вы расположите в карте апплет, который будет суммировать два переданных числа и возвращать результат, есть хорошие шансы, что первый же хакер изготовит эмулятор. Ему даже софт ломать для этого не придется (достаточно подменить dll в Windows, которая общается с картой). Правда, нужно заметить, что в этом случае вы сможете выпустить версию V2 вашего апплета, который будет суммировать уже три числа и будет, таким образом, “более устойчив” к взлому.

Но, например, если вы написали программное обеспечение, которое использует карту для формирования электронной подписи документов с помощью RSA ключей, которые вы поместили в апплет, такое ПО будет невозможно взломать, поскольку совершенно невозможно извлечь ключ RSA из апплета, если сам апплет этого не хочет. Впрочем, как правило, механизмы защиты, помещаемые в апплет, представляют собой нечто среднее между двумя приведенными примерами и об этом мы еще поговорим.

6. Выбор Java карты


Выбирая карты для защиты своего ПО, будьте внимательны.

  • Изучите все документы и характеристики карт, которые вам предлагают.
  • Убедитесь, что карты сертифицированы и защищены от атак.
  • Обращайте внимание на перечень поддерживаемых картой алгоритмов. Например, на некоторых дешевых JCOP отключены AES и RSA (алгоритмы могут быть отключены не полностью. Скажем, будет доступна работа только с ключами ограниченной длины).


Что касается меня, с легким сердцем я могу советовать использовать лишь NXP JCOP или Gemalto TOP (и их старшие версии).

7. Где купить


Вообще карты лучше покупать за рубежом у проверенных поставщиков, работающих с крупными компаниями. В России цены на них просто дикие (хотя, все, конечно, зависит от количества). Но для тестов или начальной разработки их можно купить в интернет-магазинах. К сожалению, на маленькую партию карточек мало кто даст вам хорошую цену. Но на пробу вполне реально купить пару штук.

8. Благодарность терпеливым читателям


Спасибо всем, кто дочитал до этого места. Благодарности и негодования принимаются.

Буду рад любым вопросам в комментариях и постараюсь обновлять статью так, чтобы она включала ответы.
Tags:
Hubs:
+3
Comments10

Articles

Change theme settings