Что такое TOTP

TOTP - для двухфакторной авторизации. Вместо кода на мобильный телефон (считается небезопасным).

Схема работы:

  1. У клиента и сервера - есть общий секрет.
  2. У клиента и сервера - синхронизированы часы.
  3. Когда нужно авторизоваться, сервер вычисляет HASH(T+SECRET). T - это количество интервалов времени (например 30-секундных) с unix epoch.
  4. Клиент тоже считает HASH(T+SECRET).
  5. Клиент и сервер берут определённым общеизвестным способом первые цифры от хэша.
  6. Клиент передаёт серверу токен, сервер делает сравнение.

Возможные уязвимости/проблемы:

  1. Может утечь общий секрет, как со стороны клиента, так и со стороны сервера. С кодами на мобильный телефон именно этого не может произойти, к слову.
  2. Можно перехватить одноразовый ключ.
  3. Может произойти рассинхрон времени: тогда нельзя будет авторизоваться.

Опенсорсные приложения для Android для TOTP.

Из лучших, рекомендуют

  • Aegis (посмотрел, выглядит нормально, есть какая-то защита).
  • freeOTP+ (пока не смотрел, форк freeOTP).

ещё смотрел

  • secur - заброшенный, как плюс разве что простота интерфейса.

  • reddit что-то про Aegis и andOTP

Зачем

Гитхаб требует начать использовать двухфакторку от отдельных аккаунтов.

Что такое HOTP

(2025-07-12)

Эта схема стала предшественником TOTP.

Схема работы:

  1. У клиента и сервера - общий секрет SECRET.
  2. У клиента и сервера - общий счётчик I.
  3. Когда нужно авторизоваться, сервер вычисляет HASH(SECRET, I). HASH - описывается что SHA1, хотя и считается уязвимым к коллизиям.
  4. Клиент вычисляет HASH(SECRET, I).
  5. Клиент и сервер выделяют общеизвестным способом цифры (6-8 цифр) из полученного хэша.
  6. Клиент посылает цифры на сервер.
  7. Происходит сравнение, если совпало - успех.
  8. При успешной авторизации - происходит инкремент счётчика сервера.
  9. В любом случае - происходит инкремент счётчика клиента.

Рассинхронизация

Допустима ситуация, когда у клиента счётчик больше, чем у сервера. (Т.к. условия инкремента счётчика отличаются). Тогда сервер вычисляет несколько кодов “вперёд” (например, для I+1, I+2, … I+5), и если хоть один из них совпадает - авторизация также проходит успешно. Происходит ресинхронизация, см. ниже детали.

Ресинхронизация

(похожее название).

Если рассинхронизация происходит, то при ресинхронизации (процессе установления счётчиков в одинаковое число) может быть также запрошено согласно стандарту ещё несколько кодов от клиента (чтобы атакующий не мог положиться на “достаточно чтобы мой рандомный код совпал с одним из 6 кодов, а не только с 1”).

После успеха счётчик сервера устанавливается равный счётчику клиента.

Возможные вектора атаки

(to be continued)

Ссылки

  • (для деталей и уточнений) RFC 4226
  • (менее полезное в случае непонимания) ру-вики, en-wiki