Использование сканера отпечатков пальцев в Windows приложениях

Дано: небольшое Windows .NET приложение с которым работают до 5 пользователей
Требуется: для входа в приложение вместо традиционного ввода пароля использовать сканер отпечатков пальцев

Немного теории

В общем в использовании сканера отпечатков нет ничего сложного. Сначала приложение сканирует один или несколько отпечатков пальцев и выделяет какие то особенности рисунка. В дальнейшем эта информация позволяет проверить, тот ли человек пытается сканировать палец, который предоставил образцы отпечатков или кто  то другой. Процесс получения образцов отпечатков именуется Enroll. Процесс последующей проверки отпечатков Verify. Процедура поиска пользователя по его отпечаткам — Identification. Так как процесс проверки пользователя по сути не может дать однозначного ответа действительно ли это тот самый пользователь, который нам нужен существует некая величина, количество баллов, которое показывает насколько вероятна ошибка при идентификации пользователя (MatchingThreshold, score).

Хотя принцип работы с отпечатками пальцев простой и одинаковый для любого приложения, на данный момент нет стандарта для единообразной работы со сканерами любого производителя. Соответственно нет и универсального SDK, который позволит использовать любой сканер. Работы по стандартизации ведутся, но пока ни к чему не привели. Между тем Microsoft вместе с Windows 7 пытается продвинуть свой стандарт — Windows Biometric Framework (WBF). Я расскажу о нем немного в последующий статьях.

Переходим к практике

Производители сканеров как правило предоставляют SDK, позволяющие работать с их устройствами. Но к сожалению, стоят эти SDK немалых денег (~$1000). Что интересно, для работы с Linux часто есть и бесплатные версии SDK в отличие от библиотек под Windows. Есть и сторонние решения, позволяющие использовать множество различных устройств с помощью одного и того же SDK, но для каждого конкретного сканера нужно смотреть, поддерживается ли он. Цена сторонних решений сравнима с ценой SDK от производителей устройств. Тем не менее, существует бесплатное решение, работающее в Windows от neurotechnology.com. А именно Free Fingerprint Verification SDK. В этой бесплатной библиотеке не обходится и без ограничений. Существует только версия, работающая с 32 разрядными операционными системами от Microsoft. Данные о пользователях сохраняются только в специальном формате, предоставленном производителем. Сохранить можно данные не более чем по 10 отпечаткам. Не поддерживается Identification.  Как видим, ограничения довольно жесткие, но по условиям задачи нам этого достаточно (будем считать, что у нас 32 разрядная Windows). В полной версии все эти ограничения сняты — работает она в любой ОС, сохраняет данные об отпечатках в любой базе данных. Но и цена соответственно составит примерно $1000 …

Хватит слов, давайте уже начнем

Начнем мы немного позже, для начала нужно скачать с сайта Neurotechnology дистрибутив FFV SDK по этой ссылке. Размер файла немаленький, 140 мб. Но в состав кроме собственно файлов SDK (для нескольких популярных языков программирования, включая .NET) входит и набор драйверов для большого количества сканеров разных производителей. Я использовал в работе сканер UPEK Eikon. Часто сканер отпечатков встроен в корпус ноутбука, такой сканер также вполне подходит для использования. Перед тем, как начать экспериментировать с SDK убедитесь, что на вашем компьютере не запущены никакие приложения, работающие со сканером. К примеру в моем случае приложение Protector Suite, которое предоставляется производителем оборудования не давало тестовому приложению работать нормально. При попытке доступа к сканеру возникал конфликт и оба приложения закрывались с ошибкой. Для проверки того, что ваш сканер на самом деле поддерживается и для подтверждения работоспособности SDK запустите прилагаемый пример из папки FreeFingerprintVerificationSDK\bin\Win32_x86\CSharpSample.exe. Выберите в открывшемся окне со списком поддерживаемого оборудования ваш сканер.



Обратите внимание на поля ввода внизу формы. Первое поле (fingerprint database) служит для указания имени файла, в котором будет сохраняться информация о сканированных отпечатках.
Второе поле (password) позволяет закрыть сохраняемые данные паролем (кого это останавливало 🙂 )
Третье поле (user database) содержит название файла, в котором сохраняются некоторые дополнительные данные о пользователе, к примеру его имя и т.п.

После выбора сканера мы переходим в основное окно приложения.

Как можно заметить приложение поддерживает основные операции, представленные в SDK: Enroll, Verify, Delete. В правой части экрана представлен список пользователей, которые зарегистрированы в программе.

Кроме того, можно очистить базу данных полностью (clear database) или задать параметры распознавания (количество баллов, которое должен набрать отпечаток чтобы признать соответствие его параметров определенному пользователю)

А вот так выглядит окно программы после сканирования отпечатка

Необходимый набор файлов в .NET приложении

Для нормальной работы приложения необходимо скопировать в папку с исполняемым приложением два файла: NffvServer.exe и Nffv.dll. Кроме того нужно добавить в папку fpsmm (относительно исполняемого файла) несколько файлов, специфичных для вашего оборудования. Список этих файлов можно найти в документации, поставляемой в составе SDK или использовать утилиту из папки redistributable, которая скопирует все требуемые файлы в указанную вами папку.
Пример: FFVSDKRedistributable.exe /DOTNET /Eikon /D=c:\temp

Ключевые методы SDK

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

Первый метод осуществляет инициализацию сканера

Nffv _engine = new Neurotec.Biometrics.Nffv(@"\nffv.dat", "pass", "Eikon");

Параметры вызова: имя файла с данными пользователя, пароль на файл, название плагина для используемого сканера (полный список плагинов можно получить при помощи вызова

string modules = Nffv.GetAvailableScannerModules();

Метод для вызова Enroll

NffvStatus stat;
NffvUser user = _engine.Enroll(20000, out stat);
В переменной stat будет храниться результат операции. Если stat == NffvStatus.TemplateCreated то все прошло отлично и в переменной user хранятся данные пользователя. Самое главное поле user.ID. Его мы можем запомнить и использовать где то в своей базе данных.
Для последующей валидации пользователя нужно вызвать такие методы:
NffvStatus stat;
NffvUser fpu = _engine.GetUserById(userId);
int score = _engine.Verify(fpu, 20000, out stat);

Если stat == NffvStatus.TemplateCreated сканирование отпечатков и проверка пользователя прошла нормально. поле score содержит количество баллов, которое набрал пользователь при проверке. Нулевое значение рассматривается как неудачная проверка. Значения больше нуля условно означают что проверка пройдена. Порог, при котором проверку нужно считать успешной устанавливаете вы сами. Мой опыт показал, что значения score > 35-40 уже можно считать достаточными. Производители рекомендуют использовать значения от 48 и более

Для удаления пользователя из базы нужно удалить его из коллекции пользователей

_engine.Users.RemoveAt(userIndex);

(не очень удобный подход, но ничего другого не предлагается)

Полная очистка базы данных соответственно выполняется так:

_engine.Users.Clear();

Чтобы остановить операции со сканером можно использовать метод _engine.Cancel(); вызов метода немедленно прекращает операцию и продолжает выполнение потока работы со сканером.

Советы

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

Еще одно замечание — когда инициализируется SDK приложение сразу же переводит сканер в монопольный режим. Это наглядно видно по индикатору на корпусе сканера — если при старте приложения индикатор загорелся — все отлично, все нужные библиотеки загружены, устройство найдено и готово к работе.

Заключение

Я думаю что хотя статья и небольшая, приведенной информации должно быть достаточно для «быстрого старта» 🙂 Если что то осталось непонятным — жду ваших комментариев.

Использование сканера отпечатков пальцев в Windows приложениях: 7 комментариев

  1. user

    Очень интересно, буду пробовать со своим ноутбуком. Хотелось бы ещё исходники вашего примера.

  2. user

    Упорно не видит мой сканнер. Винда говорит что это AuthenTec Inc. AES2501A.
    Жалко, а хотелось побаловаться.

    1. Дмитрий Васильев Автор записи

      Вообще, AES2501A в списке поддерживаемых сканеров нет … но я бы попробовал
      1. Проверить не блокирует ли какое нибудь приложение сканер (скажем родное приложение от Authen Tec Inc.), возможно его деинсталлировать.
      2. Поставить драйвер из состава SDK и проверить с ним.
      3. Внимательнее к галкам выбора загружаемого модуля — некоторые конфликтуют между собой

  3. BOZKURT

    Спасибо! Недавно тоже назрела необходимость (а точнее, я понял что если это будет, то не будет излишеством) в такой вот аутентификации.
    Осталось тока купить сканер и поиграться.

  4. Уведомление: Tweets that mention Использование сканера отпечатков пальцев в Windows приложениях | DV Team Blog -- Topsy.com

  5. Serg

    Информация устарела: сейчас есть VeriFinger 7.1 Standard SDK это программа сканера отпечатков пальцев универсальная — поддерживает очень много железяк и х64 разряда Win 8.1, Win 10.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *