Опубліковано: · Оновлено: · автор: kodewright
Що таке брутфорс-атака: види, математика і захист
Брутфорс-атака підбирає паролі, доки один не спрацює. Чим відрізняються її різновиди, чому довжина важливіша за складність і що реально захищає.

Брутфорс-атака (атака повним перебором) — це будь-яка атака, що раз за разом підбирає секрет (пароль, PIN-код, ключ шифрування), доки одна зі спроб не пройде. Жодної вразливості тут не потрібно. Атакувальнику вистачає способу перевіряти здогадки і часу, тому весь захист зводиться до двох чисел: скільки спроб за секунду він може зробити і скільки спроб знадобиться саме для вашого пароля.
Обидва числа відрізняються на багато порядків, тож на питання «чи витримає мій пароль брутфорс» єдиної відповіді немає.
П'ять атак, які називають брутфорсом
Підручникова версія перебирає aaaa, aaab, aaac і так далі через усі комбінації. Проти паролів так майже ніхто не робить, бо люди обирають паролі зовсім не рівномірно. Різновиди, з якими ви зіткнетеся насправді:
| Різновид | Що підбирають | Типова ціль |
|---|---|---|
| Повний перебір | Усі комбінації до певної довжини | Короткі випадкові секрети: PIN-коди, 6-символьні коди, слабкі ключі |
| Атака за маскою | Комбінації за шаблоном, напр. Ulllllldd (велика літера, шість малих, дві цифри) | Паролі, складені під вимоги «велика літера + цифра» |
| Словник із правилами | Паролі з витоків і слова, кожне змінене тисячами способів | Будь-який пароль, який вигадала людина |
| Password spraying | Кілька найпоширеніших паролів проти багатьох акаунтів | Корпоративні входи, VPN, тенанти Microsoft 365 |
| Credential stuffing | Справжні пари email і пароль, що витекли з іншого сайту | Усі, хто використовує один пароль у кількох місцях |
Перші три — переважно офлайн-проблема: в атакувальника є копія хешів паролів, і він перебирає варіанти на власних GPU. Spraying і stuffing працюють онлайн, через справжню сторінку входу, тому їх будують так, щоб не впертися в ліміти. Spraying надсилає одну-дві спроби на акаунт і йде далі, тож блокування акаунта ніколи не спрацьовує. Stuffing узагалі нічого не вгадує: пароль уже відомий із чужого витоку.
Цей поділ важливіший за назву. Довгий випадковий пароль захищає від офлайн-варіантів, а від credential stuffing рятує лише унікальний пароль.
Онлайн-підбір обмежений, офлайн-злам — ні
Коли атака йде через живу форму входу, швидкість визначає сервер. NIST SP 800-63B (Rev. 4) вимагає, щоб сервіс обмежував кількість невдалих спроб поспіль для одного акаунта сотнею, а більшість додає ліміти за IP, затримки чи CAPTCHA значно раніше. За таких умов навіть посередній пароль переживе звичайний підбір, і саме тому онлайн-атакувальники перейшли на spraying і stuffing.
Офлайн між атакувальником і хешами немає сервера. Щойно база хешів витекла, обмеження лише одне: залізо і хеш-функція, яку обрав сайт. Бенчмарки hashcat на одній RTX 4090:
| Як збережено | Спроб за секунду (одна RTX 4090) |
|---|---|
| MD5 | ~164 млрд |
| SHA-256 | ~22 млрд |
| bcrypt, cost 10 | ~5,750 |
Це цифри hashcat 6.2.6, а атакувальники орендують ферми з вісьмома такими картами. Різниця між першим і останнім рядком пояснює, чому спосіб зберігання паролів важить не менше за сам пароль. Детальніше, зокрема про scrypt і Argon2id, у статті що таке bcrypt і чому MD5 мертвий.
Довжина важливіша за складність: математика
Для випадкового пароля обсяг роботи атакувальника в найгіршому випадку дорівнює розміру простору пошуку:
combinations = R ^ L
entropy H = L × log₂(R)
R = number of possible characters (26 lowercase, 62 alphanumeric, 95 printable ASCII)
L = length
Тут R — кількість можливих символів (26 малих літер, 62 букви з цифрами, 95 друкованих символів ASCII), а L — довжина. Вимоги до складності змінюють R. Довжина змінює L, тобто показник степеня. Візьмімо за основу 8-символьний пароль із малих літер (26⁸, приблизно 2,1 × 10¹¹ комбінацій):
| Зміна | Комбінацій | Множник | Повний перебір, MD5, одна RTX 4090 |
|---|---|---|---|
| 8 малих літер (основа) | 2.1 × 10¹¹ | 1 | 1.3 секунди |
| 8 літер і цифр | 2.2 × 10¹⁴ | ~1,000 | 22 хвилини |
| 8 друкованих ASCII | 6.6 × 10¹⁵ | ~31,800 | 11 годин |
| 12 друкованих ASCII | 5.4 × 10²³ | ~2.6 × 10¹² | 104,000 років |
Великі літери, цифри і спецсимволи у 8-символьному паролі дають множник близько 31 800. Ще чотири символи зверху множать результат на 81 мільйон. Різноманітність символів допомагає, але це менший важіль. Повну таблицю для різних довжин і хешів дивіться у статті скільки часу потрібно, щоб зламати пароль.
Чому «P@ssw0rd!» однаково падає за секунди
Уся ця математика працює лише для випадкових паролів. Людські паролі не випадкові, тож атакувальники не перебирають увесь простір. Вони стартують зі словників на кшталт збірки RockYou2024 (2024 рік, майже 10 мільярдів рядків зі старих витоків) і застосовують файли правил: велика перша літера, @ замість a, 0 замість o, рік або ! у кінці. P@ssw0rd! має дев'ять символів і всі чотири класи символів, а стоїть на початку кожного словника.
У цьому і слабкість вимог до складності. Вони підштовхують людей до передбачуваних шаблонів (велика літера на початку, цифри й символ у кінці), а атаки за маскою створені саме під такі шаблони. Пароль перестає бути передбачуваним лише тоді, коли в ньому немає жодної закономірності, а на практиці це означає, що його обрав генератор.
Як захистити від брутфорсу власну форму входу
Якщо ви розробляєте або підтримуєте форму входу, захист прямо відповідає різновидам атак вище:
- Обмежуйте частоту запитів і за акаунтом, і за джерелом. Ліміти на акаунт зупиняють класичний підбір, ліміти за IP та ASN сповільнюють spraying. Затримки, що зростають, зручніші за жорстке блокування, бо блокування дозволяє будь-кому навмисно заблокувати відомого користувача.
- Перевіряйте нові паролі за списками витоків. NIST вимагає звіряти пароль зі списком поширених і скомпрометованих паролів. API діапазонів Have I Been Pwned дає змогу перевірити пароль, надіславши лише перші п'ять hex-символів його SHA-1-хешу.
- Зберігайте паролі через повільну KDF із сіллю. Argon2id, scrypt або bcrypt з cost від 10, як радить OWASP Password Storage Cheat Sheet. Це єдиний захист, що працює і після витоку бази. Різні значення cost можна спробувати в Генераторі bcrypt.
- Пропонуйте MFA, найкраще passkey (ключі доступу). Правильний пароль зі списку для stuffing нічого не дасть без другого фактора.
Перші два пункти я вважаю мінімумом для будь-якого публічного входу, а третій не обговорюється.
Якої довжини має бути ваш пароль
NIST SP 800-63B Rev. 4 встановлює мінімум 15 символів, коли пароль — єдиний фактор, і 8, коли він працює разом з MFA. Для згенерованого випадкового пароля 15 друкованих символів — це близько 98 біт ентропії, далеко за межами можливостей будь-якої офлайн-ферми. Для всього, що лежить у менеджері паролів, я б просто брав 16–20 випадкових символів: ви їх однаково не вводите вручну.
Генератор паролів складає такі паролі через crypto.getRandomValues(), а не Math.random(), внутрішній стан якого можна відновити з кількох значень. Він працює повністю у вашому браузері, тож пароль не потрапляє на жоден сервер. Щоб побачити, наскільки тримається наявний пароль, вставте його в Перевірку стійкості пароля, і якщо ви вигадали його самі, сприймайте показаний час зламу як верхню межу.
FAQ
Що таке брутфорс-атака?
Систематичний підбір секрету, доки одна зі спроб не спрацює. Чиста версія перебирає всі комбінації, але реальні атаки на паролі починаються зі словників витоків і правил змін, а до повного перебору доходять лише для коротких або випадкових секретів.
Чому довжина пароля важливіша за складність?
Бо простір пошуку дорівнює R ^ L. Перехід від 26 до 95 можливих символів — одноразовий множник близько 31 800 для 8-символьного пароля. Кожен додатковий символ множить увесь простір ще на 95, тож чотири символи додають множник приблизно 81 мільйон.
Як швидко GPU може підібрати пароль?
На одній RTX 4090 — близько 164 млрд спроб за секунду проти MD5 і близько 5 750 проти bcrypt з cost 10 (hashcat 6.2.6). Це стосується лише офлайн-атаки, після витоку бази хешів. Через форму входу з обмеженням частоти атакувальник отримує кілька спроб за секунду, а NIST обмежує кількість невдалих спроб на акаунт сотнею.
Чим брутфорс відрізняється від password spraying і credential stuffing?
Брутфорс спрямовує багато спроб на один акаунт. Spraying спрямовує один-два поширені паролі (Winter2026!, Password1) на тисячі акаунтів, щоб жоден не досяг ліміту блокування. Credential stuffing (підстановка викрадених облікових даних) підставляє пари email і пароль з інших витоків, тому спрацьовує з першої спроби в кожного, хто повторно використав пароль.