В данной статье опишу как быстро интегрировать в свое приложение механизм авторизации при помощи бескотактных смарт-карт. Кстати такая есть в современных “биометрических” заграничных паспортах.
Исходные данные
- Считыватель смарт-карт ACR-122U.
- Карты, метки, брелоки, браслеты MIFARE 1K для хранения ключа.
- Готовый модуль из sdk-acr122 для отправки ADPU команд.
Первые две позиции в огромном количестве как на eBay, так и на Aliexpress. Так же в исходные данные хочу внести ясность, что этой статьи не достаточно чтобы стать гуру смарт-карт, а только для того чтобы через пол часа запустить механизм их использования в своем проекте.
Общая теория
У карты MIFARE 1К шестнадцать (0 – 15) секторов, в каждом секторе 4 (0 – 3) блока по 16 байт каждый. Последний, блок каждого сектора содержит информацию о ключах (их 2 – A и B) и маске доступа к блокам данных (1-3) по каждому из ключей.
Никакого сервиса по поводу сквозного доступа ко всей памяти карты которой у 1К = 15 * 3 * 16 = 720 байт памяти (остальное под ключами) – нет.
Битовая маска задает что можно делать ключом KEY_A и что KEY_B. Авторизовываться необходимо для каждого сектора, другими словами вы можете назначить свои KEY_A и KEY_B для каждого сектора и хранить там разные данные или взаимосвязанные и при дальнейшем использовании “раскрывать матрешку” по своему алгоритму.
В нашем примере, когда надо организовать авторизацию в нашем приложении, нам будет достаточно KEY_A. Думаю не надо объяснять, что второй ключ надо при этом сменить с значения по умолчанию (FFFFFFFFFF или ноли) т.к. используя ключ KEY_B тоже можно “натворить делов”.
Сценарий чтения/записи
- Загрузка ключей (1 или 2) в память ридера. Обращу внимание, что ключи стираются из памяти ридера при отключении от USB порта.
- Авторизация любого блока из сектора, в котором планируется чтение/запись. Нет необходимости авторизации каждого блока внутри одного сектора.
- Чтение/запись.