Что такое биты стойкости и почему они важнее длины

Надёжность пароля — это не то, сколько в нём разных значков. Это сколько разных паролей могла выдать та же кнопка. Если генератор умеет выдать миллион вариантов, миллион и переберут. Если 36 квадриллионов — не переберут.

Эту величину принято измерять в битах. Один бит — это удвоение количества вариантов. Отсюда всё остальное.

Один бит — это удвоение

БитВариантовЭто как
12монетка
38три монетки
101 024одно слово из нашего короткого словаря
112 048одно слово из основного словаря
224 194 304два слова
338,6 миллиардатри слова
4417,6 триллионачетыре слова
5536 квадриллионовпять слов
6674 квинтиллионашесть слов

Обратите внимание на скорость роста. Каждое новое слово умножает количество вариантов на 2048 — это прибавка сразу в 11 бит. Ни один добавленный значок так не работает.

Что добавляет биты, а что только кажется

Возьмём пароль из четырёх слов и посмотрим, что даёт каждое «улучшение», которое обычно предлагают генераторы.

Что делаем Прибавка Почему именно столько
Добавить пятое случайное слово +11 бит Генератор выбирает из 2048 слов: log₂(2048) = 11
Две случайные цифры в случайном месте +9 бит 100 вариантов числа (6,6 бита) и 5 мест, куда его вставить (2,3 бита)
Символ в случайном месте внутри +8 бит 9 символов (3,2 бита) и около 25 позиций (4,6 бита)
Тот же символ, но всегда в конце +3 бита Место известно, остаётся только выбор символа. И это первое, что пробуют правила подбора
Заглавная в начале каждого слова 0 бит Правило постоянное. Новых вариантов не появляется — подбор применит то же правило
Выбрать разделитель: дефис или подчёркивание 0 бит Это ваша настройка. Случайности в ней нет
Заменить o на 0, a на @ 0 бит Стандартное правило в любой программе подбора. Ввод при этом усложняется
Восклицательный знак в конце 0 бит Если он там всегда — это часть схемы, а не случайный выбор
Вставить имя клиента вместо случайного слова −11 бит Место случайного слова занято известным. Тот, кто знает клиента, попробует его имя первым
Убрать похожие символы l 1 I O 0 небольшой минус Алфавит сокращается. Осознанная плата за то, что пароль не перепутают при чтении с листка

Главный вывод

Если хочется надёжнее — добавьте слово, а не значок. Одно слово даёт больше, чем заглавные буквы, спецсимвол и leet-замены вместе взятые. При этом набирать его проще, чем искать # на экранной клавиатуре телевизора.

Сколько бит достаточно

Зависит от того, как хранит ваш пароль тот сервис, которому вы его доверили. Разброс огромный: между хорошей защитой и плохой — шесть порядков по скорости подбора.

Слов Бит bcrypt
хорошая защита
Wi-Fi
8 видеокарт
MD5
устаревшая защита
333 9 часов4 минуты20 мс
444 2 года5 дней40 секунд
555 4 тыс. лет28 лет23 часа
666 8 млн лет58 тыс. лет5 лет
777 17 млрд лет118 млн лет11 тыс. лет

Время до попадания в среднем: перебрать надо примерно половину вариантов. Скорости взяты из опубликованных измерений — откуда именно.

Из этой таблицы следуют три вещи, которые стоит запомнить.

Четыре слова — это мало. Против современной защиты держится два года, против устаревшей — сорок секунд. А вы не можете знать, какая защита у сервиса: об этом не пишут.

Пять слов — рабочий минимум. Против bcrypt это четыре тысячи лет. Даже против MD5 — почти сутки, чего хватит, чтобы утечка стала известна и пароль успели сменить.

Wi-Fi — особый случай, и он хуже, чем кажется. Смотрите на средний столбец: он строже, чем bcrypt. Перехватив обмен с точкой доступа, пароль подбирают локально, никто не мешает и не ограничивает попытки. Поэтому пароль от Wi-Fi нужен сильнее обычного — хотя вводить его труднее всего.

Почему Password1! — это почти ноль бит

Посчитаем формально. Десять символов, есть заглавная, строчные, цифра и знак. Алфавит около 94 символов, значит 10 × log₂(94) ≈ 66 бит. Больше, чем у пароля из пяти слов.

И это неверно. Формула работает только для случайной строки. Password1! случайной не является: она стоит в первых строках каждого словаря утечек, и подбор начинается именно с неё. Реальная стойкость измеряется не длиной, а тем, на каком месте пароль окажется в списке перебора. У Password1! это место — первая тысяча.

То же касается всего похожего:

  • Qwerty2024! — клавиатурная последовательность плюс год
  • Ivan1985 — имя плюс дата рождения
  • P@ssw0rd — замены букв на похожие символы, первое правило в любой программе подбора
  • Лето2024 — слово плюс год, только в другой раскладке

Все эти пароли выглядят сложными для глаза и не являются сложными для компьютера. Это ключевая разница, из-за которой мы вообще показываем биты, а не звёздочки: звёздочки оценивают внешний вид, биты — количество вариантов.

Как это формулирует 1Password

«Стойкость системы создания паролей — не в том, сколько в итоге получилось букв, цифр и символов, а в том, сколькими способами эта же система могла бы дать другой результат».

Почему мы показываем биты честно, а не оптимистично

Одно и то же число бит можно посчитать двумя способами, и разница между ними в разы.

Первый способ: атакующий знает, что пароль сделан нашим генератором, знает словарь и схему. Тогда для пяти слов и двух цифр это 59 бит.

Второй способ: атакующий видит только строку morkov-lampa-tuchka-veslo-47 и перебирает символы по алфавиту, который в ней видит. Тогда получается около 145 бит.

На главной мы показываем первое число — то, которое меньше. Потому что предполагать, будто атакующий не знает про существование словарных паролей, наивно: словари для подбора passphrase существуют давно и доступны всем. Второе число тоже показываем, но подписью и вторым, а не главной цифрой.

Это же соображение объясняет, почему мы спокойно публикуем словарь целиком. Расчёт бит уже исходит из того, что словарь известен. Скрывать его — значит завышать оценку стойкости, то есть врать.

Как мы считаем риск ошибки при передаче

Пароль почти никогда не набирают из головы. Его читают с листка, слышат по телефону, переписывают из письма. На каждом шаге можно ошибиться, и цена ошибки всегда одна: «пароль не подходит», без указания, где именно опечатка.

Мы считаем не символы, а части передачи — то, что человек называет и воспринимает как одно целое.

Часть Шанс ошибки Почему
Слово из словаря 0,5 % Слово узнаётся целиком. В нашем словаре нет пар, отличающихся одной буквой — «морковь» невозможно услышать как другое слово из списка
Двузначное число 1 % Называется одним словом: «сорок семь»
Обычный символ 2 % Приходится называть по алфавиту связи
Путаемый символ 6 % l и 1, O и 0, s и 5, m и n — на слух и в рукописи различаются плохо

Вероятности — оценка, а не измеренная статистика. Мы не проводили исследование на людях. Но соотношение между способами эта оценка передаёт верно, и именно соотношение важно для выбора.

Считаем вероятность передать всё без единой ошибки, перемножая шансы по частям. Получается так:

Пароль Бит Частей Риск ошибки
morkov-lampa-tuchka-veslo-47 495 3 %
Kj7#pQ2$vL9 7211 32 %
PIN 739284 206 25 %

Обратите внимание: это единственное, в чём словесный пароль выигрывает. По количеству нажатий он проигрывает — 49 бит за 28 символов против 72 бит за 11. Обещать «меньше нажатий» было бы неправдой, и мы этого не обещаем.

Но если пароль нужно продиктовать клиенту по телефону, записать в акт передачи или набрать пультом на телевизоре — выигрыш в надёжности передачи важнее нескольких лишних нажатий. Если пароль вставляется через буфер обмена — берите случайные символы, они короче и стойче.

Дальше