Эволюция одноразовых кодов: от TAN к Passkeys
TL;DR
Одноразовые коды (OTP) — основа повседневной цифровой безопасности. Мы вводим их при входе в банк, при подтверждении перевода, при доступе к облаку. Но не все коды одинаково безопасны.
В статье — сжатый обзор эволюции методов подтверждения: от бумажных TAN до криптографических Passkeys.
TAN или Как всё начиналось
Если вы когда‑нибудь пользовались интернет‑банком в начале 2000-х, скорее всего, вы видели TAN‑листы — бумажные или присылаемые по SMS коды, каждый из которых использовался один раз для подтверждения транзакции.
TAN (Transaction Authentication Number) — список одноразовых чисел, который выдавался банком клиенту. Один код — одна операция.
Пример:
2341
,9884
,1376
Способ доставки: бумага или SMS
Почему устарело:
Коды короткие, обычно 4 цифры
Нет привязки ко времени или контексту транзакции
Уязвимо к MITM, подмене форм и утечкам
HOTP и TOTP спешат на помощь
Со временем на смену статичным спискам пришли алгоритмы, генерирующие коды на лету.
HOTP (HMAC-Based One-Time Password)
Алгоритм описан в RFC 4226. Он использует счётчик и секретный ключ:
HOTP = HMAC(secret, counter)
Этот подход применялся в аппаратных токенах вроде RSA SecurID.
TOTP (Time-Based One-Time Password)
Дальнейшее развитие идеи — алгоритм из RFC 6238. Вместо счётчика — текущее время, округлённое до 30 секунд:
T = floor((time - t0) / 30)
TOTP = HMAC(secret, T)
Коды обычно шестизначные, живут 30 секунд.
Плюсы:
Работает офлайн
Криптостойкость (HMAC‑SHA1/256)
Простота реализации
Минусы:
Требует ручного ввода
Потеря устройства = потеря доступа
Push и App-TAN: проще и человечнее
Чтобы упростить UX, появились пуш‑уведомления. Вместо ввода кода вы просто подтверждаете вход:
«Вы пытаетесь войти в GitHub с устройства Chrome на Ubuntu?»
[Да] [Нет]
Это решение применяют Google Prompt, Microsoft Authenticator, банковские Push‑TAN). Что получаем:
Привязку к устройству
Контекст операции (локация, браузер)
Возможность отзыва
И UX лучше, и защита от фишинга уже куда серьезнее.
Аппаратная безопасность: U2F и FIDO2
Следующий шаг — аппаратные токены вроде YubiKey, SoloKey или Google Titan. Как это работает:
Устройство хранит приватный ключ
Подписывает challenge от сервера
Ключ нельзя извлечь или клонировать
Итог — максимальная защита к фишингу и MITM, нет секретов в браузере или на сервере, но нужно физическое устройство. Хотя по факту — носится как брелок или вшито в ноутбук.
Новый стандарт: Passkeys
Passkeys — это способ входа в аккаунт без пароля и без одноразового кода. Вместо того чтобы что‑то помнить или вводить, вы просто подтверждаете вход с помощью отпечатка пальца, Face ID или PIN‑кода — на своём устройстве.
Главное — удобство и устойчивость к фишингу. Вместо формы логина с паролем вы видите стандартный системный диалог — например, от Android, iOS, Windows Hello.
Почему это безопасно
В отличие от TOTP, где вы вводите код вручную и рискуете стать жертвой фишинга, Passkeys исключают человека из уязвимой части цепочки — ключ никогда не покидает устройство, а подтверждение нельзя перехватить, сервер получает только результат подписи (challenge‑response), а биометрия или PIN используются локально и только чтобы разблокировать ключ.
Это значит, что даже если злоумышленник подделает сайт, он не сможет перехватить Passkey или подделать вход.
Как выглядит процесс входа
Вы нажимаете «Войти с Passkey».
Операционная система показывает системный запрос подтверждения.
После подтверждения вход происходит без пароля.
Работает в современных браузерах и ОС — в том числе с возможностью синхронизации ключей через облако (Google, iCloud) или экспорта в 1Password, KeePass и др.
Если при попытке входа на webauthn.io вы увидели неожиданный запрос от Windows — это нормально: система предложила выбрать, чем подтвердить вход (например, PIN или внешний ключ). Этот процесс пока не всегда интуитивен, и UX дорабатывается, особенно для десктопных систем, но сама модель остаётся безопасной и прозрачной.
Сравнение поколений
Метод | Безопасность | Удобство | Описание |
---|---|---|---|
TAN | 🔴 | 🟢 | Код по SMS или бумаге |
TOTP | 🟢 | 🟡 | 6-значный код из приложения |
Push‑based | 🟢 | 🟢 | Подтверждение в один клик |
U2F/FIDO2 | 🟢🟢 | 🟢 | Аппаратный ключ, криптография |
Passkeys | 🟢🟢🟢 | 🟢🟢🟢 | Биометрия, нет пароля и кода |
Что всё это значит
Путь от TAN к Passkeys — это не просто эволюция алгоритмов. Это движение к модели, в которой безопасность уходит в инфраструктуру, а пользователь всё меньше должен помнить, вводить и проверять.
Хотя в статье Passkeys показаны как наиболее безопасный и удобный способ входа, это не значит, что TOTP «устарел» или всегда хуже. TOTP и Passkeys работают по разным моделям.
Модель | Пример | Требует соединения | Подвержен |
---|---|---|---|
Оффлайн OTP | TOTP, HOTP | Нет | Да |
Онлайн Push | Push-уведомления | Да | Иногда |
Криптографическая | Passkeys / WebAuthn | Да | Нет |
Выбор метода зависит от контекста. Для изолированных систем и корпоративных VPN оффлайновые OTP всё ещё надёжны. Для облачных сервисов и массовых приложений Passkeys и push дают лучший баланс UX и защиты.
Готов обсудить дополнения, опечатки, и альтернативные модели — особенно если вы работаете с аутентификацией на backend или проектируете user journey.
Этот текст подготовлен совместно с AI, с бережной верификацией фактов, терминов и структуры. Все выводы и обобщения — результат анализа. Если заметите неточности — приветствую в комментариях для уточнений.