Arduino rfid cards

Ардуино и RFID

RFIDRadio Frequency IDentification или радиочастотная идентификация — способ автоматической идентификации объектов, в котором при помощи радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках.

Любая RFID-система состоит из считывающего устройства (ридера) и RFID-метки.

Большинство RFID-меток состоит из двух частей. Первая — интегральная схема (ИС) для хранения и обработки информации, модулирования и демодулирования радиочастотного (RF) сигнала и некоторых других функций. Вторая — антенна для приёма и передачи сигнала.

Идентификация объектов производится по уникальному цифровому коду, который считывается из памяти RFID-метки.

По дальности считывания RFID-системы можно подразделить на системы:

  • ближней идентификации (считывание производится на расстоянии до 20 см);
  • идентификации средней дальности (от 20 см до 5 м);
  • дальней идентификации (от 5 м до 300 м).

RFID метки подразделяются на три типа в зависимости от частотного диапазона:

  • метки диапазона LF (125—134 кГц);
  • метки диапазона HF (13,56 МГц);
  • метки диапазона UHF (860—960 МГц).

В повседневной жизни мы постоянно используем RFID-системы — домофоны, допуск на охраняемую территорию, контроль за посещаемостью рабочих мест, управление устройствами — это всё примеры RFID. Разобравшись, как устроены RFID-системы, вы сможете сделать собственный проект, например, систему контроля доступа в школе.

В этом уроке мы научимся подключать RFID-ридер RC522 к Ардуино Уно и считывать данные с RFID-меток. Модуль RC522 имеет дальность обнаружения до 6 см и предназначен для чтения и записи RFID меток с частотой 13.56 МГц.

Источник

Аутентификация пользователей на Arduino с RFID

Введение

Передача аутентификации

В Caché есть механизм делегирования аутентификации — передачи процесса аутентификации пользовательскому коду. Чтобы его включить, надо сделать следующее:

    Написать код аутентификации пользователей в рутине ZAUTHENTICATE. У неё есть 4 точки входа: получения логина/пароля, их проверка и назначение прав, смена пароля, формирование токена. Подробнее об этом ниже.

Включить передачу аутентификации в Caché (SMP → System Administration → Security → System Security → Authentication/CSP Session Options, установите флаг Allow Delegated authentication и сохраните настройки).

  • Включить передачу аутентификации для требуемых сервисов (SMP → Menu → Manage Services → Сервис → Allowed Authentication Methods → выбрать Delegated → Save) и/или приложений (SMP → Menu → Manage Web Applications → Приложение → Allowed Authentication Methods → выбрать Delegated → Save).
  • Как это работает

    Вот что происходит, когда пользователь аутентифицируется в сервисе или веб-приложении, для которого включена передача аутентификации:

      Вызывается рутина ZAUTHENTICATE. Код этой рутины пишется пользователем и может быть любым Caché ObjectScript кодом, в том числе и $ZF вызовы.

    Следующий шаг зависит от того, был ли успешным вызов ZAUTHENTICATE:

      Если вызов ZAUTHENTICATE успешен и это первый раз, когда данный пользователь аутентифицируется с ZAUTHENTICATE, то для него создаётся запись пользователя типа “Delegated user”. Если ZAUTHENTICATE назначает пользователю права или другие свойства, они становятся соответствующими свойствами пользователя.

    Если вызов ZAUTHENTICATE успешен и это не первый раз, когда данный пользователь аутентифицируется с ZAUTHENTICATE, то его запись пользователя обновляется.

    Если вызов ZAUTHENTICATE не успешен, пользователю выдаётся ошибка доступа.

    Если для инстанса и сервиса включена двухфакторная аутентификация, то производится поиск номера телефона пользователя и оператора. Если они заданы, происходит двухфакторная аутентификация, если нет — юзер не аутентифицируется.

  • Делегированный пользователь отображается в таблице пользователей.
  • Откуда пользователи?

    Есть два метода аутентификации в зависимости от того какие способы аутентификации включены для приложения/сервиса:

      Delegated — имя/пароль берутся из GetCredentials, проверяются средствами ZAUTHENTICATE (тип пользователя — делегированный).

  • Delegated и Password — имя/пароль берутся из GetCredentials, проверяются стандартными механизмами Caché (тип пользователя — Caché).
  • Теперь перейдём к рассмотрению рутины ZAUTHENTICATE и её точек входа.

    ZAUTHENTICATE

    Эта основная рутина, содержащая 4 точки входа.

    ▍GetCredentials

    Эта точка входа вызывается в том случае, когда передача аутентификации включена для сервиса, и она вызывается вместо запроса логина/пароля у пользователя. Код этой рутины устанавливает логин и пароль (любым способом). Впоследствии (вне этой рутины) полученные логин и пароль аутентифицируются, будто пользователь их ввёл как обычно. Метод получения логина и пароля может быть любой — ввод с клавиатуры, API, считывание внешнего устройства — в этой статье будем использовать аутентификацию с помощью RFID карты.

    Данная точка входа возвращает статус, и если это ошибка, то она будет записана в аудит, а попытка аутентификации будет отклонена. Исключение — ошибка $SYSTEM.Status.Error($$$GetCredentialsFailed), в таком случае пользователю предложат ввести логин/пароль стандартным методом Caché. Сигнатура следующая:

    • ServiceName — название сервиса, через который идёт подключение
    • Namespace — область, если указана при подключении
    • Username — имя пользователя
    • Password — пароль
    • Credentials — в настоящее время не используется

    Отмечу важную особенность этой точки входа. Если для сервиса/приложения включена и передача аутентификации и обычная аутентификация по паре логин/пароль (Password Authentication), то логин и пароль, полученные через GetCredentials, будут использованы для стандартной аутентификации по паролю.

    ▍ZAUTHENTICATE

    В случае если первоначальная аутентификация успешна, ZAUTHENTICATE устанавливает роли и другие свойства пользователя. В случае если это не первая аутентификация, свойства могут быть изменены. Для этого в коде рутины устанавливаются свойства массива Properties. Сигнатура:

    • Properties(«Comment») — комментарий
    • Properties(«FullName») — имя и фамилия
    • Properties(«NameSpace») — стартовая область
    • Properties(«Roles») — список ролей через запятую
    • Properties(«Routine») — стартовая рутина
    • Properties(«Password») — пароль
    • Properties(«Username») — имя пользователя
    • Properties(«PhoneNumber») — телефонный номер пользователя
    • Properties(«PhoneProvider») — оператор телефона
    • Properties(«AutheEnabled») — включить стандартную двухфакторную аутентификацию (для этого надо установить значение, равное $$$AutheTwoFactorSMS)

    ▍ChangePassword

    Точка входа для смены пароля пользователя. Сигнатура следующая:

    • NewPassword — новый пароль
    • OldPassword — старый пароль
    • Status — результат операции изменения пароля

    ▍SendTwoFactorToken

    Для использования в стандартной двухфакторной аутентификации. Определяет формат запроса и токена аутентификации. Сигнатура:

    • Application — CSP приложение или рутина, к которой подключается пользователь
    • SecurityToken — токен, который будет отправлен пользователю
    • TwoFactorTimeout — время действия токена
    • UserPhoneNumber — телефонный номер пользователя

    Пример

    Для начала покажу простейший пример для терминала Caché в Windows — сервиса %Service_Console, который будет спрашивать логин и пароль у пользователя. Включим передачу аутентификации в системе для этого сервиса. После этого напишем рутину ZAUTHENTICATE (в области %SYS):

    В терминале это будет выглядеть аналогично обычному логину.

    Перейдём к аутентификации на RFID. Идея состоит в следующем — из Caché сделаем возможность записывать в зашифрованном виде информацию на карточку, а при аутентификации будем её считывать, расшифровывать и возвращать на проверку.

    Для начала соберём схему из Arduino Uno и модуля RFID-RC522:

    Вот код на С, использующий библиотеку MF522 (там же есть распиновка для других моделей Arduino). Он по COM порту принимает 2 команды:

    • Get — по ней на com порт передаётся содержимое блоков RFID карты 2, 4, 5, 6
    • Set@bloc2@bloc4@bloc5@bloc6 — по ней содержимое блоков 2, 4, 5, 6 на карте перезаписывается пришедшими данными

    Класс Arduino.Delegate, который имеет 2 точки входа:

      SetCredentials — принимает на вход логин и пароль, шифрует их AES шифрованием с помощью ключа хранящегося в системе и записывает на RFID карту.

  • GetCredentials — получает шифротекст с карты и расшифровывает его, возвращая логин, пароль и статус операции.
  • Рутина ZAUTHENTICATE, которая вызывает класс Arduino.Delegated, метод GetCredentials:

    Готово! Собранное устройство выглядит вот так:

    Устанавливаем ключи шифрования в терминале, области %SYS (там должен быть доступен класс Arduino.Delegated):

    Где Key — ключ шифрования, IV — вектор инициализации. Они будут использоваться для шифрования логина и пароля. Подключаем Arduino к Caché и записываем на карточку информацию для аутентификации командой:

    Включаем аутентификацию Delegated и Password в нужных сервисах/веб-приложениях и можно аутентифицироваться (например, в терминале или портале управления системой) поднося карту к считывателю RFID карт.

    Возможные улучшения

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

    Повышение уровня безопасности с помощью использования двухфакторной аутентификации — сначала получать пару логин/пароль, а потом считывать карту, на которой хранится ключ, уникальный для пользователя. Затем нужно сверять полученный ключ с тем, который хранится в системе для данного пользователя. Варианты хранения произвольных данных пользователя обсуждались на Community портале InterSystems.

  • Добавить возможность хранения логина и пароля длиннее 15 символов каждый.
  • Выводы

    Гибкая система аутентификации Caché позволяет реализовать произвольную логику аутентификации пользователей.

    Источник

    Урок 6. Arduino считываем метки (RFID-модуль RC522)

    Подключение к Arduino:

    Для начала необходимо установить библиотеку RFID Library for MFRC522.

    Контакты на модуле RFID-модуль RC522 необходимо подключить к Ардуине. Для подключения удобно использовать провода папа-мама.

    Описание контактов у RFID-модуля RC522:

    • VCC — Питание. Необходимо 3.3V;
    • RST — Reset. Линия сброса. Ни в коем случае не подключать к пину RESET на CraftDuino! Данный пин цепляется на цифровой порт с PWM;
    • GND — Ground. Земля
    • MISO — Master Input Slave Output — данные от ведомого к ведущему, SPI;
    • MOSI — Master Output Slave Input — данные от ведущего к ведомому, SPI;
    • SCK — Serial Clock — тактовый сигнал, SPI;
    • NSS — Slave Select — выбор ведомого, SPI;
    • IRQ — линия прерываний;
    MFRC522 Arduino Uno Arduino Mega Arduino Nano v3 Arduino Leonardo/Micro Arduino Pro Micro
    RST 9 5 D9 RESET/ICSP-5 RST
    SDA(SS) 10 53 D10 10 10
    MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
    MISO 12 (ICSP-1 ) 50 D12 ICSP-1 14
    SCK 13 (ICSP-3) 52 D13 ICSP-3 15
    3.3V 3.3V 3.3V Стабилизатор 3,3В Стабилизатор 3,3В Стабилизатор 3,3В
    GND GND GND GND GND GND

    В комплекте с модулем RFID-RC522 идут две метки, одна в виде пластиковой карточки, а вторая в виде брелка. При необходимости их можно докупить отдельно.

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

    Необходимо проверить правильность заданных констант:

    Теперь загружаем скетч в ардуину и включаем Мониторинг последовательного порта.

    Подносим метку к ридеру и модуль считает все данные с данной метки, например уникальный идентификатор метки UID.

    Видео работы RFID-RC522:

    Источник

    Эмулятор RFID на Arduino

    Многие читали мой пост «Эмулятор RFID», где я в деталях рассказывал об устройстве EM Marine, о том как намотать антенну, и как сделать RFID-эмулятор из трёх деталей. Но, будем честны, несмотря на гениальную простоту того устройства, оно достаточно сложно для повторения. Не каждый имеет дома осциллограф, для того чтобы поймать резонанс, да и для прошивки ATtiny85 требуется отдельный программатор.

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

    Аппаратное обеспечение

    Как я уже сказал, эмулятор должен быть собран на доступных комплектующих, которые можно легко достать. Для начала рассмотрим схему эмулятора.

    У нас есть колебательный контур, который мы будем замыкать в определённое время транзистором и таким образом в считывателе будет изменяться ток, и он будет получать передаваемые данные.
    Самым сложным для нас в этой связке остаётся настроенный на частоту 125 кГц колебательный контур. И есть очень простое решение, откуда его можно взять. В продаже существует считыватель RFID-меток для Arduino RDM6300. Считыватель стоит сущие копейки, а у него в комплекте уже идёт антенна, а резонансный конденсатор уже распаян на плате. Таким образом, по сути считыватель нам нужен только для двух деталей: катушки и резонанстного конденсатора.

    Считыватель RDM6300 и расположение резонансного конденсатора.

    Я купил этот считыватель за какие-то копейки, которые несоизмеримы с трудами по намотке и настройке антенны. Самая сложная операция у нас — это отпаять данный конденсатор и припаять его на монтажную плату. Верю, что с ней справиться даже школьник младших классов.
    В результате собираем всё на макетной плате. У меня два резистора в параллели стоит только лишь потому, что на 10кОм резисторов у меня не было под рукой, а были только на 20кОм.

    Ну и посмотрим крупным планом, как это всё выглядит. Я специально под конденсатор выделил отдельную платку, там он припаян прямо на монтажные иголки, которые вставлены в этот матрац.

    Для того, чтобы проверять работу эмулятора, изначально я думал использовать тот же RDM6300 (купил их два). И даже по началу так и делал, но потом решил, что это как-то не серьёзно, одной Ардуиной отлаживать другую, и разорился на заводской считыватель.

    Взводим таймер

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

    Напомню, что у EM4102 используется схема Манчестерского кодирования. Когда идёт модуляция EM4102 протокола, время передачи одного бита может составлять 64, 32 или 16 периодов несущей частоты (125 кГц).

    Проще говоря, при передаче одного бита, у нас меняется значение либо единицы на нуль (при передаче нуля), либо с нуля на единицу (при передаче единицы). Соответственно, если мы выбираем для передаче одного бита информации 64 периода несущей частоты, то для передачи “полубита” нам нужно будет 32 периода несущей частоты. Таким образом каждый полубит должен меняться с частотой:

    Период этого “полубита” будет равен 256 мкс.

    Теперь нам нужно посчитать таймер, чтобы он нам дёргал ногу с данной частотой. Но я стал так ленив, что открыв даташит и начав зевать, решил найти какое-то готовое решение. И оказалось, что есть готовые расчёты таймеров, только вбивай свои данные. Встречайте: калькулятор таймера для Ардуино.

    Нам необходимо только забить частоту таймера 3906 Гц, и нам сразу сгенерируют готовый к использованию код. Ну не чудо ли!

    Обратите внимание, что частоту я вводил целыми, а он её посчитал дробными и именно ту, которая нам и нужна. Код инициализации таймера у меня получился следующий:

    Гениально, просто, лаконично.

    Вектор прерывания для вывода устроен тоже очень просто. Напоминаю, что нам необходимо делать переход с единицы на нуль в случае передачи нуля, и с нуля на единицу, в случае передачи единицы (смотрите рисунок для понимания). Поэтому смотрим, что мы сейчас передаём и в каком месте “полубита” находимся, постепенно считывая из массива data все данные.

    Перевод данных для передачи

    Тут тоже следует освежить в памяти форматы данных, хранимые на карте. То, в каком виде они записаны. Давайте на живом примере.

    Предположим у нас есть карта, но нет ридера. На карте написан номер 010,48351.

    Реальная карта с номером 010, 48351.

    Как этот номер нам перевести в тот серийный номер, который записан на карте? Достаточно просто. Вспоминаем формулу: переводим две части числа отдельно:

    Итого, серийный номер у нас получается: 0xABCDF. Проверим его, считываем карточку считывателем (он читает в десятичном формате), получаем число:

    Переводим его любым калькулятором в хекс-формат и получаем снова: 0xABCDF.
    Вроде пока просто, погодите, сейчас мозги придётся поднапрячь. Напомню формат данных, которые лежат на самой карте.

    1. Вначале идут девять единиц заголовка.
    2. Младшие пол байта ID клиента.
    3. В конце бит чётности.
    4. Вторые пол байта ID клиента.
    5. Бит чётности.
    6. Младшие пол байта нулевого байта серийного номера.
    7. Бит чётности
    8. Старшие пол байта данных байта нулевого байта серийного номера.
    9. Точно так же все остальные данные, передаются ниблами и оканчиваются битом чётности
    10. Самое сложное. Теперь все эти 10 нибблов по вертикали точно так же вычисляется бит чётности (прямо как в таблице).
    11. Завершает всё это безобразие стоп бит, который равен всегда нулю.

    Итого у нас получается 64 бита данных (это из пяти байт!). В качестве ремарки, мой считыватель не читает ID-клиента, и я его принимаю равным нулю.

    Что такое бит чётности? Это количество единиц в посылке: если оно чётное, то бит чётности равен нулю, если нет, то единице. Проще всего рассчитать его, просто обычным XOR.

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

    Самое важное для нас, это то как будет выглядеть биты чётности. Для удобства я сделал вывод на экран точно так же, как в этой табличке. В результате получилось вот так.

    card_id — это серийный номер карты (о котором мы говорили выше).

    Первый столбец — это ниблы, второй — их битовое представление, третий — это бит чётности. Третья строка снизу — это биты чётности всех ниблов. Как я уже сказал, они рассчитываются просто операцией XOR.

    Протестировав расчёты, сверив иx визуально, я проверил получившиеся данные в программе на Arduino (последняя строка специально для вставки в код). Всё отработало отлично. В результате наброска этой программы, я получил готовую функцию пересчёта. Раньше, расчёты битов были чужими программами на компе и мне не нравилась их монструозная реализация. Таким образом функция пересчёта серийного номера в формат передачи выглядит так:

    Всё, можно переходить к полевым испытаниям. Исходный код проекта обитает тут.

    Испытания

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

    Выводы

    Очень надеюсь, что подобные статьи подстегнуть новичков изучать программирование и электронику. А так же они поспособствуют уходу с рынка такого типа карт, как самых незащищённых и небезопасных, поскольку теперь их может скопировать и эмулировать даже ребёнок.

    Выражаю благодарность Michal Krumnikl за его терпение много-много лет назад, когда он мне по icq разъяснял работу подобного эмулятора, а так же помощь с разработкой кода. В некотором смысле это его идеи и наработки 13-ти летней давности.

    Источник

    Adblock
    detector