Криптография: практика
Вычеркнутые вопросы перенесены в FAQ
Парольную фразу какой длины имеет смысл использовать в программах шифрования?
Многие программы используют стандарт PBKDF2, который обеспечивает замедление атак словарного перебора, за счёт многократного хэшированию с солью. Многократное хэширование даёт замедление проверки каждого пароля. Т.н. "соль" (случайно сгенерированная открытая строка) используется для предотвращения использования заранее просчитанных таблиц ключей из паролей.
Если даже не рассматривать эти меры противодействия словарным атакам, то для самых консервативных оценок нужно исходить из 128-битной стойкости пароля.
Т. е. pn должно быть примерно равно 2128, где p — количество символов во множестве для случайного выбора, из которого составлен пароль, n — длина пароля.
Например 2727 ≈ 2128 — если можно запомнить абсолютно случайный набор из двадцати шести букв с клавиатуры + пробел, длиной также из 27 символов.
Энтропию одного символа можно посчитать, решив уравнение 2x=N, где N это количество символов в алфавите:
x = log2(N) = ln(N)/ln(2)
Умножив эту величину на количество символов в пароле, легко рассчитать его общую энтропию.
На практике проще всего запомнить 10 случайно выбранных слов из специально подготовленных словарей коротких слов Diceware, что даст 128-битный уровень. Слова можно связать во фразу для лёгкого запоминания, главное не использовать известные фразы, не подгонять порядок слов под естественный.
Для оптимизации простоты запоминания можно уменьшать число слов, но увеличивать число дополнительных символов, сверяя получаемое значение энтропии пароля с формулой.
См. также Современная техника взлома паролей, Выбор и защита паролей, Фонетический пароль
http://www.citycat.ru/iq/mnemo.html
http://www.remember-all.ru/
http://mnemotexnika.narod.ru/uchebnik.htm
комментариев: 9796 документов: 488 редакций: 5664
100 слов? По словарю Diceware (из 7776 слов)? Это же 960 бит энтропии.
А 100 символов из 71 печатных — 615 бит
А 100 символов из 27 (лат буквы и пробел) — 475 бит.
Может всё-таки 10 слов?
комментариев: 9796 документов: 488 редакций: 5664
Воспользуйтесь любым методом создания пароля на основании равновероятного случайного выбора из алфавита, печатных символов, слогов (фонетический пароль), слов словаря, любых других элементов.
Или придумайте своё правило, как вам удобнее запоминать.
Только представьте, что само это правило известно противнику, можете его хоть опубликовать в своём бложике. Затем рассчитайте энтропию при заданном числе элементов и генерируйте пароли по этому правилу нужной стойкости (128 бит), но не отступая от принципа равновероятного случайного выбора.
Здесь под символами имелись ввиду альфанумерики, которые оппоненту было проще запомнить визуальной памятью. 220-и таким символам соответствуют 100 Diceware слов.
Всё верно. В своей заметке я пытался продемонстрировать, что ключевой материал может иметь различные представления не утрачивая своей сути.
Это никакого отношения к проблеме не имеет.
Что?
Не всем людям также очевидно, что даже отсечение необходимости брутфорса огромного количества ключевого материала, не включающего хотя бы один спец. символ всё равно "делу" не помогает.
Например, пусть длина пароля 8, обычных символов 64, а специальных 16, тогда
(64 + 16)8 – число паролей из обычных и спецсимволов
648 – число паролей только из обычных символов
( (64 + 16)8 – 648 ) – число паролей хотя-бы с одним спецсимволом
их отношение ( (64 + 16)8 – 648 ) / 648 равно 4.96046448
(если ссылка не сработает, вставьте в гугл ((64+16)^8-64^8)/64^8 или воспользуйтесь другим калькулятором)
Tо есть в данном случае ключевого материала хотя бы с одним спецсимволом будет почти в 5 раз больше, чем вообще без спецсимволов. Увеличение длины пароля или числа (даже относительного) спецсимволов только "усугубляет" ситуацию.
(32^(8 + 1)) / ((32 + 16)^8) = 1.24859015
(26^(8 + 1)) / ((26 + 16)^8) = 0.560745515
(26^(12 + 1)) / ((26 + 16)^12) = 0.0823497033
(32^(12 + 1)) / ((32 + 16)^12) = 0.246635092
(42^(11 + 1)) / ((42 + 16)^11) = 1.20582298
(42^(12 + 1)) / ((42 + 16)^12) = 0.873182157
(52^(12 + 1)) / ((52 + 16)^12) = 2.0793927
(62^(18 + 1)) / ((62 + 16)^18) = 0.994807961
(64^(18 + 1)) / ((64 + 16)^18) = 1.1529215
8, 11, 12, 18 – длины паролей
16 – число спецсимволов
26 – число строчных букв латинского алфавита
32 – то же для русского
42 = 32+10 – плюс цифры
52 = 26+26 – прописные и строчные латинские
62 = 52+10 – плюс цифры
64 = 32+32 – прописные и строчные русские
Желающие проверить могут вставит то что до знака равенства в гугл (он, оказывается, ещё и калькулятор! :)
То, что обязательное включение в пароль специального символа не сокращает область поиска, при условии знания противника об этом действии?
То, что вводить и читать специальный символ (а то и не один в 21 символьном пароле) проще, чем добавить к паролю один обычный альфанумерик?
Нет, ничего этого ваши рассуждения не опровергают. И для чего, спрашивается, вы их тут написали?
Нет. Но иногда встречается ограничение на длину пароля.
Чтобы большему числу людей стало понятно, что к чему.
Каким образом? Вопрос, напомню, поставлен так: злоумышленник пытается подобрать пароль с использованием специальных значков; если ему к тому же известно то, что хитрый защищающийся обязательно добавляет хотя бы один специальный значок, то все пароли без значков отсекаются ещё до проверки.
Что даёт хитроумное добавление значка? В худшем случае ослабление пароля, в лучшем затруднение при использовании.
Верный способ компенсировать "ослабление" пароля из-за отсутствия значков? Увеличить его длину на один символ.
Неверный способ? Заменить один из символов на специальный значок.
Ограничение на длину пароля это абсурд, ибо в системах аутентификации всё равно хранится хэш-сумма, а в системах шифрования, где пароль преобразовывается в ключ, ограничивать длину пароля нет причин. Если где-то установлено ограничение на длину пароля, это повод пересмотреть выбор провайдера услуг, а не прибегать к хитроумному обману самого себя.
По законам арифметики. Можете посчитать сами и убедиться.
Спецсимволов в действительности как минимум 30: ~!@#$%^&*()_+`-={}[]:";'<>?,./
Если брать любимые вами альфанумерики (большие и малые латинские + цифры) то это худший случай наступает только при длине пароля равном одному символу (поскольку да, 30 < 62)
Но если пароль будет длиною хотя-бы 2 символа, уже получится некоторый выигрыш:
( (62 + 30)^2 – 62^2 ) / 62 ^ 2 = 1.20187305
С увеличением длины пароля разница становится более заметной:
( (62 + 30)^6 – 62^6 ) / 62 ^ 6 = 9.67521983
( (62 + 30)^8 – 62^8 ) / 62 ^ 8 = 22.5054788
( (62 + 30)^10 – 62^10 ) / 62 ^ 10 = 50.7560804
( (62 + 30)^12 – 62^12 ) / 62 ^ 12 = 112.960318
( (62 + 30)^14 – 62^14 ) / 62 ^ 14 = 249.926154
...
( (62 + 30)^21 – 62^21 ) / 62 ^ 21 = 3 973.83307
...
Как видите, при реальных длинах пароля замедление перебора получается как минимум в десятки раз.
Да, (для кого-то) это будет счёт некоторого затруднения использования. Стоил ли – каждый пусть решает для себя. Кому-то трудно запоминать спецсимволы, а некоторые просто запоминают расположение клавиш и нажатие shift'а :)
Услуги иногда бывают уникальны. А иногда человек бывает связан услугой много лет, получает за это существенные преимущества (игры, социальные сети) и переход на аналог обернётся весьма существенной потерей.