TOTP (Time-based One-Time Password)¶
TOTP (Time-based One-Time Password) — алгоритм генерації одноразових паролів на основі поточного часу та спільного секрету (RFC 6238), що є основою більшості застосунків двофакторної автентифікації.
Опис¶
TOTP є розширенням алгоритму HOTP (RFC 4226), де замість лічильника використовується поточний часовий відрізок (зазвичай 30 секунд). Обидві сторони — сервер та пристрій користувача — знають спільний секрет і можуть незалежно обчислити однаковий 6-значний код без мережевої взаємодії.
Алгоритм:
1. Часовий крок T = floor(Unix timestamp / 30)
2. HMAC-SHA1 від спільного секрету та T
3. Dynamic truncation: взяти 4 байти з HMAC-результату
4. Взяти останні 6 цифр (modulo 10⁶)
Код дійсний 30 секунд. Для компенсації розбіжності годинників сервери зазвичай приймають ±1 крок (тобто ±30 секунд від поточного часу).
Спільний секрет передається одноразово при першому налаштуванні у вигляді QR-коду (URI-формат otpauth://) або Base32-рядка. Секрет зберігається в зашифрованому сховищі застосунку-автентифікатора (Google Authenticator, Aegis, Bitwarden TOTP).
З точки зору безпеки TOTP захищає від атак підбору пароля та перехоплення статичних credentials, але не від фішингу в реальному часі (MITM, що перехоплює і миттєво використовує код) та від компрометації пристрою. Для захисту від фішингу рекомендуються апаратні ключі FIDO2/WebAuthn. Проте для внутрішніх корпоративних систем TOTP є значно кращою альтернативою, ніж відсутність другого фактора.
В контексті UMTC¶
MAS (Matrix Authentication Service) підтримує TOTP як другий фактор автентифікації для адміністраторів Wiki та операторів Matrix. Налаштування через Element або веб-інтерфейс MAS.
Рекомендований застосунок для UMTC-персоналу: Aegis Authenticator (Android, відкритий код) з резервним копіюванням у зашифрований файл.
Перевірка TOTP у типовому Python-сервісі:
import pyotp
def verify_totp(secret: str, user_code: str) -> bool:
totp = pyotp.TOTP(secret)
# valid_window=1 дозволяє ±1 крок (±30 сек)
return totp.verify(user_code, valid_window=1)
# Генерація URI для QR-коду
def generate_totp_uri(secret: str, username: str) -> str:
totp = pyotp.TOTP(secret)
return totp.provisioning_uri(
name=username,
issuer_name="UMTC Wiki"
)
Для командного рядка перевірка коду:
# oathtool (Linux)
oathtool --totp --base32 "JBSWY3DPEHPK3PXP"
Пов'язані терміни¶
- oauth2 — OAuth 2.0 / MAS є рівнем, де TOTP застосовується як другий фактор
- matrix — Matrix Element підтримує TOTP для входу в акаунт
- synapse — Synapse делегує автентифікацію (включно з TOTP) до MAS
Посилання¶
- RFC 6238 — TOTP — специфікація алгоритму
- RFC 4226 — HOTP — базовий алгоритм, що розширює TOTP
- Aegis Authenticator — рекомендований застосунок для Android
Шлях: glossary/totp.md