TOTP, HOTP
Что такое TOTP⌗
TOTP - для двухфакторной авторизации. Вместо кода на мобильный телефон (считается небезопасным).
Схема работы:⌗
- У клиента и сервера - есть общий секрет.
- У клиента и сервера - синхронизированы часы.
- Когда нужно авторизоваться, сервер вычисляет HASH(T+SECRET). T - это количество интервалов времени (например 30-секундных) с unix epoch.
- Клиент тоже считает HASH(T+SECRET).
- Клиент и сервер берут определённым общеизвестным способом первые цифры от хэша.
- Клиент передаёт серверу токен, сервер делает сравнение.
Возможные уязвимости/проблемы:⌗
- Может утечь общий секрет, как со стороны клиента, так и со стороны сервера. С кодами на мобильный телефон именно этого не может произойти, к слову.
- Можно перехватить одноразовый ключ.
- Может произойти рассинхрон времени: тогда нельзя будет авторизоваться.
Опенсорсные приложения для Android для TOTP.⌗
Из лучших, рекомендуют
- Aegis (посмотрел, выглядит нормально, есть какая-то защита).
- freeOTP+ (пока не смотрел, форк freeOTP).
ещё смотрел
Зачем⌗
Гитхаб требует начать использовать двухфакторку от отдельных аккаунтов.
Что такое HOTP⌗
(2025-07-12)
Эта схема стала предшественником TOTP.
Схема работы:⌗
- У клиента и сервера - общий секрет SECRET.
- У клиента и сервера - общий счётчик I.
- Когда нужно авторизоваться, сервер вычисляет HASH(SECRET, I). HASH - описывается что SHA1, хотя и считается уязвимым к коллизиям.
- Клиент вычисляет HASH(SECRET, I).
- Клиент и сервер выделяют общеизвестным способом цифры (6-8 цифр) из полученного хэша.
- Клиент посылает цифры на сервер.
- Происходит сравнение, если совпало - успех.
- При успешной авторизации - происходит инкремент счётчика сервера.
- В любом случае - происходит инкремент счётчика клиента.
Рассинхронизация⌗
Допустима ситуация, когда у клиента счётчик больше, чем у сервера. (Т.к. условия инкремента счётчика отличаются). Тогда сервер вычисляет несколько кодов “вперёд” (например, для I+1, I+2, … I+5), и если хоть один из них совпадает - авторизация также проходит успешно. Происходит ресинхронизация, см. ниже детали.
Ресинхронизация⌗
(похожее название).
Если рассинхронизация происходит, то при ресинхронизации (процессе установления счётчиков в одинаковое число) может быть также запрошено согласно стандарту ещё несколько кодов от клиента (чтобы атакующий не мог положиться на “достаточно чтобы мой рандомный код совпал с одним из 6 кодов, а не только с 1”).
После успеха счётчик сервера устанавливается равный счётчику клиента.
Возможные вектора атаки⌗
(to be continued)