Windows Hello

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)


  1. datacompboy
    21.05.2018 19:16
    +6

    Стоп-стоп-стоп. То есть:
    a) сам пин сохраняется на клиентском устройстве
    б) смена пина сломает биоавторизацию
    в) авторизация по распечатке лица позволит узнать пин
    г) слив пользовательской приватной области трояном позволяет забрать втч и пин на сайт
    я всё правильно понял?


    1. Dobby007
      21.05.2018 21:33

      Получается, у microsoft в очередной раз неудачное решение с windows hello получилось. По идее надо какой то хэш вычислять по биоданным пользователя и класть в passwordvault пин код, уже зашифрованный с помощью этого хэша. Тогда по идее даже при сливе приватной области пин узнать не получится.


    1. dmitry_dvm
      21.05.2018 22:40
      +3

      А где еще пину от приложения сохраняться, как не локально?
      Авторизация инфракрасным сенсором по распечатанной сетчатке? Ну-ну.
      Много троянов угнало пароли через взлом PasswordVault? И причем тут сайт?


    1. NikolaiKobzev Автор
      22.05.2018 08:56
      +1

      Не совсем так:
      а) да, пин хранится на устройстве, но в каком виде я не могу сказать
      б) нет, изменяя пин мы обновляем его в хранилище
      в) нет. Windows Hello использует камеры с датчиком глубины, поэтому аутентификация происходит по 3D модели лица
      г) нет, пин устанавливается на устройство и не имеет отношения к сайту или другим устройствам пользователя


      1. datacompboy
        22.05.2018 13:26

        Спасибо. Персонализация пина к устройству это хорошо. То есть я могу revoke'нуть его удалённо из кабинета с другого устройства?


  1. foxyrus
    21.05.2018 20:21
    -1

    Почему до сих пор не отображаются мультивалютные счета?


    1. NikolaiKobzev Автор
      22.05.2018 09:42

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


  1. jkd
    22.05.2018 08:49

    Вот гипотетически, у меня 100500 сервисов со входом по биометрии. Вслучае утечки данных, пароль(телефон, пин) я могу сменить. А как быть с отпечатками и т.п? Все сервисы автоматом компрометируются на всегда?


    1. NikolaiKobzev Автор
      22.05.2018 09:23

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


  1. kahi4
    22.05.2018 09:42

    Основное преимущество Windows Hello — абстрагирование способа авторизации. Т.е. приложение реализует только одно API, а остальное уже берет на себя система. А сам Windows Hello умеет даже в usb токены, в общем то, набор датчиков уже зависит от вендоров (а настройки от пользователя).


  1. achekalin
    22.05.2018 10:55

    Платформа хорошая, но а) на десктопах не везде она есть (а где и используется Hello, почти везде это сделано бездумно), и б) мобильная винда понятно где, т.е. поддержка на мобильниках Hello поможет почти никому. Так?


    1. NikolaiKobzev Автор
      22.05.2018 11:08

      Да, Вы правы, на десктопах встречается не так часто, как хотелось бы, но в современных ноутбуках всё чаще встречаются, как минимум, сканеры отпечатка пальца. На Windows 10 Mobile пользователи ещё есть, но их действительно не так много, к сожалению.


      1. achekalin
        22.05.2018 18:37

        С Hello есть такая непонятка: юзеры (часто вижу) даже не в курсе, как они авторизуются. Винда предложила «попроще», нажали «да», и как-то дальше работаем.

        Спрашивает пароль — ввожу пароль, спрашиват ПИН — ввожу пин, есть сканер работает — прижимаем палец.

        В жизни даже веселее: провели пальцем, винда отказалась пускать, камера лицо не узнала — ура, ПИН подошел (хотя я не понимаю, как можно вместо пароля из 10 символов вводить 4 цифры, и думать, что это надежно?)

        Это я к тому, что осознанности в действиях пользователей не очень много при таком разнообразии. Как ни крути, но хорошее начало идее MS в очередной раз довела до совсем не веселого вида. Увы.

        И тратить силы на поддержку этой инфраструктуры… Ну, может и прикольно, но как-то не совсем понятно, зачем.


        1. dmitry_dvm
          22.05.2018 23:38

          Пинкод только для локального входа. Во всех остальных местах требуется пароль. Так-то при локальном доступе злоумышленника и 100-символьный пароль не спасет. Вас же не смущает, что на банковских картах пинкод вместо пароля?


          1. achekalin
            22.05.2018 23:52

            Хм… А Вас не смущает, что в СМС только 140 латинских символов можно поместить? #смайлик
            Вы вспомните исходные магнитные карты:

            Первая магнитная карта, помните?
            image
            Карта с магнитной полосой версия 1.0: Скотч, полоска магнитной ленты, и кусок картона стали первой в мире картой с магнитной полосой,


            1. dmitry_dvm
              23.05.2018 00:01

              А может хватит ориентироваться на среднего пользователя? Из-за этого пресловутого среднего потребителя и так все катится в ад. У меня одна тетя спросила, глядя на превьюшку фотки в проводнике при копировании на флешку «А она в таком маленьком виде и скопируется?». Хватит все упрощать и ухудшать в угоду среднему потребителю. Если ему нужен инструмент — пусть учится им пользоваться.
              Спросите у среднего пользователя, что значит зеленая надпись «Безопасный/надежный сайт» в адресной строке. Он ответит, что никогда ее не замечал и что оказывается это называется адресная строка.


              1. achekalin
                23.05.2018 09:46

                Я бы был за то, чтобы внутри винды (а заодно и во время установки) был бы выбор «уровня» юзера. Для простых (которые, как вы их не пытайтесь «тянуть», выше не полезут, а где и полезут, тупо не разберутся и будут тыкать в случайную кнопку) сделать все максимально просто, как в iPad, так, чтобы ломать было просто нечего. Для нас с вами — пульт управления системой, настройки безопасности, возможность что-то включить и отключить без шаманских танцев.

                Десятка попробовала эти два подхода слить в один. В результате получилось «как всегда», хотя хотели, конечно, «как лучше».

                Как вариант — пусть Home версия винды будет именно простой и дубовой, чтобы ворд запустить, чтобы браузер работал, чтобы вконтактик музыку играл. Все остальное — в винде Advanced. Одно плохо: MS пихает винду чуть не в каждый первый комп на планете, и не всегда можно купить то же комп, что мне нравится, но с Pro. Если разделение Home/Advanced будет реализовано, нужен какой-то переключатель при первом включении винды или позже…


                1. dmitry_dvm
                  23.05.2018 11:32

                  Согласен насчет упрощенной версии, ее очень не хватает. В свое время, к сожалению, не взлетела Win RT, ибо как часто бывает с МС слишком опередила время.


                  1. NeuroHunter
                    24.05.2018 10:48

                    Ну, во-первых, сейчас есть S-Mode, который является реинкарнацией Windows RT.
                    А во-вторых, проблема с этими упрощениями по принципу «90% пользователей используют только 10% нашего продукта» — в том, что у всех это разные 10%.


        1. Feodot
          23.05.2018 09:10

          В жизни даже веселее: провели пальцем, винда отказалась пускать, камера лицо не узнала — ура, ПИН подошел (хотя я не понимаю, как можно вместо пароля из 10 символов вводить 4 цифры, и думать, что это надежно?)

          С ПИН есть «небольшое» НО, чтоб включить вход по отпечаткам пальцев, перед этим надо включить ПИН (если не подводит память, для включения входа по графическому ключу и скану морды тоже самое). На сайте Microsoft Community, полно тем с вопросами почему так сделано, правда нормального ответа нет. Из предположений разве что, на случай если камера/сканер отпечатков пальцев перестали работать, остается ПИН для входа в систему, НО, если есть возможность ввести ПИН, значит есть доступ до клавиатуры/мышке(для виртуальной клавиатуре) соответственно можно ввести и пароль…
          Возможно для обычного пользователя и проще запомнить 4 цифры вместо пароля вида «123456», опытных же пользователей бесит необходимость установки ПИН.


          1. achekalin
            23.05.2018 09:36

            Вы правы, это «отдельный перегиб» с их стороны. Почему в винде сделано так, а не иначе — я так и не понял, тем более что Hello авторизуется не только по отпечаткам, а по массе вариантов, и пин среди них выглядит той самой «задней дверью», из-за которой безопасность изначально несерьезна.

            Пин только тем хорош (но для этого целую инфраструктуру разворачивать не нужно, явно), что он вводится цифрами: это решает известный UI баг винды, когда на экране ввода пароля автоматом включается русский язык ввода, когда «внутри» — тот, что юзер поставил (для ИТ-ников это английский). Цифры же — они везде цифры, тем более даже бабе Маше по силам придумать и запомнить 4 цифры — нас уже индустрия приучила.

            Плохо только, что эти 4 цифры окажутся, как мы понимаем, довольно предсказуемыми.


            1. Feodot
              23.05.2018 09:56

              Пин только тем хорош (но для этого целую инфраструктуру разворачивать не нужно, явно), что он вводится цифрами: это решает известный UI баг винды, когда на экране ввода пароля автоматом включается русский язык ввода, когда «внутри» — тот, что юзер поставил (для ИТ-ников это английский).

              Это решается установкой английского, как основного языка.

              Для пользователей из России может не так актуально, там надо минимум 2 языка (русский + английский), а для стран СНГ + живущих в других странная русскоязычных пользователей, приходится использовать как минимум три языка (английский, язык страны где находится пользователь + русский).

              Плохо только, что эти 4 цифры окажутся, как мы понимаем, довольно предсказуемыми.

              Там 3 попытки ввода ПИНа, дальше надо ввести пароль, для Украины сразу предположу варианты:
              1) 0000 (много где стандартный ПИН)
              2) 1111 (стандартный ПИН для СИМок)
              3) Дата рождения (в особо продвинутых пользователей)

              Вообщем ПИН зло, которые сделано для удобства пользователей


              1. achekalin
                23.05.2018 10:02

                Это решается установкой английского, как основного языка.

                Да, надо добраться до настройки, где указывается язык ввода на экране входа, и — сделать это. Но цифры — да, удобнее. Но я бы предпочел, чтобы внедрялись дополнительные (в т.ч. сложные) способы авторизации. Скажем, разрешать использовать пин, только если мои телефон или смарт-часы оказались рядом с компом.
                И тут мы утыкаемся в аппаратные дебри: если Apple предлагает более-менее стандартный набор портов и интерфейсов, так, что на bluetooth можно расчитывать, то с виндой все плохо. В десктопной винде просто нельзя рассчитывать на что-то, кроме клавиатуры.


          1. NeuroHunter
            23.05.2018 10:26

            ПИН решает одну очень важную задачу — он позволяет, с одной стороны, сделать достаточно сложный пароль для учетной записи Microsoft, а с другой — не вводить эту 40+ символьную абракадабру каждый раз при включении/пробуждении/разблокировке компьютера