Как работают одноразовые пароли


Ещё совсем недавно словосочетание «одноразовый пароль» вызывало недоумение. Как это одноразовый? Кто будет использовать пароли, которые действуют только один раз? Сколько же нужно помнить паролей, чтобы после первого же использования пароль смениться?

Сейчас же уже все привыкли к использованию одноразовых паролей:
  • для входа в клиент банк и подтверждение операции нам приходит СМС с кодом
  • для усиления безопасности в играх можно использовать дополнительный код, который будет генерироваться мобильным приложением
  • вход на некоторые сайты так же требует одноразового пароля
  • организации для подключения к внутренним ресурсам удалённых сотрудников
  • и многое другое...

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

Говоря про одноразовые пароли, часто употребляют термин OTP — это аббревиатура от One Time Password.

Для начала стоит определить в где происходит генерация одноразовых паролей. Тут вариантов может быть три:
  • на стороне сервера
  • на стороне пользователя
  • смешанная (на стороне сервера и пользователя)

Если генерация одноразового пароля происходит на стороне сервера, то потом данный одноразовый пароль доставляется пользователю, например в письме, СМС, PUSH, мессенджере и т.д.
Это самый простой вариант получения одноразового пароля, но самый небезопасный, так как в процессе передачи пароля пользователю он может быть перехвачен и использован.

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

Примеры аппаратных генераторов одноразовых паролей:
Естественно, что генераторов одноразовых паролей намного больше.

Программные генераторы одноразовых паролей:
  • Google Authenticator
  • Free OTP
  • Яндекс.Ключ
  • WinAuth
  • и много других...
Практически каждый разработки решения для аутентификации с помощью одноразовых паролей пишет свой программный генератор одноразовых паролей.

Значение одноразового пароля может зависеть от времени или от события. То есть для генерации одноразового пароля может использоваться либо текущее время, либо событие. В качестве события обычно используется нажатие на кнопку или запуск приложения (об этом будет написано чуть ниже).

При смешанном варианте генерации одноразового пароля происходит следующее:
  • сервер генерирует некоторую последовательность, которая передаётся пользователю.
  • пользователь вводит данную последовательность на устройстве.
  • устройство генерирует одноразовый пароль, который потом используется пользователем.

Устройства, которые могут генерировать одноразовые одноразовые пароли по описанной схеме называются крипто калькуляторами:

Всё вышеописанное можно представить в виде схемы:


Пришло время разобраться, как работают автономные генераторы одноразовых паролей. Как уже было сказано выше, никакой связи с сервером для генерации одноразового пароля не нужно, всё происходит на стороне клиента или в брелоке (аппаратном генераторе) или в телефоне (программном генераторе).
Перед начало использования генератора одноразового пароля и программного и аппаратного должен быть сгенерирован секретный ключ, который называется вектором инициализации.

Для аппаратных генераторов, данный ключ генерируется и записывается в генератор на производстве (однако, некоторые аппаратные генераторы позволяют потом перезаписать секретный ключ). К каждому аппаратному генератору одноразовых паролей должен идти файл, в котором записан серийный номер генератора и тот же самый вектор инициализации (секретный ключ), который был записан при производстве. Данный файл потом помещается на сервер, который осуществляет проверку одноразовых паролей.

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

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

Для генерации одноразового пароля используется функция с двумя входными параметрами:
  • вектор инициализации
  • переменное значение — время или событие (счётчик нажатий на кнопку)

Рассмотрим процесс генерации и проверки одноразового пароля по событию. Схематично это можно представить следующим образом:


Один и тот же вектор инициализации находится в генераторе одноразовых паролей и на стороне сервера. Пользователь запускает приложение или нажимает на кнопку на аппаратном генераторе, то есть генерирует событие. Счётчик событий увеличивается и генератор вычисляет значение одноразового пароля в зависимости от вектора инициализации и от текущего значения счётчика событий.

Далее значение одноразового пароля передаётся на сервер (пользователь вводит в форму аутентификации свой логин и полученный одноразовый пароль). Сервер, получив логин пользователя, определяет какой именно ключ находится у пользователя и получает вектор инициализации, который записан в этом генераторе. При запросе на аутентификацию сервер увеличивает своё счётчик событий для данного пользователя и так же как и автономный генератор вычисляет значение одноразового пароля для данного пользователя. Если полученный от пользователя пароль и пароль, вычисленный на стороне сервера совпадают, то пользователь получает доступ.

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

Бывают случаи, когда пользователь случайно нажимает на кнопку генерации одноразового пароля и не передаёт его на сервер, то счётчик на стороне генератора увеличивается, а на стороне сервера счётчик остаётся прежним (так как запроса на проверку одноразового пароля не было). Происходит рассинхронизация счётчиков. Для решения данной проблемы, сервер проверяет не только текущее значение счётчика, которое у него записано, но и несколько значений вперёд. То есть получив запрос на проверку одноразового пароля, сервер начинает считать используя текущее значение счётчика и если одноразовые пароли (полученный от пользователя и посчитанный сервером) не совпадают, то сервер продолжает увеличивать счётчик несколько раз и для каждого значения счётчика считать значение одноразового пароля. Количество раз, которое сервер будет увеличивать счётчик называется окном синхронизации (в некоторой литературе это называется окном рассинхронизации).

Например, текущее значение счётчика на сервере равно 10, а на автономном генераторе значение счётчика рано 15. Пользователь генерирует значение одноразового пароля (счётчик при этом будет увеличен до 16 и значение OTP будет посчитано для значения счётчика равного 16) и передаёт это значение на сервер. Сервер получает значение одноразового пароля от пользователя (посчитанного для значения счётчика равного 16) и считает значение одноразового пароля используя внутреннее значение счётчика на сервере, равное 10. Пароли не совпадут, так как значение счётчиков разные. Сервер увеличивает значение своего счётчика на 1 и считает значение одноразового пароля при значении счётчика равного 11, значения опаять не совпадают. Сервер будет продолжать увеличивать внутреннее значение счётчика до 16, пока одноразовые пароли не совпадут, после чего пользователь получить доступ.
Однако увеличивать значение счётчика до бесконечности сервере не будет. Сервер остановиться при достижении значения окна синхронизации. То есть, если окно синхронизации равно 10, то сервер будет увеличивать свой счётчик только до 20 (начальное значение счётчика равно 10 и плюс окно синхронизации равно 10). То есть если счётчик на автономном генераторе будет 21, а счётчик на сервере будет 10, то с окном синхронизации равным 10, сервер рассчитает 10 значений одноразового пароля, ни одно из которых не совпадёт с полученным от пользователя, и остановится. Данное состояние называется рассинхронизацией автономного генератора одноразовых паролей.

Для синхронизации значений счётчиков на сервере и автономном генераторе существует процедура синхронизации. Чтобы провести данную процедуру, пользователь отправляет на сервер (в отдельном интерфейсе) два идущих подряд значения одноразовых паролей. Сервер, получив эти два значения от пользователя, начинает считать значения OTP не ограничиваясь окном синхронизации. Когда два идущих подряд значения будут найдены сервером, счётчик на стороне сервера будет скорректирован.

Аналогичным образом работает проверка значения одноразового пароля, генерируемого в зависимости от времени. Отличием является то, что время на автономном генераторе может убегать как вперёд, так и назад от времени на сервере. По этому при расчёте значений одноразовых паролей сервера в рамках окна синхронизации считает время не только вперёд, но и назад.

Никакой магии тут нет, только математика.

Нет комментариев