Глоссарий
TOTP
TOTP это одноразовый код, который обе стороны выводят из общего ключа и часов, годный один короткий шаг.
Откуда берутся шесть цифр
Договор заключается один раз. Сайт показывает ключ, вы оставляете себе копию, и дальше обе стороны считают один и тот же ответ, не разговаривая друг с другом.
- 1
Часы превращаются в число
Время нарезано на отрезки по тридцать секунд, и текущий отрезок пронумерован от общего начала.
- 2
Ключ подписывает это число
От номера отрезка берётся свёртка на ключе, и повторить её может только тот, у кого ключ есть.
- 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: она несёт эти настройки с собой. Голый ключ не несёт ни одной из них и читается с общепринятыми значениями.
- Это тот же второй шаг, что у моего собственного входа?
- Нет. Тот живёт на нашем сервере и имеет свой список запасных кодов, а ключ в профиле принадлежит аккаунту, в который этот профиль входит.
- Может ли один ключ быть у двоих?
- Может, и оба увидят одни и те же цифры. Ключ это общий секрет, поэтому передать его значит передать второй шаг.
Рядом с этим
Одноразовые коды в профиле
Куда кладётся ключ и что показывает окно, пока код жив.
Менеджер паролей
Из каких четырёх частей он состоит и какие из них есть у профиля.
Шифрование при хранении
Чего стоит копия файла после того, как она ушла с вашей машины.
Местный интерфейс
Ход, который отдаёт сценарию цифры в тот миг, когда их спросила форма.
Посмотрите на цифры рядом с профилем
Добавьте ключ одному профилю, откройте меню на его карточке, и текущий код появится в том же окне, где живёт профиль.