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


image

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

Для прочтения и осознания информации из статей вам понадобятся следующие навыки:

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

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

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




В 90% случаев вы не сможете придумать такого алгоритма, который обладал бы всеми следующими свойствами:
  • при удалении этого алгоритма из программы, ваше ПО становилось бы полностью нефункциональным
  • хакер не мог бы угадать и сэмулировать этот алгоритм

Если вы попали на эти 90%, то вам в обязательном порядке следует:
  • Шифровать все коммуникации с картой
  • Защищать свое программное обеспечение навесным протектором типа Themida

1. Шифрование обмена данными с картой


Если вы желаете выстроить надежную защиту, ключи шифрования трафика должны меняться. Новый ключ следует генерировать как минимум каждый раз, когда запускается ваше приложение. Генерировать сессионные ключи следует на основании данных, как предоставленных картой, так и вашей программой. Механизм защищенной сессии может в примитивном варианте выглядеть, например, так:

  • Есть некий мастер-ключ DES M. Его знают карта и софт.
  • Карта генерирует 4 байта случайных данных (Ccard), софт генерирует 4 байта случайных данных (Csoft). Они обмениваются друг с другом этой информацией.
  • Карта и софт совмещают оба массива (Ccard + Csoft), шифруют получившийся набор байтов мастер-ключом M. Получается 8 байт ключа 1DES, которым впоследствии будет шифроваться весь обмен в текущем сеансе.


Внимание! Ни в коем случае не делайте так, как описано.

В случае, если расшифрованные данные кажутся карте некорректными, ее следует заблокировать. Самый простой вариант реализовать подобный вариант — завести в классе апплета булево поле CardIsLocked и проверять его содержимое в методе process перед вызовом метода, соответствующего переданному коду команды. Если CardIsLocked — отдавать софту вместо данных ошибку.

2. Использование возможностей Themida


Themida по праву считается одним из самых трудных для снятия протекторов. Однако просто повесить сверху проектор — мало. Если вы желаете построить действительно надежную защиту, вам следует задействовать API Themida в полной мере:
  • Обязательно используйте для защиты механизм виртуальных машин Themida
  • Обратите особое внимание на раздел справки Themida, который называется «SecureEngine® Macros». Разрабатывая свой собственный механизм безопасной сессии для общения с картой, заключите весь код, обеспечивающий коммуникацию с картой в такие макросы, как VM_Start/End, Code_Replace_Start/End.
  • Обычно защищенная сессия обмена данными с картой устанавливается один раз при запуске приложения. Если это справедливо и в вашем случае, поместите код, отвечающий за начало защищенной сессии в макросы Clear_Start/End, чтобы после установки защищенной сессии, код, который это делает был удален из адресного пространства процесса.
  • Используйте внутри функций, работающих с картой, макросы CheckProtectionStart/End, CheckCodeIntegrityStart/End.
  • Не позволяйте запускать вашу программу под виртуальными машинами (если это не требует ваше приложение)


3. Криптографические ловушки. Несколько из поджидающих вас миллионов.


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

Не изобретайте собственных супер-секретных-никому-не-известных собственных алгоритмов шифрования и хеширования. Помните о судьбе GSM A5/3 шифра и его бедных авторах, решивших, что уж они-то суперкриптографы.

Спроектировав супер-стойкую систему защиты не оставляйте в ней тупых дырок, вроде той в банковском клиенте на базе BS-Client.

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


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

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




К сожалению, не доступен сервер mySQL