Эта статья является уже третьей в серии об использовании смарт-карт. Первая — Смарт-карты и программирование — была написана в 2017 году и все примеры в ней были на языках C и C++. Вторая — Смарт-карты и программирование (java) — в 2019 и в качестве базового использовался язык Java. И вот пришло время для очередной переработки, на этот раз всё на примере python3, код на котором получается компактным, выразительным и понятным. Кроме нового языка за эти годы накопились отзывы, замечания и предложения, появился опыт использования других устройств (криптографических USB-токенов, других типов бесконтактных карт), всё это отражено в тексте, который значительно отличается от предыдущих статей в структуре и формулировках.
Если вы только знакомитесь с этими технологиями, рекомендую читать именно эту статью, я постарался в ней учесть все недостатки прошлых, уточнить и прояснить терминологию, а также более детально раскрыть некоторые моменты. Ещё я добавил несколько новых разделов, которых не было в прошлых статьях: чипы Mifare Ultralight, NFC-метки и NDEF, прямое обращение к радиомодулю считывателя для выполнения произвольных команд NFC, банковские карты МИР, SIM-карты.
Мы все активно пользуемся смарт-картами, даже не зная этого, чиповые банковские карты, NFC-метки, бесконтактные пропуски-ключи, USB-ключ для электронной подписи, сим-карты в телефонах — это всё смарт-карты. В этом очень большом тексте я детально расскажу об использовании смарт-карт на уровне прикладного ПО. Здесь будет много теории, много ссылок на стандарты и спецификации, много кода. Я не ставил цель написать энциклопедию, для этого формата статьи не хватит, но дать обзорное представление о предметной области вполне можно. В конце есть список книг, в которых тема смарт-карт раскрыта детально и системно.
Я выбрал Python за его простоту, доступность, удобство использования и богатую библиотеку модулей. От вас не требуется никаких дополнительных знаний, кроме Python и операционной системы, на которой вы будете запускать код. Изначально всё программное окружение ориентировано на Unix-подобные системы — разнообразные варианты Linux и macOS, однако всё должно работать и в Windows (однако я не проверял). Все демонстрационные программы используют консоль (терминал), поэтому должны работать примерно одинаково везде, я не использую никаких GUI-библиотек, только командную строку.
В тексте статьи нет разделения на отдельный блок с теорией и примерами, вместо этого теория и примеры чередуются, поэтому вы увидите первый код практически в самом начале.
Практически все доступные сторонние материалы (стандарты, спецификации, книги) написаны по-английски, поэтому вам нужно его знать, если хотите самостоятельно изучить тему более глубоко.
Если у вас есть предложения по содержимому, можете писать прямо в комментариях или напрямую на мой email: [email protected]
В 2017 году я написал статью Смарт-карты и программирование с примерами кода C/C++. Однако для обучения этот язык подходит плохо, поскольку предполагает достаточно низкоуровневое и многословное использование функций и данных, поэтому я решил сначала переписать все примеры на Java, однако в процессе пришлось значительно переосмыслить старый текст, обновить и переработать с учётом накопившегося опыта, ошибок и замечаний.
Статья 2017 «заморожена» и я не планирую её больше обновлять, однако вы можете её читать, если хотите понять, как всё работает на сравнительно низком уровне, где вручную нужно выделять и освобождать ресурсы, инициализировать буферы и так далее.
Это очень большой текст о смарт-картах и о том, как писать клиентский софт на Java для их использования. От вас требуется только знание Java, понимание базовых алгоритмов, структур данных и, собственно, смарткарты с терминалами. Все примеры ориентированы на unix-окружение, в первую очередь это linux и mac os x. Мобильные операционные системы не рассматриваются. Код, вероятно, работает в windows-окружении, однако я это не тестировал. Все примеры полностью независимы друг от друга и не используют никакие сторонние библиотеки или общие файлы.
Язык Java я выбрал по нескольким причинам. Во-первых, он достаточно высокого уровня и вы избавлены от ручного управления памятью. Во-вторых, в Java очень богатая стандартная библиотека. В третьих, Java как платформа работает на разных операционных системах практически одинаково, что очень упрощает процесс обучения. И самое главное, в штатной поставке платформы уже есть поддержка библиотеки для работы со смарт-картами. Я выбрал современную базовую версию SDK — 11 — и все примеры кода написаны с учётом работающих в этой версии фич (типа использования ключевого слова var
для автоматического вывода типов).
❈ ❈ ❈
Для выполнения всех примеров кода вам нужен USB-терминал (ридер) для смарт-карт. В некоторых примерах можно использовать USB крипто-токен (eToken, yubico и т.п.), они используют тот же программный интерфейс.
Ещё в статье очень много новых англоязычных терминов, сокращений, ссылок на международные стандарты и спецификации. Слишком глубоко в детали я вдаваться не стану, но буду ссылаться на внешние документы. Очень желательно как минимум понимать английский, так как все оригинальные стандарты и спецификации написаны на нём.
Для более глубокого понимания вам нужно обязательно иметь под рукой упоминаемые стандарты. К сожалению, стандарты ISO/IEC недоступны для свободного скачивания, однако их при желании можно найти в интернете. Их официальные русские переводы (ГОСТ), однако, свободно доступны и ссылки на них вы найдёте в тексте.
Другие стандарты доступны для свободного скачивания и я тоже дам ссылки на них.
Внимание. Данный текст — устарел, я написал новую статью Смарт-карты и программирование (java), где в качестве языка примеров используется Java, а не C/C++. Если вы хотите просто узнать о смарт-картах, то читайте новую статью.
В новом тексте исправлены ошибки, уточнены формулировки, а также добавлены новые примеры, например, работа с контактными картами памяти SLE5542. Кроме того, там теперь есть оглавление.
Это статья о смарт-картах и о том, как писать софт для работы с ними. Никакого опыта в предметной области от вас не требуется, только знание C и C++ для понимания примеров кода, а также базовых структур данных, битов, байтов, указателей, malloc/new/free/delete и так далее. Все примеры ориентированы на unix-окружение, в первую очередь это linux и mac os x. Windows и мобильные операционные системы не рассматриваются.
Для всех примеров кода вам нужен десктопный терминал-ридер для смарт-карт. Для некоторых примеров подойдёт USB-крипто-токен — они работают через тот же интерфейс, что и смарт-карты.
Ещё в этом тексте будет очень много новых англоязычных терминов, сокращений, ссылок на международные стандарты и спецификации. Слишком глубоко в детали я вдаваться не стану, но буду ссылаться на внешние документы.
Очень желательно знать английский язык, так как все оригинальные стандарты и спецификации написаны на нём.
Первые примеры будут на С — это язык библиотеки pcsc, а затем переключусь на C++11 и собственную библиотеку-обёртку над pcsc.
Примерный план статьи:
- как подключиться к библиотеке;
- как подключиться к терминалу;
- базовые сведения об архитектуре PC/SC, терминология;
- базовые сведения о коммуникации с картой;
- несколько простейших примеров с картами;
- работа с «тупыми» бесконтактными картами памяти Mifare;
- более подробно о работе с микропроцессорными картами;
- пример работы с банковской картой.
Опишу несколько полезных вещей, которые я систематически использую. В основном они касаются организации рабочего пространства и опций конфигурационного файла sublime text 3.
Это древний текст, он уже неактуален и вряд ли кому понадобится, но пусть хранится для истории.
Работа с данными: адаптеры и отображение. Плюс работа с обработчиками событий виджетов.
Начиная с этой статьи, я больше не буду придерживаться строгого порядка нумерации, а также не буду вдаваться в откровенно простые вещи, которые можно прочитать в официальных руководствах.
В официальном руководстве есть обучающая статья про данные, называется она Saving Data. К сожалению, статья не очень понятная, а ещё перегруженная совершенно не нужными для обучающего текста данными (паттернами и прочим энтерпрайзом). Я постараюсь в моей статье раскрыть тему хранения и отображения данных более понятно (и по-русски).
Во многих организациях есть внутренние проекты, которыми занимается программисты ИТ-отдела. Такие проекты часто скатываются в говно (как программное обеспечение), ибо релизить не надо, все пользователи под боком, на проблемы апгрейда-миграции пофиг — весьма распространённое мнение, между прочим. Намерения у программистов может и благие, но результат почти всегда плачевен: обязательно настанет время, когда прибить новый костыль к программе окажется некуда.
Совсем печально становится, когда такой проект достаётся «в наследство» от предыдущих поколений программистов. Многие программисты считают, что такой проект — это карьерный тупик, поэтому найти квалифицированного разработчика на легаси (=legacy) проект часто очень сложно — они воспринимают такую работу как нечто вроде ИТ-ассенизатора. В чём-то они правы, однако не всё так плохо, поскольку такая работа предоставляет редкий шанс проявить себя в роли «решателя проблем» — весьма полезный навык, пригодится в будущем, если решите пойти по менеджерской лестнице.
Продолжу тему айтишных книг, начатую вот в этом посте. Прошло уже три года, некоторые книжки переосмыслились, накопился новый опыт, прочитались новые книжки.
На этот раз я решил не ограничиваться простым перечислением списка, а описать свои впечатления и размышления от каждой книги. Если название и авторы книги указаны по-русски, то книга читалась в переводе; если по-английски, то читалась в по-английски в оригинале.
Пост будет периодически обновляться. Последнее обновление: 22 ноября 2012 г.
Это древний текст, он уже неактуален и вряд ли кому понадобится, но пусть хранится для истории.
Java-классы проекта, макеты интерфейсов, ресурсы, доступ к ресурсам из кода
Сегодня займёмся редактированием кода проекта. В самом начале я заявил, что знание Java необязательно, однако это не значит, что я тут буду заниматься обучением этому языку, вам придётся самим что-то по этой теме читать; книг и обучающих ресурсов предостаточно, какие-то из них можно найти в ссылках в конце этой статьи.
Запускаем eclipse командой eclipse-adt
, там должен уже быть проект, который мы создали в прошлой части — first project, также запускаем эмулятор с виртуальным девайсом с Android 2.3.3.
Это древний текст, он уже неактуален и вряд ли кому понадобится, но пусть хранится для истории.
Работа с проектами в eclipse, создание первого android-приложения, структура apk-файлов
А статья уже довольно сильно устарела, часть скриншотов точно не соответствует реальности, часть текста тоже. Такие дела.
В этой статье мы наконец создадим в Eclipse ADT первое работающее андроидное приложение. И не просто создадим, но и проверим его работу в виртуальном девайсе.
Как и в любой интегрированной среде разработки, в Eclipse ADT создание работающего приложения сводится к трём шагам:
- создание андроид-проекта в Eclipse (минимальный шаблонный проект);
- написание программного кода, рисование дизайна и т.п.;
- «компиляция» проекта в окончательный apk-файл.
Это древний текст, он уже неактуален и вряд ли кому понадобится, но пусть хранится для истории.
Установка Eclipse, установка компонентов для android-разработки, настройка рабочего окружения
В прошлой части мы поверхностно ознакомились с инструментами Android SDK, поигрались с эмуляторам и виртуальными девайсами. В этой статье займёмся подготовкой рабочего места андроид-кодера — будем настраивать Eclipse ADT.