Багатофакторна автентифікація (MFA) - вхід вимагає доказів з різних категорій:
- те, що ви знаєте - пароль, PIN;
- те, що ви маєте - телефон із застосунком, апаратний ключ;
- те, чим ви є - відбиток пальця, обличчя (зазвичай як розблокування пристрою).
Два паролі - не два фактори: обидва з однієї категорії й крадуться однаково.
Навіщо: паролі масово витікають і повторно використовуються. З другим фактором викрадений пароль сам по собі не дає доступу. За даними великих провайдерів, MFA зупиняє переважну більшість автоматизованих атак на облікові записи.
Види другого фактора - від слабшого до сильнішого:
- SMS-коди - краще, ніж нічого, але вразливі: перевипуск SIM-картки (SIM swap) через оператора, перехоплення, фішинг коду;
- email-коди - залежать від безпеки пошти;
- TOTP (Google Authenticator, 1Password, Authy) - код з 6 цифр, що змінюється кожні 30 секунд. Обчислюється на пристрої з спільного секрету й поточного часу (RFC 6238) - не передається мережею, не залежить від оператора;
- push-підтвердження - зручно, але вразливе до «втоми від сповіщень» (зловмисник надсилає десятки запитів, поки користувач не натисне «Так»). Захист - введення числа з екрана входу;
- апаратні ключі й passkeys (WebAuthn) - стійкі до фішингу, бо прив'язані до домену сайту.
Чому TOTP кращий за SMS: код генерується локально, його не можна отримати через оператора; працює без мережі. Але TOTP не захищає від фішингу: фальшивий сайт попросить і пароль, і поточний код, і миттєво використає їх.
Обов'язкові частини реалізації:
- резервні коди на випадок втрати телефону - одноразові, зберігаються хешованими;
- захищене відновлення доступу - найслабше місце MFA: якщо «втратив телефон» вирішується одним листом, атакують саме його;
- обмеження спроб введення коду (6 цифр - лише мільйон варіантів);
- код діє один раз у своєму вікні часу;
- повторне підтвердження перед вимкненням MFA чи зміною пошти.
У Laravel двофакторна автентифікація з TOTP і резервними кодами є в Laravel Fortify і стартових наборах.
Докладніше в документації: OWASP: багатофакторна автентифікація