Инструменты
Руководства

Генератор TOTP / HOTP 2FA

Крипто

Создавайте одноразовые пароли на основе времени (TOTP) или счётчика (HOTP) из секрета Base32 или URI otpauth://. Обратный отсчёт в реальном времени и сканируемый QR-код — всё локально в вашем браузере.

100 % на клиенте Без бэкенда

Удалённые URL не запрашиваются; вставьте JSON напрямую.

Режим
Введите секрет Base32 (или вставьте URI otpauth://) для генерации кода.
TOTP
------
--
URI otpauth

Сканируйте в Google Authenticator, Authy, 1Password или любом TOTP-приложении.

Коды генерируются локально — ваш секрет не покидает браузер.
На этой странице

Что такое TOTP?#

Одноразовый пароль на основе времени (TOTP) — это меняющийся 6-значный код, который приложение-аутентификатор показывает рядом с каждой учётной записью. Под капотом это HMAC: общий секрет и текущее временное окно хешируются вместе, а результат усекается до короткого числового кода. Поскольку код зависит от часов, он сам сменяется каждые 30 секунд — и именно это позволяет использовать «то, что у вас есть» (секрет) как второй фактор без какого-либо сетевого обмена между телефоном и сервисом.

Эта страница — полностью рабочий генератор TOTP и HOTP. TOTP выводит код из текущего времени и сам обновляется по истечении периода; HOTP выводит его из счётчика, который продвигается с каждым использованием. Секрет Base32 можно ввести прямо или вставить URI otpauth:// (ту самую строку, что закодирована в QR-кодах, которые сервисы показывают при включении 2FA), и все поля заполнятся автоматически. Страница также отдаёт канонический URI otpauth:// и рисует сканируемый QR-код, поэтому новую учётную запись можно добавить в приложение телефона прямо отсюда.

Всё работает локально: секрет не покидает страницу, онлайн-вызовов к сервису аутентификации нет.

Как пользоваться#

  1. Выберите режим: TOTP (время) (на основе времени, обновляется сам) или HOTP (счётчик) (на основе счётчика, продвигается вручную).
  2. Предоставьте секрет. Либо вставьте Секрет (Base32) в поле секрета, либо вставьте URI otpauth:// в поле URI, чтобы сразу заполнить все параметры.
  3. Укажите Эмитент и Учётная запись (они влияют только на то, как запись будет названа в приложении-аутентификаторе, а не на сам код).
  4. Выберите алгоритм (SHA-1 / SHA-256 / SHA-512 — SHA-1 повсеместный стандарт), Цифр (6 / 7 / 8 — стандарт 6) и — для TOTP — Период (с) (по умолчанию 30). Для HOTP задайте Счётчик и нажимайте Следующий код, чтобы продвигать его после каждого использования.
  5. Нажмите Создать. Код появится крупно с кольцом обратного отсчёта, показывающим секунды до конца текущего периода; под ним — URI otpauth:// и сканируемый QR-код.

Ключевые возможности#

  • TOTP и HOTP в одном месте. Переключайтесь между вариантами на основе времени и счётчика без повторного ввода секрета.
  • Толерантная обработка Base32. Пробелы, дефисы, нижний регистр и случайные символы очищаются автоматически, поэтому секреты, скопированные из неудобных форматов, всё равно работают.
  • Импорт и экспорт URI. Вставьте URI otpauth://, чтобы заполнить все поля, или скопируйте сгенерированный URI, чтобы добавить новую учётную запись в другом месте.
  • Живой QR-код. Рисуется на странице из URI, готов к сканированию любым приложением-аутентификатором.
  • Кольцо обратного отсчёта. Наглядный отсчёт до следующего переворота, чтобы вы знали, хватит ли времени у кода, который вы собираетесь ввести.
  • Без отправки данных. Генерация, разбор и отрисовка QR — всё локально; секрет не передаётся.

Разбор примера#

Эталонный сид RFC 6238 — ASCII-строка 12345678901234567890, которая в Base32 равна GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ. Введите этот секрет, задайте 8 цифр и период 30, и коды совпадут с опубликованными тестовыми векторами:

  • SHA-1 в момент времени = 59 секунд от начала эпохи → 94287082
  • SHA-256 в тот же момент → 46119246
  • SHA-512 в тот же момент → 90693936

В момент времени = 1111111109 (далёкая будущая дата) SHA-1 выдаёт 07081804. Это те же известные эталонные значения, по которым собственный набор тестов инструмента проверяет корректность, поэтому они служат надёжным способом убедиться, что генератор работает правильно. Для повседневного 2FA сервисы используют 6 цифр, SHA-1 и 30-секундный период — верните цифры к 6, и тот же секрет даст меняющийся код, который показал бы аутентификатор.

FAQ#

Мой код не совпадает с кодом в приложении телефона. Что не так?#

Почти всегда проблема в секрете или в часах. Сначала убедитесь, что секрет Base32 идентичен, — скопируйте его снова со страницы настройки сервиса, потому что один неверный символ меняет всё. Затем проверьте параметры: большинство сервисов используют SHA-1, 6 цифр, 30-секундный период; если сервис использует SHA-256 или 8 цифр, а у вас выбран SHA-1 / 6, коды разойдутся. Наконец, убедитесь, что часы устройства верны — TOTP терпит небольшое рассогласование, но больше примерно 30 секунд отклонения всё сломают.

В чём разница между TOTP и HOTP?#

TOTP использует текущее время как меняющийся фактор, поэтому он автоматически продвигается каждый период. HOTP использует простой счётчик, увеличивающийся с каждым использованным кодом, поэтому обе стороны должны оставаться синхронизированы по тому, сколько кодов уже потрачено. TOTP — то, что почти в каждом потребительском сценарии 2FA сегодня, потому что ему не нужна синхронизация ни о чём, кроме часов.

Безопасно ли вводить мой секрет в веб-страницу?#

Секрет не покидает эту страницу — генерация, разбор и отрисовка QR идут локально в вашем браузере, без сетевых вызовов. Тем не менее для контролируемого вами продакшен-секрета 2FA самая безопасная практика — генерировать и хранить его в полностью доверенной среде, а не в какой-либо веб-странице, и сохранять резервные коды восстановления, которые выдал сервис.

Почему при вставке моего URI otpauth:// заполняется всё?#

Этот URI — стандартный формат обмена между приложениями-аутентификаторами: он кодирует тип, эмитента, учётную запись, секрет, алгоритм, число цифр и период (или счётчик) в одной строке. Парсер разбирает эти поля и заполняет форму — ровно то же самое происходит, когда вы сканируете QR-код телефоном: QR — это просто данный URI, представленный как изображение.