Учётная запись двухфакторной аутентификации
Создайте секрет и QR-код для включения двухэтапной проверки, посмотрите код TOTP или HOTP, который показал бы Google Authenticator, Microsoft Authenticator или Authy, и проверьте, действителен ли код. Коды вычисляются в вашем браузере, а секрет не передаётся в ссылке.
Код

Введите действительный секрет, чтобы увидеть код.

QR-код для приложения
Проверка кода

Проверьте код так, как это сделал бы сервер: принимается текущий код и до 2 шагов до или после него, чтобы учесть расхождение часов.

Как это работает

TOTP (Time-based One-Time Password, RFC 6238) — алгоритм, стоящий за шестизначными кодами Google Authenticator, Microsoft Authenticator, Authy или 1Password. У сервиса и вашего телефона общий секрет; каждые 30 секунд обе стороны вычисляют HMAC от секрета и текущего времени, разбитого на шаги, сокращают результат до шести цифр и сравнивают его. Поскольку код никто не передаёт, пока вы его не введёте, он работает, даже если у телефона нет подключения к сети.

HOTP (RFC 4226) — базовый алгоритм: вместо времени он использует счётчик, который увеличивается при каждом запросе кода. TOTP — это HOTP, в котором счётчик заменён числом периодов, прошедших с 1970 года. Секрет записывается в Base32 и передаётся внутри URI otpauth://, который отображается в виде QR-кода при включении двухэтапной проверки.

Инструмент генерирует секреты с помощью криптографического генератора браузера, вычисляет текущий, предыдущий и следующий коды, формирует URI и его QR-код, разбирает существующий URI и проверяет код с тем же допуском по времени, что используют серверы. Секрет никогда не покидает ваш браузер и не включается в ссылку для обмена.

Примеры

GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 59 s94287082Тестовый вектор из RFC 6238. Секрет — это ASCII-текст 12345678901234567890, закодированный в Base32; на 59-й секунде эпохи Unix шаг равен 1, и восьмизначный код должен быть в точности таким.
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 1111111109 s07081804Ещё один вектор из RFC 6238, полезный для проверки того, что ваша реализация не теряет ведущие нули: код — это строка фиксированного числа цифр, а не целое число.
HOTP · GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · contador 0755224Первый вектор из RFC 4226 с шестью цифрами. При счётчике, равном 1, код становится 287082.
otpauth://totp/Ejemplo:ana%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=EjemploTOTP · SHA1 · 6 · 30 sФормат Key URI, определённый Google Authenticator и принятый остальными приложениями. Если algorithm, digits и period отсутствуют, подразумеваются SHA1, 6 и 30, поэтому большинство QR-кодов содержат только секрет и издателя.

Сценарии использования

  • Проверить включение 2FA в вашем приложении: сгенерировать секрет, отсканировать QR телефоном и убедиться, что сервер принимает тот же код, который показывает приложение.
  • Выяснить, почему сервер отклоняет действительные коды: совпадение с предыдущим или следующим шагом указывает на расхождение часов.
  • Проверить собственную реализацию TOTP или HOTP по тестовым векторам из RFC 6238 и 4226.
  • Прочитать URI otpauth://, экспортированный из другого приложения, чтобы узнать, какой алгоритм, сколько цифр и какой период использует учётная запись.
  • Добавить во второе приложение или в менеджер паролей тестовую учётную запись, секрет которой у вас уже есть в Base32.

Часто задаваемые вопросы

Почему сервер отклоняет код, который приложение показывает как действительный?

Почти всегда дело в часах. TOTP требует, чтобы телефон и сервер сходились во времени: при разнице в 30 секунд они уже вычисляют разные шаги. Поэтому серверы принимают один-два шага в каждую сторону. Если код совпадает с предыдущим или следующим шагом, синхронизируйте время сервера по NTP и включите автоматическое время на телефоне.

Безопасно ли генерировать здесь секрет для настоящей учётной записи?

Секрет генерируется с помощью crypto.getRandomValues и не покидает ваш браузер, но в продакшене его должен генерировать и хранить сервер, который будет проверять коды. Этот инструмент предназначен для тестирования и отладки. Относитесь к любому настоящему секрету как к паролю: тот, у кого он есть, может генерировать ваши коды вечно.

Стоит ли использовать SHA-256, 8 цифр или 60 секунд?

Теоретически они надёжнее, но некоторые приложения, в том числе версии Google Authenticator, игнорируют эти параметры и всегда вычисляют SHA-1 с 6 цифрами каждые 30 секунд, из-за чего пользователь видит коды, которые сервер отклоняет. SHA-1 по-прежнему безопасен в составе HMAC. Ради совместимости почти все сервисы используют значения по умолчанию.

Какой длины должен быть секрет?

RFC 4226 требует не менее 128 бит и рекомендует 160, что в Base32 составляет 32 символа. Многие сервисы используют 80 бит (16 символов), и приложения их всё равно принимают. Этот инструмент генерирует 160 бит.

Защищает ли TOTP от фишинга?

Не полностью. Он гораздо лучше SMS, которые можно перехватить или украсть через подмену SIM-карты, но поддельный сайт может запросить у вас код и использовать его на настоящем в те же 30 секунд. Ключи безопасности FIDO2 и passkeys привязаны к домену и устойчивы к такой атаке.

Что будет, если я потеряю телефон?

Без секрета вычислить коды невозможно. Поэтому при включении 2FA сервисы выдают коды восстановления: храните их вне телефона. Некоторые приложения позволяют создавать зашифрованные резервные копии учётных записей в облаке или экспортировать их в виде QR для переноса на другое устройство.