company_banner

Как мы в Тинькофф использовали Windows Hello для аутентификации пользователя

    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 в приложение.
    Tinkoff.ru 201,32
    IT’s Tinkoff.ru — просто о сложном
    Поделиться публикацией
    Комментарии 32
    • +6
      Стоп-стоп-стоп. То есть:
      a) сам пин сохраняется на клиентском устройстве
      б) смена пина сломает биоавторизацию
      в) авторизация по распечатке лица позволит узнать пин
      г) слив пользовательской приватной области трояном позволяет забрать втч и пин на сайт
      я всё правильно понял?
      • 0

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

        • +7
          А где еще пину от приложения сохраняться, как не локально?
          Авторизация инфракрасным сенсором по распечатанной сетчатке? Ну-ну.
          Много троянов угнало пароли через взлом PasswordVault? И причем тут сайт?
          • +5
            Не совсем так:
            а) да, пин хранится на устройстве, но в каком виде я не могу сказать
            б) нет, изменяя пин мы обновляем его в хранилище
            в) нет. Windows Hello использует камеры с датчиком глубины, поэтому аутентификация происходит по 3D модели лица
            г) нет, пин устанавливается на устройство и не имеет отношения к сайту или другим устройствам пользователя
            • 0
              Спасибо. Персонализация пина к устройству это хорошо. То есть я могу revoke'нуть его удалённо из кабинета с другого устройства?
          • –5
            Почему до сих пор не отображаются мультивалютные счета?
            • +3
              В ближайший месяц мы планируем выпустить обновление, в которое войдёт большое количество новых функций, в том числе и поддержка мульти-валютных карт.
            • 0

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

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

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

                • 0
                  Платформа хорошая, но а) на десктопах не везде она есть (а где и используется Hello, почти везде это сделано бездумно), и б) мобильная винда понятно где, т.е. поддержка на мобильниках Hello поможет почти никому. Так?
                  • 0
                    Да, Вы правы, на десктопах встречается не так часто, как хотелось бы, но в современных ноутбуках всё чаще встречаются, как минимум, сканеры отпечатка пальца. На Windows 10 Mobile пользователи ещё есть, но их действительно не так много, к сожалению.
                    • 0
                      С Hello есть такая непонятка: юзеры (часто вижу) даже не в курсе, как они авторизуются. Винда предложила «попроще», нажали «да», и как-то дальше работаем.

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

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

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

                      И тратить силы на поддержку этой инфраструктуры… Ну, может и прикольно, но как-то не совсем понятно, зачем.
                      • 0
                        Пинкод только для локального входа. Во всех остальных местах требуется пароль. Так-то при локальном доступе злоумышленника и 100-символьный пароль не спасет. Вас же не смущает, что на банковских картах пинкод вместо пароля?
                        • 0
                          Хм… А Вас не смущает, что в СМС только 140 латинских символов можно поместить? #смайлик
                          Вы вспомните исходные магнитные карты:
                          Первая магнитная карта, помните?
                          image
                          Карта с магнитной полосой версия 1.0: Скотч, полоска магнитной ленты, и кусок картона стали первой в мире картой с магнитной полосой,
                          как они выглядели и сколько байт хранили на дорожках на магнитной полосе (спойлер: мало; да вы и сами знаете) — там, могу поверить, даже лишний символ пин-кода могли сэкономить. В телефонах сейчас и 6 символов часто ставят пароль на разблокировку аппарата.
                          Я же писал про пин больше как пример того, что средний пользователь запутывается в этих вариантах, и пользуется тем, что сейчас срабатывает. Обычно подобне веден не к росту, а к падению безопасности: понимание того, что сейчас происходит, для чего/почему — все это просто перестает быть ясным, и человек не может сделать осознанный выбор даже при угрозе его безопасности.
                          • 0
                            А может хватит ориентироваться на среднего пользователя? Из-за этого пресловутого среднего потребителя и так все катится в ад. У меня одна тетя спросила, глядя на превьюшку фотки в проводнике при копировании на флешку «А она в таком маленьком виде и скопируется?». Хватит все упрощать и ухудшать в угоду среднему потребителю. Если ему нужен инструмент — пусть учится им пользоваться.
                            Спросите у среднего пользователя, что значит зеленая надпись «Безопасный/надежный сайт» в адресной строке. Он ответит, что никогда ее не замечал и что оказывается это называется адресная строка.
                            • 0
                              Я бы был за то, чтобы внутри винды (а заодно и во время установки) был бы выбор «уровня» юзера. Для простых (которые, как вы их не пытайтесь «тянуть», выше не полезут, а где и полезут, тупо не разберутся и будут тыкать в случайную кнопку) сделать все максимально просто, как в iPad, так, чтобы ломать было просто нечего. Для нас с вами — пульт управления системой, настройки безопасности, возможность что-то включить и отключить без шаманских танцев.

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

                              Как вариант — пусть Home версия винды будет именно простой и дубовой, чтобы ворд запустить, чтобы браузер работал, чтобы вконтактик музыку играл. Все остальное — в винде Advanced. Одно плохо: MS пихает винду чуть не в каждый первый комп на планете, и не всегда можно купить то же комп, что мне нравится, но с Pro. Если разделение Home/Advanced будет реализовано, нужен какой-то переключатель при первом включении винды или позже…
                              • 0
                                Согласен насчет упрощенной версии, ее очень не хватает. В свое время, к сожалению, не взлетела Win RT, ибо как часто бывает с МС слишком опередила время.
                                • 0
                                  Ну, во-первых, сейчас есть S-Mode, который является реинкарнацией Windows RT.
                                  А во-вторых, проблема с этими упрощениями по принципу «90% пользователей используют только 10% нашего продукта» — в том, что у всех это разные 10%.
                        • 0
                          В жизни даже веселее: провели пальцем, винда отказалась пускать, камера лицо не узнала — ура, ПИН подошел (хотя я не понимаю, как можно вместо пароля из 10 символов вводить 4 цифры, и думать, что это надежно?)

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

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

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

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

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

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

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

                              Вообщем ПИН зло, которые сделано для удобства пользователей
                              • 0
                                Это решается установкой английского, как основного языка.

                                Да, надо добраться до настройки, где указывается язык ввода на экране входа, и — сделать это. Но цифры — да, удобнее. Но я бы предпочел, чтобы внедрялись дополнительные (в т.ч. сложные) способы авторизации. Скажем, разрешать использовать пин, только если мои телефон или смарт-часы оказались рядом с компом.
                                И тут мы утыкаемся в аппаратные дебри: если Apple предлагает более-менее стандартный набор портов и интерфейсов, так, что на bluetooth можно расчитывать, то с виндой все плохо. В десктопной винде просто нельзя рассчитывать на что-то, кроме клавиатуры.
                              • +1
                                Если внимательно посмотреть, то ПИН-код для входа в Windows 10 — это не 4 цифры, как многие пишут, а вполне допускает буквенные и спец.символы, что ставит его по стойкости в ряду с паролем
                            • 0
                              ПИН решает одну очень важную задачу — он позволяет, с одной стороны, сделать достаточно сложный пароль для учетной записи Microsoft, а с другой — не вводить эту 40+ символьную абракадабру каждый раз при включении/пробуждении/разблокировке компьютера
                        • +1
                          а) Удобно же, просто т.к мало приложений поддерживает — вот и не пользуются многие.
                          б) Мне помогла.

                          P.S. Очень неудобно, что нельзя в английской локали находить поиском приложение.
                          Я ввожу в поиск Tinkoff, а оно не находится, потому что называется Тинькофф
                          • 0

                            Вроде можно вызвать свойства программы и в поле комментарий написать нужные слова — по ним тоже будет поиск? Давно делал, но вроде победил тогда. Может, не сама программа, а файл-линк на нее нужно использовать?


                            А что удобная технология, так много их, удобных. Массовости бы им, иначе зачем тратить силы?

                            • 0

                              Спасибо за замечание, мы это исправим со следующим обновлением.

                            • 0
                              Давайте разбираться по порядку:
                              PIN-код от Windows Hello необходим для работы самой WH и никак не используется в банке, более того он не доступен разработчикам приложений.
                              Насчёт самой программы, даже если она выполняет заявленные функции, то это тоже никак не сказывается на безопасности пользователя. Во-первых, хранящийся в PasswordVault пин, не хранится в открытом виде, а используется его хэш, во-вторых, пин код привязан к устройству пользователя.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое