Коли ви скануєте QR-код у Google Authenticator чи подібному застосунку, він починає показувати шестизначний код, що змінюється кожні 30 секунд — і це працює навіть без інтернет-з'єднання на телефоні. TOTP (Time-based One-Time Password) робить це можливим завдяки простій, але елегантній ідеї.
Спільний секрет плюс час
Під час налаштування сервер і застосунок-автентифікатор обмінюються одним спільним секретним ключем (саме його закодовано у QR-коді). Далі обидві сторони незалежно обчислюють HMAC від цього секрету й поточного unix-часу, округленого до 30-секундного інтервалу — і отримують однаковий код, не спілкуючись одна з одною.
Чому це працює без інтернету
Оскільки код обчислюється локально з секрету й системного часу пристрою, застосунку-автентифікатору не потрібне мережеве з'єднання для генерації коду. Єдина вимога — щоб годинники сервера й телефону були синхронізовані в межах невеликого допустимого відхилення (зазвичай ±30–60 секунд).
Чому код змінюється кожні 30 секунд
Короткий часовий інтервал обмежує вікно, протягом якого перехоплений код залишається дійсним, знижуючи ризик його повторного використання зловмисником. Сервер зазвичай приймає поточний і один попередній інтервал, щоб компенсувати невелику затримку мережі при введенні коду.
Навіщо це потрібно
- Розуміти механіку двофакторної автентифікації при налаштуванні або діагностиці проблем із застосунками-автентифікаторами.
- Тестувати власну реалізацію TOTP при розробці системи автентифікації.
- Генерувати коди для автоматизованого тестування без ручного введення з телефону.
Чого TOTP не захищає
TOTP надійно захищає від крадіжки пароля окремо від коду, але не від фішингу в реальному часі: якщо жертва вводить і пароль, і поточний TOTP-код на підробленому сайті, зловмисник може миттєво використати обидва значення на справжньому сайті, поки код ще дійсний. Від такої атаки захищають лише апаратні ключі за стандартом FIDO2/WebAuthn, які криптографічно прив'язані до конкретного домену.