К основному содержанию

Генератор 2FA‑кодов (TOTP) по секретному ключу

Вставьте секретный ключ 2FA: base32-строку, строку аккаунта вида login|pass|KEY или ссылку otpauth:// из QR-кода. Коды обновляются сами, когда истекает их период.

считается в браузере · ключ никуда не отправляется и не сохраняется

до смены кода — время устройства —

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

  1. Вставьте ключи в поле, по одному на строку. Подходит голый ключ (пробелы между группами можно не убирать), строка аккаунта через |, : или ; и ссылка otpauth://totp/… из QR-кода.
  2. Коды появятся сразу. Полоса над списком показывает, сколько секунд осталось до смены кода.
  3. Нажмите на код, чтобы скопировать его. Кнопка «Копировать все» соберёт список «метка, табуляция, код» — его можно вставить в таблицу.
  4. Если сервис выдал ключ с 8 цифрами, периодом 60 секунд или SHA-256, поменяйте настройки над полем. Из ссылки otpauth:// эти параметры инструмент берёт сам.

Как получается код

Шестизначный код в Google Authenticator, Authy или менеджере паролей — это TOTP, одноразовый пароль по времени (RFC 6238). Сервис и приложение знают общий секрет, тот самый ключ из QR-кода. Раз в 30 секунд каждый из них берёт номер текущего интервала, T = floor(unix-время / 30), считает от него HMAC-SHA1 на секрете и превращает 20 байт подписи в 6 цифр по правилу усечения из RFC 4226. Сети для этого не нужно: совпадают ключ и часы — совпадает код.

Здесь то же самое делает ваш браузер. HMAC считает встроенный Web Crypto API, своих реализаций хэш-функций на странице нет. Скрипт инструмента не делает ни одного сетевого запроса и ничего не пишет в localStorage: закрыли вкладку, и ключей больше нигде нет. У поля ввода выключены проверка орфографии и автозаполнение, чтобы браузер не отправлял текст в облачную проверку и не подставлял его обратно при возврате на страницу.

Какие строки понимает поле

  • Голый ключ: JBSWY3DPEHPK3PXP или группами, как его показывает Google: jbsw y3dp ehpk 3pxp. Регистр, пробелы, дефисы и хвостовые = не важны.
  • Строка аккаунта: login|pass|KEY, login:pass:mail:mailpass:KEY, поля через ; или табуляцию. Ключом считается последнее поле, похожее на base32 длиной от 16 символов, меткой — первое поле.
  • Ссылка из QR-кода: otpauth://totp/Service:me?secret=…&digits=8&period=60&algorithm=SHA256. Число цифр, период и алгоритм берутся из ссылки. Ссылки otpauth://hotp/ (код по счётчику нажатий) не поддерживаются.

Проверка на векторах RFC 6238

В приложении B стандарта опубликованы эталонные коды: 8 цифр, период 30 секунд, для SHA-1 ключ — ASCII-строка 12345678901234567890 (в base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ, её подставляет кнопка «Пример»). Скрипт этой страницы выдаёт на них те же значения, это проверяет автотест. Для SHA-256 и SHA-512 в стандарте ключи длиннее: та же строка цифр, повторённая до 32 и 64 байт.

Unix-времяSHA-1SHA-256SHA-512
59942870824611924690693936
1111111109070818046808477425091201
1234567890890059249181942493441116
2000000000692790379069882538618901

Где держать ключ

Ключ и есть второй фактор. У кого он есть, тот получает коды без вашего телефона. Файл со строками login|pass|KEY хранит пароль и второй фактор рядом, и утечка такого файла отдаёт аккаунт целиком. Для постоянных входов ключ лучше держать в приложении-аутентификаторе или менеджере паролей, а эту страницу открывать для разового кода или когда аккаунтов много. Про сам механизм — статья о 2FA в глоссарии; коды из писем, а не из приложения, приходят на почту — для них есть одноразовый ящик NeMail.

Частые вопросы

Ключ отправляется на сервер?

Нет. Код считает браузер через Web Crypto API. Скрипт инструмента не делает сетевых запросов, не кладёт ключ в адрес страницы и не сохраняет его в localStorage. Проверить можно на вкладке «Сеть» в инструментах разработчика: после вставки ключа новых запросов не появляется.

Почему сервис не принимает код?

Чаще всего виноваты часы: код привязан ко времени, и если часы устройства ушли на полминуты и больше, код может не совпасть с серверным. Время устройства показано над списком, сверьте его с точным. Вторая причина — настройки: если сервис выдал ключ для 8 цифр, периода 60 секунд или SHA-256, их нужно выставить над полем. Третья — повтор: RFC 6238 требует, чтобы сервер не принимал один и тот же код дважды, поэтому после удачного входа дождитесь следующего.

Где взять секретный ключ?

Его показывает сам сервис при включении двухфакторной аутентификации: рядом с QR-кодом обычно есть ссылка «не получается отсканировать» или «ввести ключ вручную». Если QR-код уже отсканирован, а ключ не сохранён, достать его из приложения можно не всегда. Тогда проще отключить и заново включить 2FA в настройках аккаунта.

Чем это отличается от Google Authenticator?

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

Можно ли получить код без ключа?

Нет. Код вычисляется только из ключа и времени. Потеряли ключ и телефон — остаются резервные коды, которые сервис выдавал при включении 2FA, или восстановление доступа через поддержку сервиса.

Что значат 8 цифр, 60 секунд и SHA-256?

Это параметры из RFC 6238. Обычно сервисы берут 6 цифр, 30 секунд и SHA-1, но стандарт разрешает и другие значения. Если сервис отдал ссылку otpauth://, параметры в ней уже записаны и инструмент их прочитает; строки со своим периодом показывают собственный обратный отсчёт.

Спонсоры проекта

Компании, которые помогают держать аналитику открытой
свежие базы — в канале Подписаться на канал