Как сделать ключ-флешку
Одним ужасным пятничным вечером мне стало интересно как реализован вход в систему(Windows 7) по отпечатку пальца, так часто использующийся на ноутбуках. Что меня большего всего интересовало – как сделана такая прозрачная интеграция с WinLogon(механизм входа в систему).
С помощью знакомого я узнал что сие называется Credential Provider(по крайней мере начиная с Vista, до неё – был другой механизм). И тут-то я вспомнил что давно хотел сделать чтобы система разблокировалась при подключении одной определенной флешки. Поэтому я захотел быстренько наваять такой проект.
Первое что я сделал – это поискал примеры реализации Credential Provider. Они быстро нашлись в Windows SDK, а так же отдельно примеры(но устаревшие – для висты).
Среди примеров был наиболее близкий мне – SampleHardwareEventCredentialProvider.
Расскажу вкратце как устроен механизм провайдеров учетных записей(Credential Provider).
В реестре(HKLMSoftwareMicrosoft WindowsCurrentVersionAuthentification) есть две ветки – собственно Credential Providers и Credential Provider Filters. В каждом из них набор вида “ветка-GUID”(GUID – уникальный идентификатор) с дефолтным параметром – названием провайдера или фильтра. Тут надо пояснить что такое провайдеры и фильтры.
Провайдер – он дает нам возможность входа в систему. Например по отпечатку пальца, по вводу пароля(дефолтное поведение), по смарткарте, и т.д.
Фильтры – фильтруют “лишнее” поведение от пользователя. Пример – если политикой безопасности запрещен вход по смарткарте – фильтр может отключить такой провайдер.
Далее, в реестре в всем известном страшном месте HKCRCLSID описаны GUIDы, а в нашем случае – для идентификаторов фильтров и провайдеров прописаны их названия, название файла — dll-ки, и модель потоков(ThreadingModel=Apartment).
Фильтры мы рассматривать не будем, перейдем конкретно к провайдеру.
В проекте у нас есть несколько классов:
CSampleProvider, реализующий интерфейс ICredentialProvider. Именно он отвечает за механизм входа и предоставление удостоверения(Credential)
CSampleCredential, реализующий труднопроизносимый интерфейс ICredentialProviderCredential. Собственно тут указаны имя пользователя, пароль(или токен авторизации, что лучше). Экземпляр этого класса мы отдаем WinLogon для входа в систему.
CommandWindow, класс окна-заглушки.
По умолчанию в SampleHardwareEventCredentialProvider такое поведение:
При создании главного класса механизмом входа WinLogon – в другом потоке создается окно с кнопкой, которая симулирует событие подключения устройства. При нажатии на кнопку – происходит переход на логин с учетной записью “Administrator”.
Что мне надо минимально поменять из этого поведения чтобы было рабочее решение для меня?
Скрыть окно, сменить жёстко прописанную учетную запись “Administrator” на мою(с автовводом пароля), включить автовход, и реализовать событие WM_DEVICECHANGE.
Скрыть окно было просто – всего лишь найти ShowWindow(hWnd, SW_SHOW); и заменить на SW_HIDE
Сменить жёстко прописанную учетную запись – тоже было просто – я создал отдельный файл consts.h, где прописал:
static const wchar_t* USERNAME = (L «Кирилл Орлов» );
static const wchar_t* PASSWORD = (L «Сорок тысяч обезьян в жопу сунули банан.» );* This source code was highlighted with Source Code Highlighter .
Включить автовход тоже было несложно:
HRESULT CSampleCredential::SetSelected(__out BOOL* pbAutoLogon)
*pbAutoLogon = TRUE; //тут было FALSE
return S_OK;
>* This source code was highlighted with Source Code Highlighter .
Этот метод вызывается при выборе пользователя для входа.
Осталось единственное сложное – реализовать событие WM_DEVICECHANGE.
В нем мне надо найти некий уникальный идентификатор флешки, сравнить с эталонным, и в случае совпадения – поставить флаг что нужное устройство подключено, который затем прочитает CSampleCredential.
Что может быть уникальным у флешки? Вобщем-то много всего, VendorID/ProductID(уникальны на продукт, т.е. у одной и той же серии флешек – совпадает), номер серийника раздела(сбрасывается при переформатировании). Я сравниваю PNPID через механизм WMI(Windows Management Instrumentation).
Вообще про WMI можно говорить долго, скажу только что это средство получения информации и управления кучей компонентов ОС и не только, и имеет свой SQL-подобный язык запросов, называемый WQL. Есть замечательная утилита от Microsoft под названием WMI Browser, очень советую поставить – можно узнать много нового о том, что можно узнать с помощью WMI.
Вот модифицированная процедура потока, в которой помимо создания окна теперь ещё и инициализация глобальных статичных переменных для работы с WMI:
static IEnumWbemClassObject* pEnumerator ;
static IWbemLocator *pLoc ;
static IWbemServices *pSvc;
static IWbemClassObject *pclsObj;
DWORD WINAPI CCommandWindow::_ThreadProc(__in LPVOID lpParameter)
CCommandWindow *pCommandWindow = static_cast(lpParameter);
if (pCommandWindow == NULL)
return 0;
>
HRESULT hres;
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
return 1; // Program has failed.
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &(pLoc));
if (FAILED(hres))
CoUninitialize();
return 1; // Program has failed.
>
hres = pLoc->ConnectServer(
_bstr_t(L «ROOTCIMV2» ), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED(hres))
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
>
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
>
HRESULT hr = S_OK;
// Create the window.
pCommandWindow->_hInst = GetModuleHandle(NULL);
if (pCommandWindow->_hInst != NULL)
_MyRegisterClass();
if (SUCCEEDED(hr))
hr = pCommandWindow->_InitInstance();
>
>
else
hr = HRESULT_FROM_WIN32(GetLastError());
>
ShowWindow(pCommandWindow->_hWnd, SW_HIDE);
if (SUCCEEDED(hr))
_ProcessNextMessage())
>
>
else
if (pCommandWindow->_hWnd != NULL)
pCommandWindow->_hWnd = NULL;
>
>
* This source code was highlighted with Source Code Highlighter .
соответственно в деструкторе CommandWindow освобождаем ресурсы:
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
pclsObj->Release();* This source code was highlighted with Source Code Highlighter .
И теперь самое интересное – обработчик события WM_DEVICECHANGE:
case WM_DEVICECHANGE:
HRESULT hres = pSvc->ExecQuery(
bstr_t( «WQL» ),
bstr_t( «SELECT * FROM Win32_DiskDrive» ),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed
>
ULONG uReturn = 0;
while (pEnumerator)
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
hr = pclsObj->Get(L «PNPDeviceID» , 0, &vtProp, 0, 0);
if (wcscmp(vtProp.bstrVal,PNPID) == 0)
PostMessage(hWnd, WM_TOGGLE_CONNECTED_STATUS, 0, 0);
>
VariantClear(&vtProp);
* This source code was highlighted with Source Code Highlighter .
Здесь происходит выполнение WQL-запроса к Win32_DiskDrive – списку наших дисков. Т.е. по PNPID мы можем привязаться к флешке, внешнему харду, но не к примеру usb-мышке(хотя это тоже можно реализовать!).
После выполенения запроса я сравниваю полученную строку(vtProp.bstrVal) с захардкоженным PNPID в consts.h:
static const wchar_t* PNPID = (L «USBSTORDISK&VEN_CBM&PROD_FLASH_DISK&REV_5.00192023004CB4C702&0» );
* This source code was highlighted with Source Code Highlighter .
PNPID можно подсмотреть в том же WMI Browser или можно воспользоваться средствами Visual Studio для работы с WMI.
Если они совпали – то я отправляю сообщение для включения флага подключения нужной флешки, по которому устанавливается этот флаг и вызывается метод обновления у провайдера.
Далее остался финальный штрих – заменить GUID нашей библиотеки с дефолтного на случайный в register.reg/unregister.reg и в guid.h.
Вот и всё. Далее дело за малым – скомпилировать проект, скопировать полученную библиотеку в System32, и выполнить register.reg. Потом нажимаем Win+L(блокировка системы) и наслаждаемся
Вот тут можно скачать исходники.
Реализация USB-ключа доступа к Windows с использованием системной утилиты SysKey
Способ с использованием штатных средств Windows по доступу к системе с помощью флешки-ключа основан на работе штатной утилиты SysKey. Она шифрует базу данных учётных записей с целью защиты от попыток взлома. И таким образом реализует ключ запуска системы. Это довольно давний системный инструмент, он был внедрён ещё в Windows NT 4.0. Реализация флешки-ключа с использованием SysKey имеет свои нюансы.
Во-первых, способ будет работать только в версиях Windows по 8.1 включительно. Windows 10, начиная с версии 1709 , больше не содержит в числе своего арсенала SysKey. Утилита была выпилена из «Десятки» из-за реализации в ней иных способов сохранности доступа к системе.
Во-вторых, SysKey – это не средство разблокировки отдельных учётных записей каждого из пользователей. Это ключ к запуску всей системы Windows. Т.е. любой, кто пользуется компьютером, не попадёт в свою отдельную учётную запись, доколе на это добро не даст хозяин компьютера путём подключения в USB -порт компьютера флешки-ключа для разблокировки системы. Такая разблокировка требуется только при запуске или перезагрузке компьютера. При выходе из системы на экран блокировки для смены пользователя флешку-ключ вставлять в USB -порт компьютера не нужно.
BitLocker Windows
Шифрование BitLocker предназначено для защиты информации, хранимой на стационарных и переносных накопителях компьютеров с Windows, и является частью самой операционной системы. Технология очень надежна и необременительна для пользователя, но реализована не во всех, а только в серверных, профессиональных, корпоративных и максимальных редакциях системы. И в этом, пожалуй, ее самый весомый недостаток. На ПК, где установлена, например, Windows Home, открыть зашифрованный диск не получится никак. А средств для отдельной установки Битлокер в домашние ОС Microsoft не предлагает.
Использование BitLocker для защиты флешек оправдывает себя лишь тогда, когда вы собираетесь работать с ними на машинах с вышеупомянутыми версиями Windows, а также под Linux и Mac OS X. Для двух последних систем существует разработанная энтузиастами утилита DisLoker, которая позволяет открывать и просматривать зашифрованные накопители, но не дает возможности их шифровать.
Как защитить USB-устройство с помощью BitLocker:
- Подсоедините флешку к ПК и откройте список дисков в проводнике Windows (зайдите в папку «Компьютер»).
- Откройте контекстное меню флешки и выберите опцию «Включить BitLocker».
- Первое, что система вам предложит, это выбрать способ разблокировки носителя. Для домашних пользователей единственный подходящий вариант — пароль. Введите его в указанное поле, повторите и нажмите «Далее».
- Следом определите, как вам удобнее хранить ключ восстановления, который понадобится для доступа к данным в случае утраты пароля.
- Дальше укажите, какую часть накопителя следует шифровать.
- В следующем окошке выберите режим шифрования. Переносным дискам, которые будут использоваться в разных версиях операционных систем, подойдет режим совместимости.
- Последним шагом подтвердите свое намерение — нажмите «Начать шифрование».
Операция шифрования продлится несколько минут, после этого содержимое флеш-накопителя будет доступно только по паролю. Каждый новый объект, который вы сохраните на нем, также будет автоматически зашифрован.
Сильные стороны BitLocker — это очень устойчивый ко взлому алгоритм, отсутствие необходимости устанавливать сторонний софт и простота применения. Недостатки — невозможность зашифровать отдельный файл или папку по выбору пользователя (только раздел или весь накопитель целиком) и ограниченная область использования.
Системный подход к безопасности
Сделать свой компьютер более безопасным можно, если добавить дополнительные уровни защиты. Это особенно актуально, когда от защищенности вашего ПК зависит благополучие бизнеса. Компания Roboform предоставляет широкий набор решений по безопасности для компьютеров. Их менеджер по защите паролей сделает ваши данные неприступными для любых атак.
Как и ключи от сейфа или квартиры, usb ключ нужно хранить в надёжном месте. В нём не будет никакого смысла, если любой сможет запросто им воспользоваться без вашего ведома. И, как в случае с ключами от дома, на случай потери было бы разумно создать копию на какой-нибудь отдельный носитель, который будет хранить образ электронного ключа. В непредвиденной ситуации так будет проще быстро попасть в систему.
Что такое YubiKey
В качестве примера укажем компанию Yubico, которая создала YubiKey – USB-флешку, совместимую с Windows Hello, и рядом других сервисов, которые необходимо поддерживать в безопасности, таких как LastPass, KeePass, Google, Dropbox и Evernote.
Как только вы получите его, всё, что вам нужно сделать, это подключить к компьютеру, зарегистрировать, и вы готовы к работе. Есть несколько разных вариантов YubiKey. У вас есть стандартный YubiKey, который подключается через USB, Nano YubiKey, который намного меньше, и YubiKey NEO, который может подключаться как через NFC, так и через USB.
Достоинства и недостатки такого решения
Защищая себя только паролями, большая оплошность безопасности. Даже если вы создаете хорошие пароли и практикуете хорошие привычки безопасности , есть один недостаток пароля: как только вы засветили пароль, любой может им воспользоваться. В этом смысле, физический ключ труднее украсть, чем нематериальный.
Но не без изъянов.
С одной стороны, вы получаете лишний геморрой, если вы вдруг потеряете или сломаете ключ USB: восстановить такой ключ более сложно, чем пароль. Другой недостаток, захотите предоставить кому-либо еще доступ, вы должны передать им ключ. Сказать по телефону пароль уже не получится, но тем не менее, не трудно же передать ключи от квартиры другу, если понадобится.
Predator является одним из самых популярных инструментов для превращения флешки в устройство контроля доступа.
Принцип работы следующий: пока флешка подключена в USb доступ к компьютеру разрешается. Тут возможна двухэтапная аутентификация, то есть иметь USB ключ мало, еще необходимо ввести пароль.
Чтобы настроить первый ключ USB:
- Установите Predator .
- Запустите
- Вставьте диск USB
- Введите пароль для этого пользователя
- Выберите диск, который представляет собой устройство USB.
- Нажмите кнопку Register Key.
Накопитель используемый в качестве ключа останется полностью без изменений. Никакие файлы не будут удалены или изменены.
Расширенные функции включают в себя:
- Один USB накопитель может быть использован для блокировки /разблокирования нескольких компьютеров.
- Несколько флешек могут быть использованы для одного компьютера, разными пользователями
- Встроенный планировщик, может ограничить доступ к компьютеру в определенное время суток, причем расписание может быть определено для определенного пользователя
- В случае потери или поломки ключа USB, существует аварийный пароль
- Все попытки входа протоколируются и записываются в журнал. Кроме того можно настроить, чтобы при попытке разблокирования веб камера делала снимок ,и отправляла одним из доступным образом
В общем, Predator является хорошим выбором, если вы хотите быстрое и простое решение.
Как создать флешку ключ
Для создания флешки – ключа воспользуемся бесплатной программой Predator. Она создает из любой флешки ключ для блокировки компьютера. Программа занимает мало места и имеет простой интерфейс. К сожалению, программа не русифицирована. Скачать Predator
После запуска программы нужно будет вставить флешку в компьютер и нажать кнопку “ОК”.
В меню программы 3 вкладки: основные параметры, параметры сигнализации, дополнительные параметры.
Основные параметры (Main Options)
Здесь задаются основные параметры для создания флешки-ключа. Все необходимые параметры выставлены по умолчанию.
Вам нужно только ввести сложный пароль в поле “New Password”, воспользуйтесь для этого генератором паролей. Если Вы хотите что бы при каждой разблокировки компьютера нужно было указывать пароль, то отметьте галочкой поле “Always Required”
Я рекомендую Вам обязательно указывать сложный пароль. Без него Вы не сможете получить доступ к компьютеру, если вдруг потеряете флешку.
Теперь выберите из списка всех флешек (если у Вас сейчас несколько флешек вставлено в компьютер) ту, которая будет ключом для разблокировки компьютера (поле “Create key on Drive ”) и нажмите кнопку “ Create key ”.
Немного подождите, и флешка-ключ будет готова.
Параметры сигнализации (Alarm Options)
Здесь можно установить и прослушать сигнал сигнализации, когда кто-то попытается получить доступ к Вашему компьютеру.
В основных параметрах мы указывали пароль. Так вот, если в компьютере нет флешки, то можно попытаться разблокировать его паролем. Если кто-то начнет двигать мышкой или нажимать кнопки на клавиатуре, то появится поле для ввода пароля.
Если введен неправильный пароль или истекло время, данное для ввода пароля, то зазвенит сигнализация. Ее легко выключить, выключив колонки. Но согласитесь, что для человека это будет неожиданность и он постарается уйти от этого компьютера.
Дополнительные параметры (Advanced options)
В этой вкладке устанавливаются параметры, не связанные с созданием загрузочной флешки. По умолчанию включено ведение логов (вы можете смотреть, когда пытались разблокировать Ваш компьютер), проверка обновления программы и даже отправка логов в твиттер.
Можно и даже нужно отметить галочку, что бы программа автоматически запускалась при старте Windows (Autostart with Windows). Но делать сразу это не нужно. Проверьте работоспособность флешки, перезагрузите компьютер и заново проверьте работу флешки. Если все нормально, то можете отметить галочку об автостарте программы.
Популярные Похожие записи:
Здравствуйте. А не подскажите как подобным способом можно защитить только 1 учетку локальную/доменную?
Добрый день, если честно не пробовал, но мне кажется не получиться, так как если ключ не вставлен то до логина вам не дадут пройти.
Windows 7 не видит ключ на флешке, хотя он там есть…. что делать?
А в какой файловой системе форматировалась флешка?
Если такая защита стоит на другом ПК то можно ли этот ключ сделать не на защищёном и будет ли тогда ключ работать?
Здравствуйте. Сын стёр файл с флэшки. Ноутбук зависат при загрузке, просит …. Как быть?
Тут уже только вынимать диск и подключать его к другому компьютеру, вытаскивать от туда данные, потом переустанавливать систему, просто если бы легко было взломать, этой технологии был бы грош цена.
Правильно ли я понимаю, что копирование файла ключа на вторую (третью/четвёртую) флешку решит проблему при возможной потери/неисправности оригинальной флешки?
Огромное спасибо за статью.
Правильно я понимаю
Если включить этот ключ с usb
И в добавок защифровать всю инфу на дисках
(Есть такая функция)
То без usb ключа, следовательно без системы
уже ни какие танцы с бубном
Не помогут извлеч инфу с дисках?
Если потерял флэшку как включають ноут?
Только переустановка и вытаскивание данных с помощью Live-cd
Здравствуйте! Спасибо работает. usb key нужен только при загрузке системы. Потом флешку можно извлечь. У меня на windows 7 (64) получилась так: на флешке переименованной в (A) ключ видит и разблокирует систему, а вот копию на другой флешке не видит. Предполагаю из за того, что другая флешка имеет букву диска отличную от (A) – у меня определялась как (F). Попробовал назначить букву (A). Копия заработала., но перестал определятся ключ на флешке1. Переименовался. Получается, что копию usb key невозможно использовать. и при утрате оригинала неизбежны проблемы. Кто подскажет? Спасибо.
Интересное тестирование, а если сделать клон флешки с помощью утилит?
Я бы попробовал снять образ с оригинальной флэшки-ключа и смонтировать его на другую флэшку. Если и так не получится — останется думать что имеют значения идентификаторы VID&PID. За этим — уже только прошивка контроллера, от чего флэшка вполне вероятно может стать нерабочей.
блин помогите его удалить потому што я хотел сохранить там апароль которие поставили родаки а потом понял што комп без флешкине запускается срочно помогите
здравстуйте, такая проблема, ключ на флэшке-оригинале есть, раньше система включалась нормально, а потом резко не извлекает из нее ключ этот и всё. может она как-то поменяла букву диска. система не включается больше. как быть?
В безопасном режиме пробовали загружаться, и если флешку подключить на другом компьютере, у нее видится файловая система? Можно попробовать поискать на ней ошибки, штатными средствами Windows
Благодарю за полезную информацию по созданию ключа.Пригодилось.
Здравствуйте!
Скажите, пожалуйста, а зачем при создании usb ключа, менять букву флешки?
Если её, к примеру, не менять, а оставить стандартной по умолчанию, то Windows сможет запускаться тогда с каждой флешки, на которой установлен StartKey?
Я почему спрашиваю? Ведь если единственная флешка, на которой создан StartKey, вдруг выйдет из строя, то с другой флешки система не запустится, даже при наличии на ней StartKey, поскольку система видит её под другой буквой. Поэтому, можно ли создать, две или три флешки с usb ключом под одной буквой, чтобы Windows запускался не с одной, а с любой?
_https://support.microsoft.com/ru-ru/help/4025993/syskey-exe-utility-is-no-longer-supported-in-windows-10-windows-server
Дополнительная информация
Syskey — это внутренний корневой ключ шифрования Windows, используемый для шифрования других конфиденциальных данных о состоянии ОС, таких как хеш пароля учетной записи пользователя. Утилиту SysKey можно использовать для добавления дополнительного уровня защиты путем шифрования syskey с целью использования внешнего пароля. В этом состоянии ОС блокирует процесс загрузки и запрашивает у пользователей пароль (интерактивно или путем считывания с гибкого диска).
К сожалению, ключ шифрования syskey и использование syskey.exe больше не считаются безопасными. Syskey основан на слабом шифровании, которое легко взломать в современных условиях. Данные, защищенные syskey, очень ограничены и не охватывают все файлы и данные на томе ОС. Утилита syskey.exe также использовалась злоумышленниками как вирус-вымогатель.
Active Directory ранее поддерживает использование внешнего шифрования syskey для IFM мультимедиа. При установке контроллера домена с использованием IFM носителя необходимо также предоставить пароль внешнего syskey. К сожалению, в этой защите присутствуют те же проблемы безопасности.
Добрый вечер у меня выдаёт ошибку когда я написал system.exe что мне делать?