Всем доброго дня. Взял я себе на поиграться вот такую штукенцию. Что из этого получилось — под катом.
UPD 30/07/21: пара фото внутреннего мира
Устройство приехало в Украину за две недели, в обычном желтом пакете.
К сожалению, удобных ушек для крепления — не предусмотрено.
Комплектация — собственно устройство и косичка проводов.
Чтобы получить от устройства пользу, нужно уметь программировать Arduino.
Компания Adafruit
предлагает такие же устройства, но здесь, похоже, китайский клон, так как цветовая маркировка проводов не совпадает с ее описанием.
С этой странички качаем библиотеку
Adafruit-Fingerprint-Sensor-Library-master. Софтинку под Windows, SFGdemo, скачать не удалось, я нашел ее
здесь.
Я нашел очень хорошую статью на
русском языке, все делал по ней, с некоторыми ньюансами.
Сперва качаем программу SFGdemo, устанавливаем библиотеку под ардуино.
Как сказано в статье выше, загружаем в ардуино пример
blank из библиотеки. При заливке скетча, сканер должен быть отключен.
У моего модуля цвета проводов не соответствуюм примерам из статьи, но есть надписи на плате.
Подключаем таким образом: Питание +3,3В на красный провод. Черный — GND. Желтый (TX) — 1 пин ардуино, белый (RX) — на 0 пин. Питание — именно 3,3В. От 5-ти — устройство не сгорает, но не общается с внешним миром.
TX и RX не перепутаны, мы просто используем плату ардуино, как USB — UART переходник. Атмега крутит себе пустой скетч, и не мешает общению сканера и софта.
Запускаем SFGdemo.
У меня програма не хотела соединятся с устройством. После переназначения в диспетчере устройств номера СОМ порта с 15 на 7 — все заработало.
Все изображения отпечатков — хранятся непосредственно в сканере. Прибор может запомнить 162 отпечатка. Для записи их — служит кнопка Enroll. Сперва нужно присвоить отпечатку номер и по запросу софта — дважды приложить палец. Программа выдаст сообщение об успехе или ошибке. Программировать отпечатки можно только на приборе, извне передать — нельзя.
Я записал указательный, большой и безымянный пальцы, соответственно под номера 1, 2, 3.
Для проверки — нужно нажать кнопку Search и приложыть палец. Программа выдаст соответствующий ему номер.
Все работает, определение занимает менее половины секунды.
Палец можно прикладывать в любой ориентации. Главное — что бы по центру окошка. Определение — стабильное и без ошибочное.
Теперь — давайте извлечем из девайса пользу.
Из примеров библиотеки, открываем
fingerprint. Смотрим, и сразу закоментируем строку 89. Программа работает через монитор порта, и постоянные сообщения о том, что палец не найден, нам ни к чему, мы и так это знаем :)
Перекидываем желтый (TX) — на 2 пин ардуино, белый (RX) — на 3 пин. Загружаем скетч и запускаем монитор порта.
Теперь, при прикладывании зарегистрированого пальца, выдается его номер. Или же сообщение об ошибке или не зарегистрированом пальце.
Теперь — более живой пример. Сделаем так, что бы при прикладывании незарегистрированого пальца загорался красный светодиод, а зарегистрированого — зеленый. Кроме того, пусть на первый палец загорается еще синий, на второй — желтый, на третий — белый, а на четвертый — синий, желтый и белый — гаснут.
Нужно зарегистрировать еще 4-й (мизинец) и 5-й (большой) пальцы.
Для этого — загружаем из примеров
Enroll и включаем монитор порта, через него и будет общение. Теперь вводим по порядку номера и, по запросу, регистрируем пальчики. Тут же в монитор выпадут сообщения о успехе, или ошибке.
Теперь собираем схемку и вливаем скетч.
Красный светодиод — на 5, зеленый — 4, синий — 8, желтый — 7, белый — 6.
Скетч
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
int getFingerprintIDez();
int GreenLed = 4;
int RedLed = 5;
int WhiteLed = 6;
int YellowLed = 7;
int BlueLed = 8;
// pin #2 is IN from sensor (YELLOW wire)
// pin #3 is OUT from arduino (WHITE wire)
SoftwareSerial mySerial(2, 3); //activates serial communication on pin 2 & 3
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
pinMode(GreenLed, OUTPUT);
pinMode(RedLed, OUTPUT);
pinMode(WhiteLed, OUTPUT);
pinMode(YellowLed, OUTPUT);
pinMode(BlueLed, OUTPUT);
digitalWrite(RedLed, HIGH);
Serial.begin(9600);
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
}
void loop()
{
getFingerprintID();
delay(100);
}
uint8_t getFingerprintID()
{
uint8_t p = finger.getImage();
switch (p)
{
case FINGERPRINT_OK:
break;
case FINGERPRINT_NOFINGER:
return p;
case FINGERPRINT_PACKETRECIEVEERR:
return p;
case FINGERPRINT_IMAGEFAIL:
return p;
default:
return p;
}
p = finger.image2Tz();
switch (p)
{
case FINGERPRINT_OK:
break;
case FINGERPRINT_IMAGEMESS:
return p;
case FINGERPRINT_PACKETRECIEVEERR:
return p;
case FINGERPRINT_FEATUREFAIL:
return p;
case FINGERPRINT_INVALIDIMAGE:
return p;
default:
return p;
}
// match finger with stored ID#
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK)
{
digitalWrite(GreenLed, HIGH); //turn on green LED if finger ID is match
digitalWrite(RedLed, LOW); //red LED is OFF
Serial.print("Found ID # "); Serial.println(finger.fingerID);
ShowID(finger.fingerID);
}
else if (p == FINGERPRINT_NOTFOUND)
{
digitalWrite(GreenLed, LOW); //turn off green LED if finger do not match
digitalWrite(RedLed, HIGH); //red LED is ON
Serial.println("Finger not registered");
}
else
{
return p;
}
}
// returns ID#
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;
//return finger.fingerID);
}
void ShowID(char data)
{
switch (data)
{
case 1: digitalWrite(BlueLed, HIGH); break;
case 2: digitalWrite(YellowLed, HIGH); break;
case 3: digitalWrite(WhiteLed, HIGH); break;
case 4: digitalWrite(BlueLed, LOW); digitalWrite(YellowLed, LOW); digitalWrite(WhiteLed, LOW); break;
}
}
Скетч взят из примера, я еще не вникал в большинство его функций.
Теперь — играемся.
Если палец не записан в сканере — работают эти строки:
digitalWrite(GreenLed, LOW); //turn off green LED and Relay if finger do not match
digitalWrite(RedLed, HIGH); //red LED is ON
Serial.println("Finger not registered");
Если записан — эти:
digitalWrite(GreenLed, HIGH); //turn on green LED and Relay if finger ID is match
digitalWrite(RedLed, LOW); //red LED is OFF
Serial.print("Found ID # "); Serial.println(finger.fingerID);
ShowID(finger.fingerID);
Вместо них — можете прописать свои команды.
Тут же получаем номер пальца и вызываем, в даном примере, процедурку:
void ShowID(char data)
{
switch (data)
{
case 1: digitalWrite(BlueLed, HIGH); break;
case 2: digitalWrite(YellowLed, HIGH); break;
case 3: digitalWrite(WhiteLed, HIGH); break;
case 4: digitalWrite(BlueLed, LOW); digitalWrite(YellowLed, LOW); digitalWrite(WhiteLed, LOW); break;
}
}
Здесь и оперируем светодиодами, как я и хотел :)
Полезные материалы: инструкция на
английском,
мануал по подключению, даташит на
AS608.
Плата крепится на 4-х мелких саморезах. Вот она, с «рабочей» стороны.
В корпусе видно разъем для диодов подсветки и оптика.
Оптика довольно интересная. На просвет — темная. Но если приложить палец — рисунок отпечатка проявляется очень отчетливо.
Наверное, можно приделать к камере другой объектив, выставить фокус (благо, софт под Windows позволяет получать картинки), и получим простое машинное зрение, способное, например, различать логотипы, картинки и формы предметов.
А я пока наигрался и добыл из устройства главный функционал.
Сканер может отправится на полочку и ждать своего проекта.
???
Что я хочу сказать — как то быстро все оборвалось. Да и описание хромает — сколько пальцев может хранить, как считывает у прочих членов семьи, можно ли удаленно хранить отпечатки…
Запоминает максимум 162 отпечатка. Картинку можно получить через софтину под windows.
главное — заставить корректно работать китайскую фиговину, а применение то уже проще простого))
«я тут купил одну штуку интересную, скачал к ней программу, она все сделала за меня, только пальцы надо было приложить, ну да, все работает, убрал на полку...» — это щас описание очень многих «диайуайщиков».
Ни в вопросе разобраться, ни в софте, ни в железе. Купил модуль, скачал готовые программные библиотеки к нему — и вот ужо поделка без смысла и упрека на полке.
Главное, чтобы так скайнет не получился и не захавал потом всех прямо с той полки.
Иногда смотришь на казалось бы нормальный софт, продаваемый за офигенные деньги, но там с безопасностью просто мрак.
не скопировать, если установлены ключи не по умолчаниюВ смысле скопировать можно, но если не привязывать всю логику к UID, там еще есть куча блоков — то все до одного места
Другое дело что можно действительно нормальным считывателем считать нужные сектора и блоки при помощи ключей, включая самый первый блок, где хранятся uid и atqa с sak. Но с другой стороны возникает вопрос- а зачем в качестве id использовать именно uid, а не что-то пользовательское, зашифрованное в определенном секторе?
Вот для чего uid вполне удобен, это для так называемой диверсификации ключей- когда для каждой метки по определенному алгоритму, ключу и uid метки формируются индивидуальные ключи от секторов метки.
А то так дойти можно до критики пос-терминалов, которые на борту имеют ключи, но как только их тамперишь — они их стирают :)
Казалось бы SQL класная система, есть куча настроек доступа и так далее, но все равно до сей поры есть системы которые стоят дохрена денег, но требуют sa для установки и работы, я был в шоке.
mySKU.me/blog/aliexpress/87084.html#comment3889174
Но иногда бывает просто пофигизм и полное нежелание даже пытаться думать о том что есть такая штука как безопастность.
Есть системы мониторинга безопасности сети предприятия, устанавливающиеся на клиентов и на свой сервер с правами sa и админа хоста.
Объяснить что-либо сотрудникам безопасности нереально
— Парни, у нас дыра в безопасности
— Ну, хоть что-то у нас в безопасности
…
habr.com/ru/company/milandr/blog/518138/
А по считывателю из статьи надо читать даташит на мк в данном считывателе, что у него с защитами- я увидел что мк умеет в шифрование, но дальше лень читать даташит. Если ключи для того же AES шифрования можно загрузить в мк, а обратно уже никак не считать, то можно сделать обмен данными с нормальной защитой.
Вон HID кардридеры, у них wiegand старый на выходе, но есть оптопара, и если ты этот ридер открутишь от монтажной пластины в желании подслушать или послать wiegand — он подымет тампер и никто даже не успеет добраться до wiegand-а незамеченным. При этом сам интерфейс идет с времен ридеров магнитной полосы, и никто не спешит ничего менять или криптовать, ибо не нужно.
Хотя понятно, что подделать/скопировать HID карту ни у кого пока не получилось.
А даже если бы и получилось подделать(например украсть) карту, то такое решается ридером со вводом пин-кода.
Обозреваемый сканер является полуфабрикатом, который можно оформить в безопасную систему при желании.
Я же при желании биометрии просто беру ридеры от suprema которые и палец и карту умеют и моноблок с PoE.
Я вот изучал как производители борются с уязвимостями mifare classic различными методами (хотя уже все-равно пора переходить на тот же mifare plus)), и скажу что довольно много чего интересного придумали.
Hid, а какой hid?:) Который prox, который ничем не лучше em-marin или hid iclass?:)) Iclass я так понял поставляется по принципу прошитый считыватель и прошитые ключи, в отличии от семейства mifare, где сам без производителя/ авторизованного интегратора можешь записать любые ключи в карты и в считыватели.
Хотя я больше офигевал от решений с ble ключами- половина производителей предлагают генерацию ключей на их сервере, а другая половина- генерировать либо по IMSI либо по IMEI. Имхо, и то, и другое дичь.
А вообще, любая система связанная с безопасностью должна быть сделана по принципу разумной необходимости и достаточности, иначе это будет калитка в чистом поле)))
Одним словом можно, но только если умеете программить и разбираетесь в электронике.
Есть сканеры в обычные клавиатуры встроенным. Там тоже видел вариант когда он как бы видео на внутреннем хабе и когда прямо на контроллер клавиатуры.
Сильно подробно не интересовался, но когда разберёшь иногда понятно по какому интерфейсу скорее всего работает.
Иногда там за usb отвечет отдельный конвертор, так что можно просто взять сигналы до него и вот голые данные.
У меня на бывшей работе стоит на двери в распечатанном на 3д принтере корпусе (датчик поставил вертикально).
Подключается к blue pill, к которому также подключены кнопки открывания, записи отпечатка и очистки базы. Контроллер управляет электромагнитным замком двери через транзистор, зажигает два светодиода возле датчика-зеленый и красный, для солидности конечно.
Работает 24/7 года 4, срабатывает четко, в памяти отпечатков 20, время открытия в районе секунды.
За все время только один раз приходилось экстренно сворачивать танки на компе-произошло срабатывание на отпечаток не в базе.
Мне в целом датчик понравился.
Сейчас бы я взялся делать самопальный замок на этом датчике только в 2 случаях:
1) В учебных целях
2) Если при попытке открыть дверь есть необходимость бить током шаловливые пальчики, отсутствующие в базе.
А так — на алиэкспресс готовая ручка со встроенным датчиком стоит меньше 40$, то на то и выйдет по материалам.
Interfaz de comunicación: USB/UART
но интересуют детали — можно ли отпечатки вытащить с устройства, если его украсть, интересно? наверняка можно, но насколько сложно это будет?
и второй — питание. какие потребление в режиме ожидания, считывания?
развернуто: отпечаток «как картинка» хранился только в первых, совсем древних, фингерпринтах (или в отдельном контроллере). Сейчас хранится некий «хэш» ключевых параметров (точек, линий, глубины и т.п.) причем алгоритм определения «что считать ключевым» не раскрывается и может быть очень разным. Также как и не существует общепринятого стандарта кодирования.
Т.е. «нужно»: считать сырое содержимое памяти (та еще задача), восстановить параметры из «хэша» (еще сложнее) и преобразовать их в «картинку». И даже после этого (через черт его знает сколько лет, а то и веков) результатом будут огрызки отпечатка, относительно пригодные только для подсовывания точно такому же датчику.
(Если не заморачиваться с другой арлуиной или ещё чем-то, что может передать номер отпечатка)
Отпечатки хранятся только в этой игрушке. Игрушка не привязана никакой авторизацией к ардуине и основное устройство понятия не имеет, какой именно датчик к нему подключен.
Т.е., достаточно выломать этот модуль, который даже креплений не имеет, подключить точно такой же с заранее вбитыми в него своими отпечатками и всё — доступ обеспечен?
Или я что-то пропустил?
Это — для самоделок, для защиты «от честных людей». Скорее даже не защиты, а идентификации, типа фиксации кто во сколько пришёл.
использование только биометрии в критических точках входа — плохая идея. с обеих сторон — и с точки зрения защищенности от взлома (хотя здесь есть где разгуляться и, в принципе, можно добиться неплохих результатов), и с точки зрения надежности определения валидных входов (например: если шифрация «очень важных данных» завязана только на палец, то что случиться если этот палец получит серьезную травму?).
p. s. как может выжрать чтото датчик, который 99% времени спит?
void loop()
{
getFingerprintID();
delay(100);
}
Это же по 10 считываний в секунду до скончания веков?
Не… ну если так тоды ой)
Цены бы ему не было!
Выбор напитка — обычной кнопкой, а «пуск» — с авторизацией.