Как работает одноразовый пароль (OTP)?
В этой статье мы представим два разных метода одноразового пароля: email/телефон + проверочный код и динамический код.
С развитием интернета мы начали использовать множество онлайн-сервисов для удовлетворения почти всех наших нужд. Первый шаг в использовании этих сервисов — это часто регистрация и вход. Когда дело доходит до регистрации и входа, аутентификация с использованием идентификатора пользователя и пароля все еще широко используется, даже несмотря на то, что прошло более тридцати лет с тех пор, как использовались отдельные настольные компьютеры, не подключенные к интернету.
В прошлом нам, возможно, нужно было запоминать только пароль от нашей электронной почты, но сейчас мы часто используем десятки или даже сотни онлайн-сервисов, и мы не можем использовать один и тот же пароль для всех из них (если пароль для одной учетной записи будет скомпрометирован, все учетные записи с таким же паролем окажутся под угрозой). В результате вход без пароля становится все более популярным и постепенно становится основным способом.
Существует множество разных методов аутентификации без пароля, включая, но не огранич иваясь социальной авторизацией, email/телефон + проверочный код и использование аутентификаторов с динамическими паролями. Последние два метода можно классифицировать как одноразовые пароли (OTP).
Что такое одноразовый пароль (OTP)?
OTP — это автоматически генерируемая последовательность символов, которая действительна только для одной сессии входа или короткого периода времени. Поскольку OTP можно использовать только один раз, он может предотвратить риск утечки учетных данных, такой как утерянный или украденный пароль.
В теории, OTP может быть случайной строкой символов определенной длины, включая большие и маленькие буквы, а также специальные символы. Но ради удобства пользователя, большинство сервисов используют чистые числа, когда используют OTP.
Email / телефон + проверочный код
Многие веб-сайты требуют, чтобы вы подтвердили свою личность, отправив проверочный код (или пароль) на зарегистрирова нный вами email или номер телефона.
Представьте, что Джек и Джо играют в угадайку, где Джек думает о числе от 0 до 999, и дает Джо три шанса, чтобы угадать число в течение одной минуты. Помимо знания диапазона числа, у Джо нет никакой другой информации.
Мы все знаем, что Джо почти невозможно угадать число правильно в течение одной минуты, имея только три попытки.
Email / телефон + проверочный код работает по тому же принципу: проверочный код, как правило, действителен очень короткое время, обычно не более 10 минут (подобно тому, как Джек дает Джо «одну минуту» на угадывание числа). Кроме того, API или метод для проверки проверочного кода обычно имеет ограничение на скорость, чтобы предотвратить атаки методом подбора пароля (например, Джек дает Джо только «три шанса»).
Для потенциальных злоумышленников практически невозможно взломать этот метод. Однако система сообщает пользователю проверочный код через доверенный канал (email или телефон), позволяя пользователю непосредственно его подтвердить.
Динамический код
Динамический код, также известный как одноразовый пароль на основе времени (TOTP), является «динамическим» в том смысле, что он меняется со временем. В общем, если веб-приложение использует TOTP, оно будет следовать RFC6238 - TOTP: Time-Based One-Time Password Algorithm.
Одноразовый пароль на основе хеширования
Прежде чем представить TOTP, нам нужно коротко объяснить RFC4226 - HOTP: An HMAC-Based One-Time Password Algorithm (HMAC — это алгоритм хеширования). Алгоритм HOTP работает следующим образом:
-
Секрет: HOTP требует совместного секретного ключа K, который одинаков как на сервере, так и на клиенте.
-
Счетчик: В основе HOTP лежит счетчик C, который увеличивается каждый раз, когда генерируется новый пароль.
-
Вычисление HMAC:
-
Используйте HMAC-SHA-1 (или другие хеш-функции), чтобы вычислить код аутентификации:
-
Здесь H — это 160-битное значение хеша.
-
-
Усечение: Извлеките часть значения хеша H для создания OTP. Предположим, что нам нужен 6-значный OTP, процесс следующий:
- Извлеките последний байт H как смещение усечения O.
- Извлеките 4 байта, начиная с O, и преобразуйте их в целое число T.
- Возьмите последние d цифры T, т. е. OTP = T mod 10^d.
В общем, формула HOTP выглядит следующим образом:
где d — это требуемая длина OTP (обычно 6-8 цифр).
Одноразовый пароль на основе времени
TOTP является расширением HOTP, где счетчик заменен временным шагом. Он использует текущее время для генерации динамического проверочного кода, так что OTP автоматически истекает со временем. Принцип работы такой:
-
Временной шаг: TOTP использует текущее время T вместо счетчика HOTP C. Временной шаг — это установленный фиксированный временной интервал (обычно 30 секунд).
- Например, предположим, что временной шаг составляет 30 секунд, а текущий Unix-временная метка — это T. Счетчик TOTP рассчитывается как: T' = T / time_step
- Где T' — это счетчик временного шага, в единицах 30 секунд.
-
Генерация OTP: Подставьте T' в алгоритм HOTP для генерации OTP:
-
Динамическое обновление: Поскольку TOTP основан на временном шаге, OTP изменяется со временем, так что сервер может проверить его достоверность, пока OTP находится в допустимом временном окне.
В общем, формула TOTP выглядит следующим образом:
На основе нашего опыта использования приложений-аутентификаторов, мы можем синхронизировать секретное значение между устройством и сервером, сканируя QR-код или напрямую копируя и вставляя, а затем нам нужно ввести текущий динамический код один раз, чтобы убедиться, что секретное значение совпадает.
В первые дни использования мобильных устройств мы могли заметить, что время на различных устройствах было разным, и нам приходилось периодически вручную корректировать время на устройствах. В последние годы почти все устройства используют сетевую службу времени (NTP) для регулярной синхронизации и обновления времени устройства. Даже если часы устройства не совсем точные, частые обновления могут гарантировать, что время будет достаточно согласованным на разных устройствах. Исходя из такого предположения, динамический код все равно может использоваться даже если устройство находится в оффлайн-режиме, в то время как получение проверочного кода было бы затруднительным в оффлайн-состоянии.
Заключительные замечания
В этой статье мы представили два различных метода одноразового пароля: email/телефон + проверочный код и динамический код.
Email/телефон + проверочный код зависит от инфраструктуры связи и услуги стороннего email или SMS для реализации; динамический код не зависит от внешних сервисов и средств связи, и может использоваться офлайн.
Logto, как популярный, мощный и высоко расширяемый IAM-сервис (Identity and Access Management), поддерживает оба метода OTP, позволяя пользователям выбирать решение, которое наилучшим образом соответствует их нуждам с бизнес-стороны.