Windows Hello – это технология биометрической аутентификации пользователя по отпечатку пальца, сетчатки глаза, трёхмерному сканированию лица и даже по венозной схеме ладони.
В сфере оказания финансовых услуг, важна безошибочная и безопасная аутентификация пользователя. Для авторизации мы используем двухфакторную систему из связки логина и пароля или номера телефона и пароля с подтверждением по коду, отправленному на привязанный номер мобильного телефона. Для дальнейшего упрощения доступа в авторизованную зону используется 4х значный ПИН-код.
После авторизации и создания ПИН-кода, аутентификацию пользователя можно переложить на плечи Windows Hello. Общая последовательность необходимых действий выглядит следующим образом:
- Проверить возможность использования Windows Hello.
- Проверка пользователя с помощью Windows Hello, что позволяет связать авторизованного Windows пользователя с нашим клиентом.
- Кэширование созданного ранее ПИН-кода по идентификатору пользователя в защищённой области.
- При последующих запусках приложения с авторизованным пользователем, автоматически запускается процедура аутентификации пользователя посредством Windows Hello. В случае успешной аутентификации из защищённой области запрашивается кэшированный ПИН-код.
Давайте рассмотрим каждый шаг подробнее на примерах кода.
Минимальным условием использования Windows Hello служит настроенный ПИН код доступа для входа в систему. В случае отсутствия у пользователя сертифицированного оборудования для биометрической аутентификации, будет использован ПИН код.
Мы это делаем так:
public async Task<WindowsHelloStatus> CheckHelloStatusAsync()
{
var checkAvailabilityAsyncOperation = UserConsentVerifier.CheckAvailabilityAsync();
var checkAvailabilityTask = checkAvailabilityAsyncOperation.AsTask();
var completedTask = await Task.WhenAny(checkAvailabilityTask, Task.Delay(TimeSpan.FromSeconds(1)));
if(completedTask == checkAvailabilityTask)
{
var availability = checkAvailabilityTask.Result;
switch (availability)
{
case UserConsentVerifierAvailability.Available:
return WindowsHelloStatus.Available;
case UserConsentVerifierAvailability.DeviceBusy:
return WindowsHelloStatus.Busy;
case UserConsentVerifierAvailability.DisabledByPolicy:
return WindowsHelloStatus.DisabledByPolicy;
case UserConsentVerifierAvailability.NotConfiguredForUser:
return WindowsHelloStatus.NotConfiguredForUser;
default:
return WindowsHelloStatus.Unavailable;
}
}
checkAvailabilityAsyncOperation.Cancel();
return WindowsHelloStatus.Unavailable;
}
Данный код не должен вызвать вопросов, здесь проверяется статус службы Windows Hello. UserConsentVerifierAvailability содержит чуть больше вариантов статуса службы, но для наших целей будет достаточно перечисленных в примере выше.
После установки пин-кода Тинькофф и успешной проверки доступности Windows Hello мы предлагаем пользователю подключить эту службу:
Если пользователь соглашается, то необходимо его аутентифицировать, для этого мы используем следующий код:
public async Task<bool> VerifyUserAsync()
{
if (await CheckHelloStatusAsync() != WindowsHelloStatus.Available)
return false;
var result = await UserConsentVerifier.RequestVerificationAsync(requestMessage);
return result == UserConsentVerificationResult.Verified;
}
В этом примере мы проверяем, что пользователь, использующий в данный момент устройство, тот же человек, что и владелец учётной записи. Как это сделать: UserConsentVerifier.RequestVerificationAsync – это метод, который берёт на себя проверку пользователя с помощью доступного варианта проверки, будь то аутентификация по отпечатку пальца, сетчатке глаза или любой другой способ. Удобство в том, что нам не приходится заботиться с помощью чего и как это происходит, главное, что такой вариант удовлетворяет нашим требованиям безопасности.
Без использования службы Windows Hello мы запрашиваем ввод пин-кода при каждом запуске приложения и долгом бездействии пользователя. Этот код используется для верификации запросов во время работы пользователя с приложением. В случае использования Windows Hello пользователю не нужно вводить этот код каждый раз и встаёт вопрос о безопасном хранении этого кода. Для этого на помощь приходит сервис PasswordVault, он позволяет хранить данные, требующие особого внимания к безопасности. Этот сервис не хранит данные в открытом виде. На устройствах, оборудованных специальным чипом для шифрования, сервис использует этот чип для защиты, на устройствах без чипа шифрования защита достигается программными средствами.
/// <summary>
/// Добавление данных пользователя для запросов к серверу
/// </summary>
/// <param name="userId">Идентификатор пользователя</param>
/// <param name="pin">ПИН-код доступа</param>
public void AddCredentials(string userId, string pin)
{
var vault = new PasswordVault();
vault.Add(new PasswordCredential(«Идентификатор Вашего приложения», userId, pin));
}
Этот пример показывает, как легко добавить данные в PasswordVault для хранения:
В случае смены или выхода пользователя в приложении необходимо выполнить удаление данных пользователя из хранилища паролей:
public void RemoveCredentials(string userId)
{
var vault = new PasswordVault();
var credentials = vault.Retrieve(«Идентификатор Вашего приложения», userId);
if (credentials != null)
vault.Remove(credentials);
}
В следующем примере представлен метод, который мы используем после запуска приложения:
public async Task<string> SignInAsync(string userId)
{
if (await CheckHelloStatusAsync() != WindowsHelloStatus.Available)
return null;
var result = await UserConsentVerifier.RequestVerificationAsync(requestMessage);
if (result != UserConsentVerificationResult.Verified)
return null;
var vault = new PasswordVault();
var credentials = vault.Retrieve(appCredentialsName, userId);
return credentials?.Password;
}
Сначала мы проверяем, что служба Windows Hello доступна. Затем просим службу подтвердить, что приложение использует пользователь, владелец учётной записи. Если пользователь прошёл проверку, то мы извлекаем ПИН-код для этого пользователя, который был сохранён туда при установке пин-кода Тинькофф.
И вот, при помощи 5 небольших методов мы интегрировали Windows Hello в приложение.
Комментарии (24)
foxyrus
21.05.2018 20:21-1Почему до сих пор не отображаются мультивалютные счета?
NikolaiKobzev Автор
22.05.2018 09:42В ближайший месяц мы планируем выпустить обновление, в которое войдёт большое количество новых функций, в том числе и поддержка мульти-валютных карт.
jkd
22.05.2018 08:49Вот гипотетически, у меня 100500 сервисов со входом по биометрии. Вслучае утечки данных, пароль(телефон, пин) я могу сменить. А как быть с отпечатками и т.п? Все сервисы автоматом компрометируются на всегда?
NikolaiKobzev Автор
22.05.2018 09:23Использование биометрической аутентификации, это не замена паролю или пин-коду, это средство упрощения/ускорения входа в систему. В случае компрометации, Вы всегда можете отключить данный способ и вернуться к аутентификации по логину и паролю или пин-коду.
kahi4
22.05.2018 09:42Основное преимущество Windows Hello — абстрагирование способа авторизации. Т.е. приложение реализует только одно API, а остальное уже берет на себя система. А сам Windows Hello умеет даже в usb токены, в общем то, набор датчиков уже зависит от вендоров (а настройки от пользователя).
achekalin
22.05.2018 10:55Платформа хорошая, но а) на десктопах не везде она есть (а где и используется Hello, почти везде это сделано бездумно), и б) мобильная винда понятно где, т.е. поддержка на мобильниках Hello поможет почти никому. Так?
NikolaiKobzev Автор
22.05.2018 11:08Да, Вы правы, на десктопах встречается не так часто, как хотелось бы, но в современных ноутбуках всё чаще встречаются, как минимум, сканеры отпечатка пальца. На Windows 10 Mobile пользователи ещё есть, но их действительно не так много, к сожалению.
achekalin
22.05.2018 18:37С Hello есть такая непонятка: юзеры (часто вижу) даже не в курсе, как они авторизуются. Винда предложила «попроще», нажали «да», и как-то дальше работаем.
Спрашивает пароль — ввожу пароль, спрашиват ПИН — ввожу пин, есть сканер работает — прижимаем палец.
В жизни даже веселее: провели пальцем, винда отказалась пускать, камера лицо не узнала — ура, ПИН подошел (хотя я не понимаю, как можно вместо пароля из 10 символов вводить 4 цифры, и думать, что это надежно?)
Это я к тому, что осознанности в действиях пользователей не очень много при таком разнообразии. Как ни крути, но хорошее начало идее MS в очередной раз довела до совсем не веселого вида. Увы.
И тратить силы на поддержку этой инфраструктуры… Ну, может и прикольно, но как-то не совсем понятно, зачем.dmitry_dvm
22.05.2018 23:38Пинкод только для локального входа. Во всех остальных местах требуется пароль. Так-то при локальном доступе злоумышленника и 100-символьный пароль не спасет. Вас же не смущает, что на банковских картах пинкод вместо пароля?
achekalin
22.05.2018 23:52Хм… А Вас не смущает, что в СМС только 140 латинских символов можно поместить? #смайлик
Вы вспомните исходные магнитные карты:
Первая магнитная карта, помните?
Карта с магнитной полосой версия 1.0: Скотч, полоска магнитной ленты, и кусок картона стали первой в мире картой с магнитной полосой,dmitry_dvm
23.05.2018 00:01А может хватит ориентироваться на среднего пользователя? Из-за этого пресловутого среднего потребителя и так все катится в ад. У меня одна тетя спросила, глядя на превьюшку фотки в проводнике при копировании на флешку «А она в таком маленьком виде и скопируется?». Хватит все упрощать и ухудшать в угоду среднему потребителю. Если ему нужен инструмент — пусть учится им пользоваться.
Спросите у среднего пользователя, что значит зеленая надпись «Безопасный/надежный сайт» в адресной строке. Он ответит, что никогда ее не замечал и что оказывается это называется адресная строка.achekalin
23.05.2018 09:46Я бы был за то, чтобы внутри винды (а заодно и во время установки) был бы выбор «уровня» юзера. Для простых (которые, как вы их не пытайтесь «тянуть», выше не полезут, а где и полезут, тупо не разберутся и будут тыкать в случайную кнопку) сделать все максимально просто, как в iPad, так, чтобы ломать было просто нечего. Для нас с вами — пульт управления системой, настройки безопасности, возможность что-то включить и отключить без шаманских танцев.
Десятка попробовала эти два подхода слить в один. В результате получилось «как всегда», хотя хотели, конечно, «как лучше».
Как вариант — пусть Home версия винды будет именно простой и дубовой, чтобы ворд запустить, чтобы браузер работал, чтобы вконтактик музыку играл. Все остальное — в винде Advanced. Одно плохо: MS пихает винду чуть не в каждый первый комп на планете, и не всегда можно купить то же комп, что мне нравится, но с Pro. Если разделение Home/Advanced будет реализовано, нужен какой-то переключатель при первом включении винды или позже…dmitry_dvm
23.05.2018 11:32Согласен насчет упрощенной версии, ее очень не хватает. В свое время, к сожалению, не взлетела Win RT, ибо как часто бывает с МС слишком опередила время.
NeuroHunter
24.05.2018 10:48Ну, во-первых, сейчас есть S-Mode, который является реинкарнацией Windows RT.
А во-вторых, проблема с этими упрощениями по принципу «90% пользователей используют только 10% нашего продукта» — в том, что у всех это разные 10%.
Feodot
23.05.2018 09:10В жизни даже веселее: провели пальцем, винда отказалась пускать, камера лицо не узнала — ура, ПИН подошел (хотя я не понимаю, как можно вместо пароля из 10 символов вводить 4 цифры, и думать, что это надежно?)
С ПИН есть «небольшое» НО, чтоб включить вход по отпечаткам пальцев, перед этим надо включить ПИН (если не подводит память, для включения входа по графическому ключу и скану морды тоже самое). На сайте Microsoft Community, полно тем с вопросами почему так сделано, правда нормального ответа нет. Из предположений разве что, на случай если камера/сканер отпечатков пальцев перестали работать, остается ПИН для входа в систему, НО, если есть возможность ввести ПИН, значит есть доступ до клавиатуры/мышке(для виртуальной клавиатуре) соответственно можно ввести и пароль…
Возможно для обычного пользователя и проще запомнить 4 цифры вместо пароля вида «123456», опытных же пользователей бесит необходимость установки ПИН.achekalin
23.05.2018 09:36Вы правы, это «отдельный перегиб» с их стороны. Почему в винде сделано так, а не иначе — я так и не понял, тем более что Hello авторизуется не только по отпечаткам, а по массе вариантов, и пин среди них выглядит той самой «задней дверью», из-за которой безопасность изначально несерьезна.
Пин только тем хорош (но для этого целую инфраструктуру разворачивать не нужно, явно), что он вводится цифрами: это решает известный UI баг винды, когда на экране ввода пароля автоматом включается русский язык ввода, когда «внутри» — тот, что юзер поставил (для ИТ-ников это английский). Цифры же — они везде цифры, тем более даже бабе Маше по силам придумать и запомнить 4 цифры — нас уже индустрия приучила.
Плохо только, что эти 4 цифры окажутся, как мы понимаем, довольно предсказуемыми.Feodot
23.05.2018 09:56Пин только тем хорош (но для этого целую инфраструктуру разворачивать не нужно, явно), что он вводится цифрами: это решает известный UI баг винды, когда на экране ввода пароля автоматом включается русский язык ввода, когда «внутри» — тот, что юзер поставил (для ИТ-ников это английский).
Это решается установкой английского, как основного языка.
Для пользователей из России может не так актуально, там надо минимум 2 языка (русский + английский), а для стран СНГ + живущих в других странная русскоязычных пользователей, приходится использовать как минимум три языка (английский, язык страны где находится пользователь + русский).
Плохо только, что эти 4 цифры окажутся, как мы понимаем, довольно предсказуемыми.
Там 3 попытки ввода ПИНа, дальше надо ввести пароль, для Украины сразу предположу варианты:
1) 0000 (много где стандартный ПИН)
2) 1111 (стандартный ПИН для СИМок)
3) Дата рождения (в особо продвинутых пользователей)
Вообщем ПИН зло, которые сделано для удобства пользователейachekalin
23.05.2018 10:02Это решается установкой английского, как основного языка.
Да, надо добраться до настройки, где указывается язык ввода на экране входа, и — сделать это. Но цифры — да, удобнее. Но я бы предпочел, чтобы внедрялись дополнительные (в т.ч. сложные) способы авторизации. Скажем, разрешать использовать пин, только если мои телефон или смарт-часы оказались рядом с компом.
И тут мы утыкаемся в аппаратные дебри: если Apple предлагает более-менее стандартный набор портов и интерфейсов, так, что на bluetooth можно расчитывать, то с виндой все плохо. В десктопной винде просто нельзя рассчитывать на что-то, кроме клавиатуры.
NeuroHunter
23.05.2018 10:26ПИН решает одну очень важную задачу — он позволяет, с одной стороны, сделать достаточно сложный пароль для учетной записи Microsoft, а с другой — не вводить эту 40+ символьную абракадабру каждый раз при включении/пробуждении/разблокировке компьютера
datacompboy
Стоп-стоп-стоп. То есть:
a) сам пин сохраняется на клиентском устройстве
б) смена пина сломает биоавторизацию
в) авторизация по распечатке лица позволит узнать пин
г) слив пользовательской приватной области трояном позволяет забрать втч и пин на сайт
я всё правильно понял?
Dobby007
Получается, у microsoft в очередной раз неудачное решение с windows hello получилось. По идее надо какой то хэш вычислять по биоданным пользователя и класть в passwordvault пин код, уже зашифрованный с помощью этого хэша. Тогда по идее даже при сливе приватной области пин узнать не получится.
dmitry_dvm
А где еще пину от приложения сохраняться, как не локально?
Авторизация инфракрасным сенсором по распечатанной сетчатке? Ну-ну.
Много троянов угнало пароли через взлом PasswordVault? И причем тут сайт?
NikolaiKobzev Автор
Не совсем так:
а) да, пин хранится на устройстве, но в каком виде я не могу сказать
б) нет, изменяя пин мы обновляем его в хранилище
в) нет. Windows Hello использует камеры с датчиком глубины, поэтому аутентификация происходит по 3D модели лица
г) нет, пин устанавливается на устройство и не имеет отношения к сайту или другим устройствам пользователя
datacompboy
Спасибо. Персонализация пина к устройству это хорошо. То есть я могу revoke'нуть его удалённо из кабинета с другого устройства?