Как пользоваться
- Вставьте ключи в поле, по одному на строку. Подходит голый ключ (пробелы между группами можно не убирать), строка аккаунта через |, : или ; и ссылка otpauth://totp/… из QR-кода.
- Коды появятся сразу. Полоса над списком показывает, сколько секунд осталось до смены кода.
- Нажмите на код, чтобы скопировать его. Кнопка «Копировать все» соберёт список «метка, табуляция, код» — его можно вставить в таблицу.
- Если сервис выдал ключ с 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-1 | SHA-256 | SHA-512 |
|---|---|---|---|
59 | 94287082 | 46119246 | 90693936 |
1111111109 | 07081804 | 68084774 | 25091201 |
1234567890 | 89005924 | 91819424 | 93441116 |
2000000000 | 69279037 | 90698825 | 38618901 |
Где держать ключ
Ключ и есть второй фактор. У кого он есть, тот получает коды без вашего телефона. Файл со строками 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://, параметры в ней уже записаны и инструмент их прочитает; строки со своим периодом показывают собственный обратный отсчёт.