В статье рассматривается алгоритм одноразового пароля на основе времени (TOTP) и его реализация на языке Swift для мобильных устройств iOS. Описан принцип работы алгоритма, включая генерацию OTP-кодов, применение криптографических хеш-функций и динамическое усечение. Проведен анализ стандартов безопасности, а также рассмотрены особенности вычислений, влияющие на защиту пользовательских данных. Представлена программная реализация генератора OTP-кодов и проведено тестирование его корректности и устойчивости к потенциальным атакам.
Ключевые слова: аутентификация, алгоритм одноразового пароля на основе времени, информационная безопасность, мобильная разработка.
Введение
Современные системы аутентификации требуют надежных методов защиты пользовательских данных. Одним из распространенных решений является двухфакторная аутентификация (2FA), которая использует дополнительные механизмы проверки личности [1]. Одним из таких механизмов является алгоритм одноразового пароля на основе времени (TOTP), широко применяемый для защиты учетных записей. Данный алгоритм обеспечивает высокий уровень безопасности, поскольку коды аутентификации генерируются на основе текущего времени и секретного ключа, что затрудняет их предсказание и компрометацию. В работе рассматривается математическая модель алгоритма TOTP, принципы его работы, а также представлена его реализация на языке программирования Swift для мобильных устройств iOS.
Основная часть
TOTP (Time-based One-Time Password Algorithm) — алгоритм создания одноразовых паролей для защищенной аутентификации. Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Алгоритм TOTP следует открытому стандарту, задокументированному в RFC 6238.
HMAC (Hash-based Message Authentication Code) — механизм для расчета кодов аутентификации сообщений с помощью криптографической хеш-функции в сочетании с секретным ключом [2].
Обзор алгоритма одноразового пароля на основе времени
При регистрации аккаунта сервер генерирует секретный ключ, сохраняет его в базу данных и передаёт его на клиент. Дальнейшая аутентификация в систему производится на основе 6-значного кода, сгенерированного на авторизованном клиенте. Пользователь вводит логин, пароль и OTP-код, затем данные отправляется на сервер. Сервер принимает логин, пароль и OTP-код, состоящий из 6 символов, генерирует код на основе логина пользователя и секретного ключа, хранящегося в базе данных. Далее производится проверка сгенерированного кода и полученного значения с клиента, если результат проверки положителен, сервер сверяет пароли и производит авторизацию. В случае, если пользователь ввел неверные данные, на клиент возвращается ошибка для отображения пользователю.
Поскольку и сервер, и устройство, запрашивающее OTP, имеют доступ ко времени, которое является динамическим, оно принимается как параметр в алгоритме. Стандарт RFC 4226 предлагает использовать метку времени Unix, которая не зависит от часового пояса, т. е. время рассчитывается в секундах, начиная с первого января 1970 года [3].
Генератор OTP-кода на вход принимает секретный ключ, на выход отдает 6 символов (рисунок 1).
Рис. 1. Схема работы OTP-генератора
Исходные данные:



Используем HMAC для получения 20-байтовой строки (формула 9).
Эта длинная строка не подходит в качестве одноразового пароля. Необходимо привести полученную последовательность к 6-ти символам. Для этого стандарт RFC 4226 определяет способ обрезать эту строку до желаемой длины используя динамическое усечение (рисунок 2).
Рис. 2. Принцип работы динамического усечения
Берется последний байт из полученной 20-байтовой строки и извлекаются из него последние 4 бита. На выходе получается число от 0 до 15 — это значение смещения. Начиная с этого смещения необходимо взять значение следующих 31 битов 20-байтовой строки HMAC. Результатом будет число в шестнадцатеричной системе счисления. Осталось перевести число в десятичную систему и взять по модулю
Пример работы OTP-генератора
Возьмем значение секретного ключа:
Далее необходимо рассчитать
На данном этапе имеются все недостающие параметры для получения 20-байтовой строки. Воспользуемся формулой 9 и получим значение хэша. Функция HMAC может использовать различные алгоритмы хэширования, такие как SHA-1, SHA-256, MD5 и др. Воспользуемся алгоритмом SHA-256:
Теперь полученную строку необходимо привести к 6 символам. Используем динамическое усечение. Берем последний бит и переводим его в десятичную систему счисления:

Полученное значение 14 — смещение. Берем значение следующих четырех байтов от смещения 14 в 20-байтовой строке, получаем
Завершающим шагом берем полученное число по модулю по модулю

Полученное значение
Программная реализация OTP-генератора
На вход в функцию подается значение секретного ключа
Рис. 3. Реализация расчета количества временных шагов
Далее необходимо вычислить
Рис. 4. Реализация расчета HMAC
Следующим шагом выполняем динамическое усечение (рисунок 5):
Рис. 5. Реализация динамического усечения
Завершающим пунктом является приведение полученного значения н нужному виду (рисунок 6):

Рис. 6. Реализация преобразования к 6 символам
На выходе из функции подается значение
Заключение
В работе проведен анализ алгоритма одноразового пароля на основе времени (TOTP), его математическая модель и принципы работы. Рассмотрены механизмы вычисления HMAC, динамического усечения и преобразования данных в шестизначный OTP-код. Практическая реализация алгоритма на языке Swift позволила подтвердить его соответствие стандарту RFC 6238 и оценить устойчивость к возможным угрозам безопасности. Проведенное тестирование продемонстрировало стабильную генерацию OTP-кодов, обеспечивая надежную защиту учетных записей пользователей. В дальнейшем возможны исследования, направленные на интеграцию TOTP с биометрическими методами аутентификации и анализ устойчивости алгоритма к различным видам атак.
Литература:
- Идентификация, аутентификация и авторизация [Электронный ресурс]. Режим доступа: https://www.kaspersky.ru/blog/identification-authentication-authorization-difference/29123/
- Подписываем данные: HMAC на практике в API и Web-формах [Электронный ресурс]. Режим доступа: https://habr.com/ru/post/262341/
- RFC 4226 HOTP: An HMAC-Based One-Time Password Algorithm [Электронный ресурс]. Режим доступа: https://datatracker.ietf.org/doc/html/rfc4226
- One Time Password (OTP) algorithm in Cryptography [Электронный ресурс]. Режим доступа: https://www.geeksforgeeks.org/one-time-password-otp-algorithm-in-cryptography/
- Что ты такое, Event Loop? [Электронный ресурс]. Режим доступа: https://habr.com/ru/post/461401/