Перейти к содержимому

Глоссарий

TOTP

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

TOTP это одноразовый код, который обе стороны выводят из общего ключа и часов, годный один короткий шаг.

Откуда берутся шесть цифр

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

  1. 1

    Часы превращаются в число

    Время нарезано на отрезки по тридцать секунд, и текущий отрезок пронумерован от общего начала.

  2. 2

    Ключ подписывает это число

    От номера отрезка берётся свёртка на ключе, и повторить её может только тот, у кого ключ есть.

  3. 3

    Свёртка режется до шести цифр

    Из неё выбираются четыре байта и сводятся к той длине, которую ждёт сайт.

Почему это работает без связи

Стороны не переговариваются вовсе. Ключ есть у обеих с самого начала, и общее у них дальше только время.

В этом же и слабое место. Машина с ушедшими часами выдаёт цифры, которые сайт уже перестал принимать, а в ответ приходит обычное сообщение про неверный код.

Где профиль держит ключ

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

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

Что стоит между ключом и копией

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

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

С чем это путают

  • HOTP

    Там подписывается счёт входов, а не часы, поэтому такие коды ждут вас, а не перещёлкиваются сами.

  • Код в сообщении на телефон

    Он идёт через телефонную сеть, и поэтому подменённая карта уводит аккаунт вместе с собой.

  • Запасные коды

    Напечатанный список, где каждая строка годится один раз, и держат его на день, когда ключа уже нет.

  • Второй шаг вашего собственного входа

    Тот живёт на нашем сервере со своим списком запасных кодов, и профиль его никогда не носит.

Чего это не делает

  • Это не менеджер паролей. Профиль держит один ключ, хранилища нет, поиска по аккаунтам нет, и запасные коды, выданные сайтом, положить некуда.
  • Ключ не закрыт связкой ключей. Права только для хозяина закрывают файл на macOS и Linux, а на Windows эту работу делает учётная запись, внутри которой лежит папка.
  • Потерянный ключ остаётся потерянным. На наш сервер он не уезжает, и восстановить его из уже выданных цифр программа не может.
  • Цифры идут по часам этого компьютера. Ушедшие часы заставляют сайты их отвергать, и ни одно сообщение не указывает на часы как на причину.

Проверить

За каждым утверждением выше стоит файл, а за большинством ещё и стенд, который краснеет, когда утверждение перестаёт быть правдой.

Цифры сходятся с опубликованными образцами стандарта, включая номер отрезка за пределами тридцати двух бит
apps/desktop/src/lib/totp.js · apps/desktop/test/totp.js
Файл с ключом пишется правами только для хозяина и целиком
apps/desktop/src/lib/secureFile.js · apps/desktop/test/secrets-on-disk.js
Восстановленный профиль сохраняет длину, шаг и алгоритм
apps/desktop/test/config-import-2fa.js
Второй шаг вашего входа одноразовый, и запасной код тоже годится один раз
apps/server/src/auth/2fa/totp.ts · apps/server/test/two-factor.js

Вопросы

Уходит ли код в сеть?
Нет. Цифры считаются из ключа на этом компьютере, поэтому они появляются и с выдернутым проводом.
Программа умеет читать квадратную картинку с экрана?
С картинки нет. Сайты печатают ключ текстом рядом с ней, и вставляют именно этот текст.
А если сайт выдал восемь цифр или шаг в шестьдесят секунд?
Вставьте целую строку otpauth: она несёт эти настройки с собой. Голый ключ не несёт ни одной из них и читается с общепринятыми значениями.
Это тот же второй шаг, что у моего собственного входа?
Нет. Тот живёт на нашем сервере и имеет свой список запасных кодов, а ключ в профиле принадлежит аккаунту, в который этот профиль входит.
Может ли один ключ быть у двоих?
Может, и оба увидят одни и те же цифры. Ключ это общий секрет, поэтому передать его значит передать второй шаг.

Посмотрите на цифры рядом с профилем

Добавьте ключ одному профилю, откройте меню на его карточке, и текущий код появится в том же окне, где живёт профиль.