Локально в браузере / Данные не отправляются

TOTP QR Декодер

Расшифруйте QR-код 2FA, ссылку otpauth://, Base32-секрет или QR экспорта Google Authenticator — и получите живые одноразовые коды. Всё работает в вашем браузере — ничего не загружается на сервер.

Только для ваших собственных аккаунтов.

Что декодер принимает

Что этот декодер принимает

Изображение QR-кода
PNG, JPG, JPEG, GIF, BMP или WebP. Перетащите файл, выберите его кликом или вставьте через Ctrl+V. Подойдёт и скриншот, и фотография экрана другого устройства — это важно, когда приложение запрещает скриншоты.
Ссылка otpauth://
Вставьте саму ссылку, например otpauth://totp/ACME:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME.
Base32-секрет
Строка вида HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ. Пробелы, дефисы и строчные буквы допустимы — они нормализуются автоматически.
QR экспорта Google Authenticator
Формат otpauth-migration://offline?data=, в котором сразу несколько аккаунтов. Все они расшифровываются за один раз.

Для каждого аккаунта вы получаете живой шестизначный код с обратным отсчётом, Base32-секрет, полную ссылку otpauth:// и сгенерированный заново QR-код, который можно отсканировать в другое приложение.

Как расшифровать QR-код экспорта Google Authenticator

  1. Сделайте экспорт в приложении. В Google Authenticator откройте меню → «Перенос аккаунтов» → «Экспорт аккаунтов» и выберите нужные. В один QR-код Google упаковывает не более десяти аккаунтов; при большем количестве кодов будет несколько.
  2. Снимите код. На Android экран экспорта блокирует скриншоты, поэтому надёжный путь — сфотографировать экран вторым телефоном или камерой. Такая фотография здесь распознаётся нормально.
  3. Расшифруйте. Загрузите фото или скриншот выше — либо, если строка у вас уже есть текстом, вставьте otpauth-migration://offline?data=… напрямую.
  4. Импортируйте куда нужно. У каждого аккаунта появится свой QR-код и ссылка otpauth://, так что в другой аутентификатор их можно добавлять по одному.

QR-код экспорта не читается

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

Что внутри ссылки otpauth-migration

Параметр data — это protobuf в кодировке base64url. Внутри лежит сообщение MigrationPayload со списком OtpParameters: по одной записи на аккаунт, в каждой — байты секрета, метка, издатель и перечисления алгоритма, числа знаков и типа. Эта страница разбирает структуру локально и переводит каждый секрет в Base32.

Как перенести коды 2FA на новый телефон или в другое приложение

Сначала расшифруйте экспорт, сохраните секреты в надёжном месте, а затем обязательно проверьте вход хотя бы в два-три аккаунта с нового устройства. Только после этого удаляйте что-либо со старого телефона или сбрасывайте его — непроверенный секрет это не резервная копия.

Ссылки otpauth:// и QR-коды по аккаунтам импортируются в Aegis, Ente Auth, 2FAS, Bitwarden, 1Password, KeePassXC, Proton Pass, Яндекс ID и большинство других аутентификаторов — по одному коду за раз.

Два случая, в которых инструмент не поможет, чтобы вы не тратили время: Microsoft Authenticator не отдаёт свои секреты в читаемом виде вообще, а Steam Guard использует собственный формат вместо QR-кода otpauth://.

TOTP для Госуслуг и других сервисов

Вход по одноразовому коду вместо СМС включается в профиле: «Безопасность» → «Вход в систему» → вход с подтверждением одноразовым кодом. QR-код и секретный ключ там показываются один раз, при подключении — и это единственный момент, когда их можно сохранить.

Если вы сохранили тот QR-код или ссылку otpauth:// — загрузите их здесь, чтобы увидеть Base32-секрет и перенести код в другое приложение или на новый телефон. Если ничего не сохранено, извлечь ключ уже нельзя: TOTP так устроен, что сервис не отдаёт секрет повторно. В этом случае остаётся отключить и заново подключить одноразовый код в личном кабинете.

Кстати, в кириллической раскладке «TOTP» набирается как «ТОТР» — если вы искали именно так, вы попали туда, куда нужно. И ещё одно частое недоразумение: код TOTP никуда не «приходит». Он не присылается в СМС или письме, а каждые 30 секунд вычисляется на вашем устройстве из секретного ключа и текущего времени.

Безопасно ли расшифровывать QR-код 2FA здесь?

Разумное правило по умолчанию — никогда не вставлять секреты TOTP в онлайн-сервисы, и это правильный совет: большинство QR-декодеров в интернете отправляют ваше изображение на сервер. Разница здесь архитектурная — отправлять просто некуда, сервера нет.

Изображение читается библиотекой jsQR на canvas внутри страницы, данные экспорта разбирает protobufjs, коды считает totp-generator. Ни на одном шаге нет сетевого запроса с вашими данными. Нет бэкенда, нет отправки форм, ничего не пишется в хранилище браузера.

Как проверить это самостоятельно

  • Откройте DevTools → Network, очистите список и расшифруйте что-нибудь. Ни один запрос не содержит данных вашего QR-кода.
  • Отключите сеть после загрузки страницы — расшифровка продолжит работать.
  • Прочитайте исходный код: github.com/VizzleTF/TOTP_decoder.
  • Сохраните страницу вместе с бандлом и откройте файл с диска вообще без подключения к сети.

Честная оговорка: страница загружает анонимный счётчик посещений (Vercel Analytics), который передаёт адрес страницы и больше ничего. Доступа к содержимому QR-кода, секретам и сгенерированным кодам у него нет — но это сетевой запрос, вы увидите его в DevTools, и лучше заранее знать, что это.

Когда лучше взять офлайн-инструмент

Ваше доверие здесь опирается на то, что код доставлен честно по HTTPS. Это реальное допущение: тот, кто управляет хостингом, в принципе может отдать другой JavaScript. Для особо ценных секретов — корпоративных аккаунтов, криптобирж — запустите локальный инструмент на машине без сети, например scito/extract_otp_secrets или dim13/otpauth.

Справочник формата ссылки otpauth://

Полная ссылка TOTP выглядит так:

otpauth://totp/ACME%20Co:john.doe@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30

Параметр Обязателен Значения По умолчанию
type да totp | hotp
label да Issuer:Account, URL-encoded
secret да Base32, A–Z и 2–7
issuer нет название сервиса
algorithm нет SHA1 | SHA256 | SHA512 SHA1
digits нет 6 | 8 6
period нет секунды, только TOTP 30
counter только HOTP целое число

Многие аутентификаторы молча игнорируют algorithm и digits и просто предполагают SHA-1 с шестью знаками — поэтому код может оказаться неверным даже при правильном секрете. Нераспознанные параметры читающая сторона должна просто пропускать.

Base32-секрет: длина и частые ошибки

Обычно секрет содержит 16, 26 или 32 символа. Алфавит Base32 — это только буквы A–Z и цифры 2–7, поэтому если в строке есть 0, 1, 8 или 9, это не Base32 — обычная причина ошибки «неверный секрет». Завершающие = не обязательны, регистр не важен.

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

Загружается ли мой QR-код или секрет куда-нибудь?

Нет. Расшифровка идёт в вашем браузере, и принимать данные попросту некому — бэкенда нет. Единственный сетевой запрос после загрузки страницы — анонимный счётчик посещений, который видит только адрес страницы.

Можно ли расшифровать QR экспорта с несколькими аккаунтами сразу?

Да. В одном otpauth-migration:// до десяти аккаунтов, и все они выводятся отдельно — каждый со своим кодом, секретом и QR-кодом.

Почему не получается сделать скриншот QR-кода экспорта?

Google Authenticator помечает экран экспорта как защищённый, и Android блокирует захват экрана. Сфотографируйте экран другим устройством и загрузите фотографию.

QR экспорта не читается — что делать?

Экспортируйте меньше аккаунтов на один код — ориентируйтесь примерно на четыре. Получившийся QR намного разреженнее и уверенно распознаётся с фотографии.

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

На практике от 16 до 32 символов Base32, то есть от 80 до 160 бит. Короче 16 символов — подозрительно слабо; если в строке есть цифры вне диапазона 2–7, это вообще не Base32.

Код не принимается, хотя секрет верный. Почему?

Чаще всего сбились часы устройства — TOTP привязан к времени, и даже минута расхождения всё ломает. Иначе проверьте, что period, digits и algorithm совпадают с тем, что ожидает сервис.

Можно перенести коды в Bitwarden, Aegis или 1Password?

Да — каждый аккаунт здесь даёт стандартную ссылку otpauth:// и сканируемый QR-код, а это ровно то, что такие приложения принимают.

Работает ли с Microsoft Authenticator?

Нет. Microsoft Authenticator не умеет экспортировать секреты TOTP и не показывает их QR-кодом, так что расшифровывать нечего.

Работает ли со Steam Guard?

Нет. Steam хранит общий секрет в своём собственном формате файла, а не в QR-коде otpauth://, поэтому этот инструмент здесь не применим.

Это открытый код?

Да, лицензия MIT. Полные исходники — github.com/VizzleTF/TOTP_decoder.