Академический Документы
Профессиональный Документы
Культура Документы
Все потоки Разработка Администрирование Дизайн Менеджмент Маркетинг Научпоп Войти Регистрация
Думаю, для профи-карточников первая часть будет представлять бо́льший интерес, а вторая часть будет
интересна, прежде всего, новичкам в этой теме (и будет иметь метку Tutorial). ЧИТАЮТ СЕЙЧАС
1. При помещении каждой карты в ридер эта карта считается устройством Plug&Play, для нее Как заработать на веб-скрапинге
системой «ищутся драйверы».
11,7k 22
2. Если мы дождались окончания п. 1, то система начинает искать на карте сертификаты, при этом
общаясь с ней своими APDU, эти APDU смешиваются с нашими и возникают коллизии,
Лазер: разрушительное оружие или
полезный инструмент?
приводящие к сбоям в наших программах.
Мегапост
Эти факторы доставили мне много боли при переходе с XP, пока я их не победил. Как это сделать,
расскажу во второй части.
Редакторский дайджест
Разработка начата под эгидой одного из ведущих (и на момент создания, и сейчас) игроков карточного Присылаем лучшие статьи раз в месяц
рынка.
Поддерживаются обе ветки Python (2 и 3). Электропочта
В рабочем окружении я использую связку pyscard + Python 2.7, но, для статьи, мне показалось
правильным задействовать актуальную на сегодня ветку Python (3.6)
На мой взгляд библиотека pyscard спроектирована не особо pythonic и больше напоминает порт
какого-то Java фреймворка, однако полезности её это не уменьшает, по крайней мере для меня, хотя
имена модулей выглядят странно, конечно.
Отдельно стоит упомянуть пакет smartcard.scard, который отвечает за связь с карточным API
операционной системы. Если не нужны все абстракции библиотеки, а только голый PC/SC, то вам сюда.
Мы же на нём подробно останавливаться не будем.
с PyPi (pip install pyscard) — подходит для систем, настроенных на сборку артефактов из
исходников, используется swig (ок для mac и, возможно, linux)
2. Бросим взгляд на, по моему мнению, важнейшие объекты библиотеки, что должно убедить
пользоваться не низкоуровневым smartcard.scard, а именно smartcard;
Какие задачи решает (практически любая) программа, работающая со смарт-картами в ридере? А вот
эти:
4. Проверка карты на соответствие нашим критериям (мы можем захотеть работать не с каждой
картой, которую пользователь нам подсунет)
Подклассы CardType
Позволяют нам указать точный тип карт, с которыми наше приложение собирается работать. Можно
сделать так, чтобы наше приложение даже не реагировало на помещение в ридер карты, которая нам
не подходит.
Примеры:
CardType.ATRCardType (существует в библиотеке) — фильтрация карт по значению ATR. Наше
приложение будет реагировать только на карты с определенным значением ATR.
CardConnection
Канал коммуникации нашего приложения с картой, позволяет отправлять на карту APDU и получать
ответ, ключевой метод здесь — transmit(). Именно с его помощью происходит непосредственное
взаимодействие нашего приложения с картой. Необходимо отметить, что метод transmit() всегда
возвращает триплет (кортеж), состоящий из:
Ответных данных (содержит реальные данные или None, в зависимости от типа APDU, не все APDU
возвращают данные)
CardConnectionDecorator
Слово «декоратор» используется здесь в том же контексте, что и в Java, а не в том, к которому привыкли
Python-разработчики.
Позволяет придать особые свойства объекту CardConnection. Библиотека предоставляет рабочие
декораторы с говорящими названиями: ExclusiveConnectCardConnection и
ExclusiveTransmitCardConnection. Лично я не ощутил эффекта от использования этих декораторов —
если система (Windows) уж решила вклиниться со своими APDU в нашу сессию, то ни один из этих
декораторов не спасет, но, возможно, я что-то не так делал.
Функция System.readers()
Позволяет получить список подключенных к системе кардридеров и установить связь с картой в
определенном ридере.
sw.ErrorChecker, sw.ErrorCheckingChain
По умолчанию, в ходе обмена данными между картой и нашего приложением, никакие ошибочные
значения StatusWord (SW1, SW2) не возбуждают исключений. Это можно изменить, задействовав
потомков ErrorChecker, которые:
Потомки CardConnectionObserver
Присоединяются к экземпляру CardConnection и получают информацию обо всех командных APDU и
ответах карты, которые проходят через наблюдаемое соединение. Пример применения — ведение лога
команд и ответов от карты.
Функция select_reader()
Возвращает первый ридер, подключенный к компьютеру или None, если подключенных ридеров нет.
Код
Класс APDUShell
Данный класс, помимо наследования от cmd.Cmd, реализует интерфейс обладает поведением
наблюдателя smartcard.CardMonitoring.CardObserver
В конструкторе
Код конструктора
update()
Код
default()
Код
_set_up_connection()
Код
Трудяга, который помогает нам каждый раз, когда карта в ридере меняется. Он создает соединение с
картой, навешивает на него ConsoleCardConnectionObserver, и запоминает ATR карты (чтобы команда atr
могла вывести его на экран).
_clear_connection()
Код
Заключение
На данном этапе мы можем запустить нашу командную оболочку и, в зависимости от наличия кард-
ридера, получить просто сообщение об ошибке (ридера нет) или увидеть шелл в работе (счастливчики с
ридером). При наличии ридера ничто не мешает вставить в него любую смарт-карту и выполнить
команду atr — должно сработать, однако, прошу не забывать, что на своих рабочих SIM и банковских
картах вы экспериментируете на свой страх и риск.
До встречи во второй части, предполагаю, что там Python-а не будет (почти или совсем), но будут APDU
и SW.
При подготовке статьи мне попалась пара проектов, которые используют данную библиотеку:
https://bitbucket.org/benallard/webscard/src
https://github.com/mitshell/card
Может реальные примеры кода окажутся полезными.
@ brake
Пользователь
ПОХОЖИЕ ПУБЛИКАЦИИ
ЗАКАЗЫ
0+ ₽
Удобный браузер
Браузер, который умеет сохранять их
и синхронизировать пароли между устройствами.
ПОДРОБНЕЕ YANDEX.RU
Реклама
Del
Подкаст: Build 2020 глазами инсайдера
— ИИ, суперкомпьютеры, нейросети и
Linux на Windows
mihmig 11 января 2018 в 08:46 0
Мегапост
Есть карт-ридер и несколько банковских карт с истёкшим сроком действия (пин-коды известны)
Возможно ли «заиспользовать» их в своём DIY-проекте?
Или в банковских картах используются нестандартные команды?
С банковскими картами я незнаком, но предполагаю, что часть команд ISO 7816-4 должна поддерживаться
(хотя бы SELECT, GET RESPONSE, READ BINARY, READ RECORD). Команды, думаю, стандартные, но стандарты
там свои.
Схема там, судя по интернетам, обычная для UICC — выбираем приложение по AID и вперед.
AID для Visa и MC известны.
Без ключей шифрования ничего не сделаете. Да и доступ к файловому менеджеру карты тоже закрыт.
В смысле, там каждый APDU шифруется и/или подписывается? Понятно, что финансовых операций не
совершим, но выбрать/прочитать какие-то файлы можно (если знать об их существовании)? Или там
общение происходит "инвелопами", типа как OTA в телекоме?
Ключи шифрования — они для транзакций. Да, они тут ни при чём, промахнулся.
Есть такой механизм защиты — брандмауэр аплетов, разграничивающий права доступа к общей и
защищённой областям памяти (к полям и методам аплета). Файл приложения тоже вряд ли
прочитаете.
Да, возможно. Пин-коды правда можно выкинуть, но считать данные с чипа карты (напр. её номер) и
воспользоваться ими ничего не мешает. См. Book 3 – Application Specification. Как шпаргалку можно
использовать этот туториал (на javascript).
Приложение на банковской карте не блокируется по истечению срока действия. Хотя команда для
блокировки приложения есть, банками она как правило не используется в этом случае. Читаются все
файлы и теги платёжного приложения.
Можно ли использовать смарт-карту для входа в систему Windows без использования AD?
Может есть какой сторонний софт?
«Особенность» Вконтакте
+90 29,9k 46 78
Мегапост
Блокировка карт Payoneer Prepaid Mastercard® Card за пределами США Как российские и зарубежные города
+17 17,3k 12 74 внедряют интернет вещей
Песочница Конфиденциальность
Если нашли опечатку в посте, выделите ее и нажмите Ctrl+Enter, чтобы сообщить автору.
© 2006 – 2020 «TM» Настройка языка О сайте Служба поддержки Мобильная версия