Как пользоваться
- Введите секрет со страницы двухфакторного входа сервиса в поле Секрет или URI otpauth:// или вставьте текст otpauth://, который хранит его QR-код. Нажмите Показать, чтобы проверить введённое.
- Выберите Хеш, Цифры и Период, которые называет сервис. Многие сервисы используют значения по умолчанию формата Key URI: SHA-1, 6 цифр и 30 секунд.
- Для сервиса на счётчике выберите По счётчику (HOTP) и введите счётчик; Счётчик + 1 сдвигает его.
- Используйте Текущий код, пока не истекло Осталось времени, и сверьте Предыдущий и Следующий коды, если часы вашего устройства немного расходятся.
Как создаётся код
HOTP (RFC 4226) берёт ключ-секрет и счётчик, вычисляет HMAC от счётчика с нужным хешем и берёт от результата четыре байта (динамическое усечение). Число, которое дают эти байты, по модулю 10 в степени числа цифр и есть код.
TOTP (RFC 6238) — это HOTP со счётчиком, который строится из времени: Unix-время в секундах, делённое на период и округлённое вниз. Новый код начинается с каждым периодом, поэтому обеим сторонам нужны точные часы.
TOTP = HOTP(key, floor(unix time / period)); HOTP = truncate(HMAC(key, counter)) mod 10^digits
Секреты и URI otpauth://
Секрет — это текст Base32 (RFC 4648): буквы от A до Z и цифры от 2 до 7. Пробелы игнорируются, а дополнение можно не писать. Секрет с символом вне этого набора или с невозможной длиной отклоняется.
URI otpauth:// (Key URI Format от Google) хранит тип, метку, секрет и необязательные издателя, алгоритм, цифры, период и счётчик. Недостающие настройки берутся по умолчанию формата: SHA1, 6 цифр, 30 секунд и счётчик 0.
Как проверена страница
Код проверен на тестовых значениях RFC 4226, приложение D (счётчики от 0 до 9), и RFC 6238, приложение B (шесть проверок для SHA-1, SHA-256 и SHA-512 с восемью цифрами). HMAC вычисляет SubtleCrypto вашего браузера.
Пример: тестовый секрет RFC 6238
Тестовый секрет RFC — это текст 12345678901234567890, который в Base32 записывается как GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ. При Unix-времени 59 и периоде 30 секунд шаг 1 TOTP даёт восьмизначный код 94287082 для SHA-1.
С шестью цифрами тот же шаг даёт 287082, код счётчика 1 из RFC 4226; это последние шесть цифр восьмизначного значения.
Частые вопросы
Секрет или код отправляются на сервер?
Нет. Код вычисляется в вашем браузере, и страница не делает запросов, в которых есть секрет или код. Ничего не сохраняется, а перезагрузка страницы забывает и то и другое.
Стоит ли вставлять сюда секрет моего настоящего аккаунта?
Только на странице, которой вы доверяете, и только если никто не видит ваш экран. Для настоящего аккаунта обычное место — приложение-аутентификатор, которое хранит секрет для повседневного использования. Эта страница подходит для ваших собственных инструментов и кодов, которые нужны один раз.
Почему код меняется каждые 30 секунд?
Код по времени (TOTP) использует число периодов с начала эпохи Unix, поэтому новый код начинается с каждым периодом. Обратный отсчёт показывает, сколько ещё действует текущий код.
Почему мой код не совпадает с кодом приложения сервиса?
Проверьте секрет (только Base32), хеш, цифры и период, которые называет сервис, а затем убедитесь, что часы вашего устройства верны, потому что код по времени от них зависит. Предыдущий и следующий коды помогают увидеть небольшое расхождение часов.
Какой хеш выбрать?
Тот, который указывает сервис. SHA-1 — значение по умолчанию для HOTP из RFC 4226 и для формата otpauth; RFC 6238 допускает для TOTP и SHA-256, и SHA-512.
В чём разница между TOTP и HOTP?
TOTP использует время, поэтому код меняется с каждым периодом. HOTP использует счётчик, который сдвигается при каждом использовании, поэтому код остаётся прежним, пока не изменится счётчик.
Что делает текст otpauth://?
Он переносит настройки двухфакторного ключа в формате Key URI, обычно внутри QR-кода. Вставка его сюда заполняет секрет, хеш, цифры, период и счётчик.
Источники
- RFC 4226: HOTP, одноразовый пароль на основе HMAC (на английском)
- RFC 6238: TOTP, одноразовый пароль на основе времени (на английском)
- RFC 4648: кодировки данных Base16, Base32 и Base64 (на английском)
- Google Authenticator: Key Uri Format (на английском)
- MDN: SubtleCrypto.sign() (на английском)
Цифры и текст в последний раз проверены вторник, 10 ноября 2026 г..